RetroAvatarsをHSPに移植する(2)
細々と進行中。
前回、いろいろ勘違いしていたところを修正。
中途半端にモジュール化。ばばちい。
"enhanceFace"ちょっとわかってきた。
途中経過(292行)
#define global W 12 #define global H 12 #define global EMPTY_COL 0 #define global SOLID_COL 255 #define global EYES_COL 1 #define global NOSE_COL 2 screen 0, 250, 250 titleStr = "TANINI" size = length(titleStr) dim g, 14, 14 code = 0 randomize(0) repeat 32 code = code + (peek(titleStr,cnt\size)*rnd(3071)\1024) loop randomize(code) R = rnd(3263)\192 + 64 G = rnd(3263)\192 + 64 B = rnd(3263)\192 + 64 color 0, 0, 0 : boxf color 255, 255, 255 *initGraph repeat 14 i = cnt repeat 14 g.i.cnt = EMPTY_COL loop loop *createGraph repeat H, 1 y = cnt repeat W, 1 x = cnt c = 158 if( rnd(3203)\356 > c ){ g.y.x = EMPTY_COL } else { g.y.x = SOLID_COL } loop loop *removeNoise dim xt1, 8 : dim yt1, 8 xt1 = -1, 0, 1, -1, 1, -1, 0, 1 yt1 = -1, -1, -1, 0, 0, 1, 1, 1 dim xt2, 4 : dim yt2, 4 xt2 = 0, 1, 0, -1 yt2 = -1, 0, 1, 0 repeat 4 for y, 1, H+1, 1 for x, 1, W+1, 1 if( g.y.x == EMPTY_COL ){ p = 0 for i, 0, 8, 1 y0 = y+yt1.i : x0 = x+xt1.i p = p + g.y0.x0 next if p >= SOLID_COL*8 { g.y.x = SOLID_COL } if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){ if( g.(x-1).x!=SOLID_COL && g.(x+1).x!=SOLID_COL ){ if ( rnd(3274)\5>2 ){ g.y.x = SOLID_COL } } } if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){ if( g.(x-1).x==SOLID_COL && g.(x+1).x==SOLID_COL ){ if( rnd(3274)\5>2 ){ g.y.x = SOLID_COL } } } } next next for y, 1, H+1, 1 for x, 1, W+1, 1 if( g.y.x == SOLID_COL ){ p = 0 for i, 0, 8, 1 y0 = y+yt1.i : x0 = x+xt1.i p = p + g.y0.x0 next if p <= 0 { g.y.x = EMPTY_COL } } next next loop #module retroAvatars #defcfunc checkForFilledEdge array g0 result = 0 for y, 1, H+1, 1 if( ( EMPTY_COL < g0.y.0 )&&( g0.y.0 < SOLID_COL ) ) : return 1 if( ( EMPTY_COL < g0.y.W )&&( g0.y.W < SOLID_COL ) ) : return 1 next for x, 1, W+1, 1 if( ( EMPTY_COL < g0.0.x )&&( g0.0.x < SOLID_COL ) ) : return 2 if( ( EMPTY_COL < g0.H.x )&&( g0.H.x < SOLID_COL ) ) : return 2 next return 0 #deffunc outlineArea array g0, int col dim xt, 8 : dim yt, 8 xt = 0, 1, 0, -1, -1, 1, -1, 1 yt = -1, 0, 1, 0, -1, -1, 1, 1 for y, 1, H+1, 1 for x, 1, W+1, 1 if( g0.y.x == col ){ for i, 0, 8, 1 y0 = y+yt.i : x0 = x+xt.i if( i < 4 ){ if( g0.y0.x0 != col ) : g0.y0.x0 = 255 } else { if( g0.y0.x0 == 0 ) : g0.y0.x0 = 255 } next } next next return #deffunc mirror array g0 x_sym = 1 y_sym = 0 for y, 1, H+1, 1 for x, 1, W/2+1, 1 p = g0.y.x if( x_sym == 1 ){ x0 = W-x+1 g0.y.x0 = p } next next for y, 1, H/2+1, 1 for x, 1, W+1, 1 p = g0.y.x if( y_sym == 1 ){ y0 = H-y+1 g0.y0.x = p } next next return #deffunc floodFill array g0, int startX, int startY, int col p = g0.startY.startX g0.startY.startX = col dim xt, 8 : dim yt, 8 xt = 0, 1, 0, -1, -1, 1, -1, 1 yt = -1, 0, 1, 0, -1, -1, 1, 1 for i, 0, 8, 1 x = startX + xt.i y = startY + yt.i if( (1 <= x)&&( x <= W ) ){ if( ( 1<=y )&&( y <= H ) ){ if( g0.y.x == p ) : floodFill g0, x, y, col } } next return #global *enhanceFace hx = W/2 eyes = 0 for y, 2, H/2+1,1 x0 = hx-1 if( g.y.x0 == EMPTY_COL ){ floodFill g, x0, y, 1 if( checkForFilledEdge(g) == 0 ){ _break } floodFill g, x0, y, 0 } x0 = hx-2 if( g.y.x0 == EMPTY_COL ){ floodFill g, x0, y, EYES_COL if( checkForFilledEdge(g) == 0 ){ _break } floodFill g, x0, y, EMPTY_COL } next if( y == H/2+1 ){ for y, 2, H+1, 1 x0 = hx-1 if( g.y.x0 == SOLID_COL ){ if( g.y.hx == EMPTY_COL ){ g.y.x0 = EMPTY_COL g.y.hx = SOLID_COL y0 = y+1 g.y0.x0 = EMPTY_COL floodFill g, x0, y, EYES_COL if( checkForFilledEdge(g) == 0 ) : _break floodFill g, x0, y, EMPTY_COL } } next } ny = y + 1 if( y < H+1 ) : eyes = 1 if( eyes == 0 ){ y = 2 + rnd(3000)\(h/2) g.y.(hx-1) = EYES_COL outlineArea g, EYES_COL eyes = 1 ny = y + 1 } for y, 2, H+1, 1 if( g.y.hx == EYES_COL ){ x0 = hx-1 g.y.hx = SOLID_COL g.y.x0 = EYES_COL } else { x0 = hx-2 if( g.y.x0 == EYES_COL ) : g.y.hx = SOLID_COL x0 = hx-1 if( g.y.x0 == EYES_COL ) : g.y.hx = SOLID_COL } next mirror g if( eyes == 1 ) : outlineArea g, 1 // 鼻(つくりかけ) nose = 0 for y, ny, H+1, 1 if( g.y.hx == COL_EMPTY ){ floodFill g, hx, y, 2 if( checkForFilledEdge(g) == 0 ) : _break floodFill g, hx, y, 0 } next if( y <= 10 ) : nose = 1 *draw repeat H, 1 y = cnt repeat W, 1 x = cnt if( g.y.x == SOLID_COL ){ color R, G, B } else { color 0, 0, 0 } boxf 10+x*10, 10+y*10, 10+x*10+10, 10+y*10+10 loop loop stop