#include #include #include #include #define ERASE 0 #define DRAW 1 void kbdhandler(int, int); void clearCar(int, int); void drawCar(int, int); void drawPoles(int, int); static int cX, cY; static int POLE_OFFSET = 0; static double tan = (double)16/(double)19; static int K_105 = 0, K_106 = 0, K_103 = 0; int main() { int c, y, i; double x; cX = 270; cY = 380; vga_init(); vga_setmode(G640x480x256); keyboard_init(); keyboard_seteventhandler(kbdhandler); gl_setcontextvga(G640x480x256); gl_setrgbpalette(); gl_fillbox(0, 0, 640, 100, 15); for (y=10; y<380; y++) { x = 320.0 - (double)y * tan; gl_hline(0, y+90, x, 48); gl_hline(x, y+90, 640 - x, 255); gl_hline(640 - x, y+90, 640, 48); } drawCar(cX, cY); for (i=0; i<12; i+=2) drawPoles(i+1, DRAW); while (1) keyboard_update(); vga_setmode(TEXT); keyboard_close(); return (0); } void drawCar(int x, int y) { gl_fillbox(x + 30, y, 60, 20, 15); gl_fillbox(x + 20, y + 20, 80, 30, 200); gl_fillbox(x, y + 30, 40, 40, 0); gl_fillbox(x + 80, y + 30, 40, 40, 0); gl_fillbox(x + 25, y + 10, 5, 10, 0); gl_fillbox(x + 90, y + 10, 5, 10, 0); } void clearCar(int x, int y) { gl_fillbox(x, y, 125, 70, 255); } void kbdhandler(int scan, int press) { int i, j; switch (press) { case KEY_EVENTPRESS: switch(scan) { case 105: K_105 = 1; break; case 106: K_106 = 1; break; case 103: K_103 = 1; break; } break; case KEY_EVENTRELEASE: switch(scan) { case 105: K_105 = 0; break; case 106: K_106 = 0; break; case 103: K_103 = 0; for (j=200; j>0; j--) { clearCar(cX, cY); cY-=2; drawCar(cX, cY); if (POLE_OFFSET) { POLE_OFFSET = 0; for (i=0; i<12; i+=2) drawPoles(i+1, ERASE); for (i=1; i<12; i+=2) drawPoles(i+1, DRAW); } else { POLE_OFFSET = 1; for (i=1; i<12; i+=2) drawPoles(i+1, ERASE); for (i=0; i<12; i+=2) drawPoles(i+1, DRAW); } clearCar(cX, cY); cY+=2; drawCar(cX, cY); } break; } break; } if (K_103) { clearCar(cX, cY); cY-=2; drawCar(cX, cY); if (POLE_OFFSET) { POLE_OFFSET = 0; for (i=0; i<12; i+=2) drawPoles(i+1, ERASE); for (i=1; i<12; i+=2) drawPoles(i+1, DRAW); } else { POLE_OFFSET = 1; for (i=1; i<12; i+=2) drawPoles(i+1, ERASE); for (i=0; i<12; i+=2) drawPoles(i+1, DRAW); } clearCar(cX, cY); cY+=2; drawCar(cX, cY); } if (K_105) { if (cX >= 85) { clearCar(cX, cY); cX-=10; drawCar(cX, cY); } } else if (K_106) { if (cX <= 430) { clearCar(cX, cY); cX+=10; drawCar(cX, cY); } } } void drawPoles(int y, int erase) { int c; double x, y2; y = y * 30; x = 320.0 - y * tan; if (erase == DRAW) c = 64; else c = 48; y2 = 0.6 * (double)(y + 100); gl_line(x-20, y+100, x-20, y2, c); gl_line(660 - x, y+100, 660 - x, y2, c); }