#ifndef TRUE #define TRUE (0==0) #define FALSE (0!=0) #endif #include "spritelib.h" #include "ship_animation.h" #include "my_sprites.h" #ifndef FONT_ASTEROIDS #define FONT_HERSHEY 1 #define FONT_ASTEROIDS 2 #define FONT_PROTEL 3 #endif int box(void) { // everything in here is drawn 'on the fly', not from a stored data int i = 0; drawline( 1, 1, 1, 255, FALSE, TRUE); drawline( 1, 255, 255, 255, TRUE, TRUE); drawline( 255, 255, 255, 1, FALSE, FALSE); drawline( 255, 1, 1, 1, TRUE, FALSE); return i; } int cross(void) { // everything in here is drawn 'on the fly', not from a stored data int i = 0; drawline( 1, 1, 255, 255, FALSE, TRUE); drawline( 1, 255, 255, 1, FALSE, FALSE); return i; } #include "my_graphics.h" // This is called once per frame to do all internal logic and to position graphics // ready for drawing. IT DOES NOT draw anything at all itself. void do_frame(void) { #define BOUND 100 static int init = 0; // NOTE: declarations must be static or they are reset between frames static int CB1, CB2, Queen0, Queen1, Queen2, Queen3, Ship0; static int y=0, x=0, dx=-3, dy=2; static int tick=0; static int skin=0; if (!init) { init = 1; // Positioning scale for objects is currently hard-coded as 127 - to be improved? // Other scales are per-object // Create and enable your sprites: //CB1 = Post((Object *)&draw_box, 0, 0, 0); (void)CB1; //CB2 = Post((Object *)&draw_cross, 0, 0, 0); //Queen0 = Post((Object *)&Queen[0], x, y, SCALE*3); //Queen1 = Post((Object *)&Queen[1], y, x, SCALE*3); // Queen3 is not posted at startup //Queen2 = Post((Object *)&Queen[2], 64, 64, SCALE*3); (void)Queen2; //Ship0 = Post((Object *)&Ship, 0, 0, 0x10); } // Move a sprite. Calculation here could be quite expensive, such as calculating the // move in a chess engine, or the perspective rendering in DOOM. { unsigned int dir; y += dy; if (abs(y) > BOUND) { dy = -dy; if ((dy>=0) && (dx>=0)) dir = 32U; if ((dy<0) && (dx>=0)) dir = 96U; if ((dy<0) && (dx<0)) dir = 160U; if ((dy>=0) && (dx<0)) dir = 224U; Direction(Queen1, dir); } x += dx; if (abs(x) > BOUND) { dx = -dx; if ((dy>=0) && (dx>=0)) dir = 32U; if ((dy<0) && (dx>=0)) dir = 96U; if ((dy<0) && (dx<0)) dir = 160U; if ((dy>=0) && (dx<0)) dir = 224U; Direction(Queen1, dir); } } Move(Queen0, x, y); // Moving and automatically rotating sprite Move(Queen1, y, x); // Moving sprite // Move(Queen2, 64, 64); // Doesn't move, but does rotate automatically Brightness(Ship0, 0U+(tick & 128U ? tick&127U : 127-(tick&127U))); // Pulse brightness if (((tick+64) & 127) == 127) { // Appears: //Queen3 = Post((Object *)&Queen[3], -64, -64, SCALE*2); Unpost(CB2); // must have been posted in init code } else if ((tick & 127) == 127) { Unpost(Queen3); // Disappears. Doesn't move or rotate. //CB2 = Post((Object *)&draw_cross, 0, 0, 0); } // The tailgunner ship is not actually rotating, it is cycling through 24 different // static skins. (It was the only animation I had handy, not the best demo, sorry) if (tick&2) { skin = (skin+1) % 24; Ship.data->data = (signed char *)ShipSkins[skin]; } tick++; } // This is a standard 'main program' loop, but the code above // should also work with an interrupt-driven main loop... // We'll supply the interrupt-driven version after the library // interface has stabilised... (currently very much under development) extern void draw_string( int font, const char * s, int x, int y, int move_scale, int draw_scale ); int main(void /* int argc, char **argv */) { static char s[3]; char c='A', tick=0; s[0] = c; s[1] = c+1; s[2] = '\0'; for (;;) { do_frame(); Intensity_7F(); //draw_string(FONT_HERSHEY, s, -120, 100, 127,105); //draw_string(FONT_ASTEROIDS, s, -70, 83, 127,127); draw_string(FONT_PROTEL, "Sprites", -95, 50, 127,30); if ((tick&63) == 63) { c++; if (c == 126) c = 32; s[0] = c; s[1] = c+1; } tick++; UpdateDisplay(); } return 0; }