// make the move/remove into a single separate ram array // and just have one copy of each asteroid. use pointers to it... // (although that stops working when we use rotation) #define ASTEROIDS 24 void intro(void) { static const int white_big[] = { // 0, 0, 0, // adjustment for corner/center! -1, 120, 120, -1, 120,0, -1, 120,-120, -1,0,-120, -1,-120,-120, -1,-120,0, -1,-120, 120, -1,0, 120, 1 }; #define XX 14 #define YY 14 // using a copy of dx,dy means that this code can be merged with // 'Draft4' and used before the initialisation; overlaying dx and dy // on top of the stack. const int8_t cdx[ASTEROIDS] = { 1,1,1,1, 2,2,2,2, -1,-1,-1,-1, -2,-2,-2,-2, 1,2,-2,-1, 1,2,-2,-1 }; const int8_t cdy[ASTEROIDS] = { -2,-1,1,2, -2,-1,1,2, -2,-1,1,2, -2,-1,1,2, -2,1,1,2, -1,-2,2,1 }; int8_t dx[ASTEROIDS], dy[ASTEROIDS]; int8_t x[ASTEROIDS], y[ASTEROIDS]; #define MARGIN 20 uint8_t direction=0; int8_t done; int8_t base, row, tmp1; // , tmp2, other, diffx, diffy; //int8_t xtarget, ytarget; for (row = 0; row < ASTEROIDS; row++) { dx[row]=cdx[row]; dy[row]=cdy[row]; } row=0; {int xx,yy; // lay out the initial board position for the animation: for (yy = 1; yy <= 8; yy++) { if (yy != 4 && yy != 5) { for (xx = ((yy&1)^1)+1; xx <=8; xx+=2) {x[row] = (xx-4)*2*XX-XX; y[row++] = (yy-4)*2*YY-YY;} } } } base = 0; direction = 0; do { // now move asteroids around invisibly and quickly for (row = 0; row < ASTEROIDS; row++) { // Bounce off walls? Marginally more expensive than wrapping. tmp1 = x[row] + dx[base + row]; // overflow test if ((dx[base + row] > 0 && x[row] > 0 && (int8_t)(tmp1+MARGIN) < 0) || (dx[base + row] < 0 && x[row] < 0 && (int8_t)(tmp1-MARGIN) > 0)) { dx[base + row] = -dx[base + row]; // bounce? } x[row] = x[row] + dx[base + row]; tmp1 = y[row] + dy[base + row]; if ((dy[base + row] > 0 && y[row] > 0 && (int8_t)(tmp1+MARGIN) < 0) || (dy[base + row] < 0 && y[row] < 0 && (int8_t)(tmp1-MARGIN) > 0)) { dy[base + row] = -dy[base + row]; } y[row] = y[row] + dy[base + row]; } //base ^= ASTEROIDS; direction++; } while (direction != 255); // change constant depending on length and complexity of animation // reverse the movement vectors for (tmp1 = 0; tmp1 < ASTEROIDS; tmp1++) { dx[tmp1] = -dx[tmp1]; dy[tmp1] = -dy[tmp1]; } // visibly unwind... do { direction--; //base ^= ASTEROIDS; // now move asteroids around for (row = 0; row < ASTEROIDS; row++) { // Bounce off walls? Marginally more expensive than wrapping. tmp1 = x[row] + dx[base + row]; // overflow test if ((dx[base + row] > 0 && x[row] > 0 && (int8_t)(tmp1+MARGIN) < 0) || (dx[base + row] < 0 && x[row] < 0 && (int8_t)(tmp1-MARGIN) > 0)) { dx[base + row] = -dx[base + row]; // bounce? } x[row] = x[row] + dx[base + row]; tmp1 = y[row] + dy[base + row]; if ((dy[base + row] > 0 && y[row] > 0 && (int8_t)(tmp1+MARGIN) < 0) || (dy[base + row] < 0 && y[row] < 0 && (int8_t)(tmp1-MARGIN) > 0)) { dy[base + row] = -dy[base + row]; } y[row] = y[row] + dy[base + row]; } Wait_Recal (); Flash++; Display_board(0); Intensity_a (WHITE_INTENSITY); for (row = 0; row < ASTEROIDS; row++) { Reset0Ref (); set_scale (MEDIUM_SCALE); Moveto_d (y[row]-11, x[row]-1); set_scale (TINY_SCALE); if (row == 12) Intensity_a (BLACK_INTENSITY); #ifdef PIZERO Draw_Line_d(120,120); Draw_Line_d(120,0); Draw_Line_d(120,-120); Draw_Line_d(0,-120); Draw_Line_d(-120,-120); Draw_Line_d(-120,0); Draw_Line_d(-120,120); Draw_Line_d(0,120); #else Draw_VLp((int8_t *)white_big); #endif } } while (direction); (void)tmp1;(void)base;(void)done;(void)direction; // freeze result direction = 24; while (--direction != 0) { Wait_Recal (); Flash++; Display_board(0); Intensity_a (WHITE_INTENSITY); // use the constant (name?) for (row = 0; row < ASTEROIDS; row++) { Reset0Ref (); set_scale (MEDIUM_SCALE); Moveto_d (y[row]-11, x[row]-1); set_scale (TINY_SCALE); if (row == 12) Intensity_a (BLACK_INTENSITY); #ifdef ORIGINAL Draw_VLp ((int8_t *)white_big); #else Draw_Line_d(120,120); Draw_Line_d(120,0); Draw_Line_d(120,-120); Draw_Line_d(0,-120); Draw_Line_d(-120,-120); Draw_Line_d(-120,0); Draw_Line_d(-120,120); Draw_Line_d(0,120); #endif } } #undef XX #undef YY }