Автор: Alex Zolotov (NightRadio)
Форк: ZUF
Аниматор с оригинальным и минималистичным интерфейсом.
//PIXI ANIMATOR xsize = 240 ysize = 320 hx = xsize / 2 hy = ysize / 2 gui = new_array( 8*48 ) g_frames_num =10 g_xsize = 15 g_ysize = 15 resize_pixi( 0, xsize, ysize ) new_project: clear(BLACK) new_proj_ok = 0 WINDOW_NAME = "New project" //Create project: g_anim = new_pixi( g_xsize, g_ysize, g_frames_num ) g_copy = new_pixi( g_xsize, g_ysize, 1 ) g_undo = new_pixi( g_xsize, g_ysize, 1 ) g_undo_frame = 0 g_clip_img = new_pixi( 16, 16, 1 ) pixi_transp( g_clip_img, 0, 0 ) size = g_xsize * g_ysize * g_frames_num p = 0 while( p < size ) { g_anim[ p ] = WHITE p + 1 } pixi_transp( g_anim, 0, 0 ) g_cur_frame = 0 g_zoom = 1 g_color = BLACK g_play = 0 g_prev_frame_transp = 64 redraw_full = 1 clip = 0 vertical_mirror = -1 horizontal_mirror = -1 WINDOW_NAME = "" CLEAR_GUI x = -hx + 1 y = -hy + 25 xs = 8*4+2 ys = 16 t = "COPY" h = { p = g_cur_frame * g_xsize * g_ysize p2 = p + g_xsize * g_ysize p3 = 0 while( p < p2 ) { g_copy[ p3 ] = g_anim[ p ] p + 1 p3 + 1 } } GUI_BUTTON y + ys+1 t = "PAST" h = { SAVE_UNDO p = g_cur_frame * g_xsize * g_ysize p2 = p + g_xsize * g_ysize p3 = 0 while( p < p2 ) { g_anim[ p ] = g_copy[ p3 ] p + 1 p3 + 1 } redraw_full = 1 } GUI_BUTTON y + ys+1 t = "PLAY" h = { if g_play = 0 { start_timer( 0 ) } g_play = g_play ^ 1 } GUI_BUTTON y + ys+1 t = "SAVE" h = { ANIM_FILENAME = "..........................................................................................................................................................................." if file_dialog( ANIM_FILENAME, "Save to GIF", "gif", "pixianimator_sgif" ) { ANIM_PIXI = g_anim ANIM_ZOOM = g_zoom ANIM_SAVE redraw_full = 1 } } GUI_BUTTON y + ys+8 t = "CLR" h = { SAVE_UNDO p = g_cur_frame * g_xsize * g_ysize p2 = p + g_xsize * g_ysize while( p < p2 ) { g_anim[ p ] = WHITE p + 1 } redraw_full = 1 } GUI_BUTTON y + ys+1 t = "UNDO" h = { MAKE_UNDO } GUI_BUTTON y + ys+1 t = "VMIR" h = { vertical_mirror = -vertical_mirror } GUI_BUTTON /* y + ys+1 t = "HMIR" h = { horizontal_mirror = -horizontal_mirror } GUI_BUTTON */ y + ys+1 t = "NEWF" h = { insert_after=g_frames_num INSERT_FRAME } GUI_BUTTON start: transp( 256 ) dont_draw = 0 HANDLE_WINDOW CTRL = { if drawing_mode = 0 { //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< c = ( hy - gpy ) / 24 sel = 0 if c = 0 { g_zoom = ( gpx + hx ) / 16 if g_zoom <= 0 { g_zoom = 1 } redraw_full = 1 sel = 1 } if ( c = 1 ) & ( d = 1 ) { //SET FRAME NUM: g_cur_frame = ( gpx + g_cur_frame*30 ) / 30 if g_cur_frame < 0 { g_cur_frame = 0 } if g_cur_frame >= g_frames_num { g_cur_frame = g_frames_num - 1 } redraw_full = 1 sel = 1 } if gpy < -hy + 24 { c = (gpx+hx) g_color = get_color( c*2, c*2, c*2 ) redraw_full = 1 sel = 1 } } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if ( d = 1 ) & ( sel = 0 ) & ( gui_el = -1 ) & ( drawing_mode = 0 ) { SAVE_UNDO drawing_mode = 1 } if drawing_mode { //DRAW: px = ( gpx + (g_xsize*g_zoom)/2 ) / g_zoom py = ( gpy + (g_ysize*g_zoom)/2 ) / g_zoom if ( px >= 0 ) & ( py >= 0 ) & ( px < g_xsize ) & ( py < g_ysize ) { g_anim[ g_cur_frame * g_xsize * g_ysize + py * g_xsize + px ] = g_color if (vertical_mirror>0) { g_anim[ g_cur_frame * g_xsize * g_ysize + (py+1) * g_xsize - px ] = g_color } x = ( px * g_zoom ) - ( g_xsize * g_zoom ) / 2 y = ( py * g_zoom ) - ( g_ysize * g_zoom ) / 2 p = g_cur_frame * g_xsize * g_ysize + py * g_xsize + px pf = g_cur_frame - 1 if pf < 0 { pf = g_frames_num - 1 } p2 = pf * g_xsize * g_ysize + py * g_xsize + px c = get_blend( g_anim[ p ], g_anim[ p2 ], g_prev_frame_transp ) if g_zoom >= 3 { fbox( x, y, g_zoom-1, g_zoom-1, c ) if (vertical_mirror>0) { fbox( -x, y, g_zoom-1, g_zoom-1, c ) } } else { redraw_anim = 1 } clip = 1 clip_x = x clip_y = y } } } d = 0 handle_pen_keys( { //DOWN d = 1 }, { //MOVE d = 2 }, { //UP redraw_full = 1 drawing_mode = 0 gui_el = -1 } ) if d > 0 { CTRL } if g_play { fpixi( g_anim, 0, 0, g_zoom, 0, get_timer( 0 ) / 64 ) } if redraw_full { clear( #202020 ) } if redraw_full | redraw_anim { if g_zoom < 3 { fpixi( g_anim, 0, 0, g_zoom, 0, g_cur_frame ) transp( g_prev_frame_transp ) fpixi( g_anim, 0, 0, g_zoom, 0, g_cur_frame-1 ) transp( 256 ) } else { REDRAW_IMAGE } } if redraw_full { line( -hx, hy - 24, hx, hy - 24, WHITE ) print( "ZOOM: $g_zoom", -hx + 2, hy - 24 + 3, BLACK ) print( "ZOOM: $g_zoom", -hx + 1, hy - 24 + 2, WHITE ) x = -hx while( x < hx ) { c = (x+hx) fbox( x, -hy+1, 9, 23, get_color( c*2, c*2, c*2 ) ) x + 9 } fbox( hx - 24, -hy+1, 24, 23, g_color ) fbox( hx - 24, -hy+1, 2, 23, BLACK ) box( hx - 24 + 1, -hy + 1, 22, 22, WHITE ) //TIMELINE: x = -hx while( x < hx ) { box( x + 1, hy - 48 + 1, 28, 22, BLACK ) box( x, hy - 48, 28, 22, WHITE ) f = x / 30 + g_cur_frame transp( 128 ) if g_cur_frame = f { fbox( x, hy - 48, 28, 22, #808080 ) } transp( 256 ) if ( f >= 0 ) & ( f < g_frames_num ) { F=f+1 print( "$F", x + 1 + 1, hy-48+2 + 1, BLACK ) print( "$F", x + 1, hy-48+2, WHITE ) } x + 30 } } if drawing_mode = 0 { dont_handle = 0 HANDLE_WINDOW } if clip = 0 { frame( 0, 0, 0, 0, 0 ) } else { frame( 0, clip_x, clip_y, 16, 16 ) } if clip > 0 { clip - 1 } if redraw_full > 0 { redraw_full - 1 } if redraw_anim > 0 { redraw_anim - 1 } go start REDRAW_IMAGE: cx = -(g_xsize*g_zoom)/2 cy = -(g_ysize*g_zoom)/2 p = g_cur_frame * g_xsize * g_ysize pf = g_cur_frame - 1 if pf < 0 { pf = g_frames_num - 1 } p2 = pf * g_xsize * g_ysize y = 0 yy = cy while( y < g_ysize ) { x = 0 xx = cx while( x < g_xsize ) { c = get_blend( g_anim[ p ], g_anim[ p2 ], g_prev_frame_transp ) fbox( xx, yy, g_zoom-1, g_zoom-1, c ) p + 1 p2 + 1 x + 1 xx + g_zoom } y + 1 yy + g_zoom } ret SAVE_UNDO: p = 0 ap = g_cur_frame * g_xsize * g_ysize size = p + g_xsize * g_ysize p = 0 while( p < size ) { g_undo[ p ] = g_anim[ ap + p ] p + 1 } g_undo_frame = g_cur_frame ret MAKE_UNDO: p = 0 ap = g_undo_frame * g_xsize * g_ysize size = p + g_xsize * g_ysize p = 0 while( p < size ) { aa = g_undo[ p ] g_undo[ p ] = g_anim[ ap + p ] g_anim[ ap + p ] = aa p + 1 } redraw_full = 1 ret // GUI CLEAR_GUI: gui_num = 0 gui_el = -1 gui_tel = -1 K = -1 ret GUI_BUTTON: p = gui_num * 8 gui[ p + 0 ] = x gui[ p + 1 ] = y gui[ p + 2 ] = xs gui[ p + 3 ] = ys gui[ p + 4 ] = t gui[ p + 5 ] = h gui[ p + 6 ] = 0 gui_num + 1 ret GUI_NUMBER: p = gui_num * 8 gui[ p + 0 ] = x gui[ p + 1 ] = y gui[ p + 2 ] = xs gui[ p + 3 ] = ys gui[ p + 4 ] = t gui[ p + 5 ] = h gui[ p + 6 ] = 1 gui[ p + 7 ] = val gui_num + 1 ret HANDLE_WINDOW: d = 0 u = 0 print( WINDOW_NAME, -hx + 2, -hy + 2, WHITE ) if dont_handle = 0 { handle_pen_keys( { //DOWN d = 1 }, { //MOVE }, { //UP u = 1 } ) if K >= 0 { if gui_tel >= 0 { p = gui_tel * 8 tt = gui[ p + 4 ] tt_size = get_string_size( tt ) if K < 10 { tt_p = tt_size - 1 while( tt_p > gui_curs ) { tt[ tt_p ] = tt[ tt_p - 1 ] tt_p - 1 } tt[ gui_curs ] = '0' + K gui_curs + 1 if gui_curs >= tt_size { gui_curs = tt_size - 1 } } if ( K = 10 ) & ( gui_curs > 0 ) { gui_curs - 1 tt_p = gui_curs while( tt_p < tt_size ) { tt[ tt_p ] = tt[ tt_p + 1 ] tt_p + 1 } tt[ tt_size - 1 ] = 0 } val = 0 tt_p = 0 while( tt_p < tt_size ) { if ( tt[ tt_p ] >= '0' ) & ( tt[ tt_p ] <= '9' ) { val * 10 val + tt[ tt_p ] - '0' } tt_p + 1 } gui[p+7] = val handler = gui[p+5] handler } K = -1 } } //dont_handle num = 0 while( num < gui_num ) { p = num * 8 c = #909090 if dont_handle = 0 { if d & gpr( gui[p+0], gui[p+1], gui[p+2], gui[p+3] ) { gui_el = num } if gui_el = num { c = #AAAAAA } if u & gpr( gui[p+0], gui[p+1], gui[p+2], gui[p+3] ) { if gui_el = num { if gui[p+6] = 0 { handler = gui[p+5] handler } //Button gui_el = -1 if gui[p+6] = 1 { gui_tel = num } //Number } } } //dont_handle if dont_draw = 0 { if ( drawing_mode = 0 ) | ( gui_el != -1 ) { fbox( gui[p+0], gui[p+1], gui[p+2], gui[p+3], c ) print( gui[p+4], gui[p+0]+1, gui[p+1]+1, WHITE ) clip = 0 } if gui_tel = num { if ( gui_el >= 0 ) & gpr( gui[p+0], gui[p+1], gui[p+2], gui[p+3] ) { gui_curs = ( gpx - gui[p+0] ) / 8 if gui_curs >= get_string_size( gui[p+4] ) { gui_curs = get_string_size( gui[p+4] ) - 1 } } transp( 128 ) fbox( gui_curs*8 + gui[p+0] + 1, gui[p+1] + 1, 8, 8, WHITE ) transp( 256 ) fbox( gui_curs*8 + gui[p+0] + 1, gui[p+1] + 1 + 8, 8, 2, WHITE ) } } //dont_draw num + 1 } dont_draw = 0 dont_handle = 0 ret //ПОДПРОГРАММА СОХРАНЕНИЯ ВСЕГО МУЛЬТА В ФАЙЛ: //ANIM_PIXI - мульт //ANIM_ZOOM - зум //ANIM_FILENAME - имя файла ANIM_SAVE: xs = get_pixi_xsize( ANIM_PIXI ) ys = get_pixi_ysize( ANIM_PIXI ) video_export_gif( ANIM_FILENAME, -((xs*ANIM_ZOOM)/2), -((ys*ANIM_ZOOM)/2), xs*ANIM_ZOOM, ys*ANIM_ZOOM ) f = 0 while( f < get_pixi_frames(ANIM_PIXI) ) { fpixi( ANIM_PIXI,0,0,ANIM_ZOOM,0,f ) frame( 100 ) f + 1 } stop_video_export ret //insert_after=g_frames_num INSERT_FRAME: //g_frames_num new_anim = new_pixi( g_xsize, g_ysize, g_frames_num+1 ) if insert_after>=get_pixi_frames(g_anim) {insert_after = get_pixi_frames(g_anim)} if insert_after<0 {insert_after = 0} g_frames_num = get_pixi_frames(g_anim)+1 frame_num=0 frame_new_num=0 while (frame_num<g_frames_num) { if (frame_num=insert_after) { // clear inserted frame ny=0 while (ny<g_ysize) { nx=0 while (nx<g_ysize) { // hack: you can make this equations simpler, because you don't need y,y coordinates, only index number for pixel in frame new_anim[ frame_num * g_xsize * g_ysize + ny * g_xsize + nx ] = #ffffff nx+1 } ny+1 } } else { ny=0 while (ny<g_ysize) { nx=0 while (nx<g_ysize) { // hack: you can make this equations simpler, because you don't need y,y coordinates, only index number for pixel in frame new_anim[ frame_num * g_xsize * g_ysize + ny * g_xsize + nx ] = g_anim[ frame_num * g_xsize * g_ysize + ny * g_xsize + nx ] nx+1 } ny+1 } frame_new_num+1 } frame_num+1 } remove_pixi(g_anim) g_anim = new_anim ret
