Main Page | Data Structures | File List | Data Fields | Globals

ex7.c

00001 /*=========================================================================
00002 
00003 GFX EXAMPLE CODE - #7
00004         "starship game, a recap of all things"
00005 
00006 Copyright (C) 2004  Rafael de Oliveira Jannone
00007 
00008 This example's source code is Public Domain.
00009 
00010 WARNING: The author makes no guarantees and holds no responsibility for 
00011 any damage, injury or loss that may result from the use of this source 
00012 code. USE IT AT YOUR OWN RISK.
00013 
00014 Contact the author:
00015         by e-mail : rafael AT jannone DOT org
00016         homepage  : http://jannone.org/gfxlib
00017         ICQ UIN   : 10115284
00018 
00019 =========================================================================*/
00020 
00021 // note: this is my personal favorite demo :) - Rafael
00022 
00023 #include "gfx.h"
00024 
00025 // shapes and attributes
00026 
00027 extern u_char grass1[8];
00028 extern u_char grass1_attr[8];
00029 extern u_char grass2[8];
00030 extern u_char grass2_attr[8];
00031 extern u_char water1[8];
00032 extern u_char water2[8];
00033 extern u_char water3[8];
00034 
00035 extern u_char spaceship[32];
00036 extern u_char fire[32];
00037 
00038 
00039 // terrain definitions
00040 
00041 #define MAP_WIDTH       32
00042 #define MAP_HEIGHT      24
00043 #define MAP_SIZE        MAP_WIDTH * MAP_HEIGHT
00044 
00045 
00046 // helper
00047 
00048 #define KEEP_RANGE(var, min, max) \
00049         if (var < min) var = min; else if (var > max) var = max
00050 
00051 
00052 // terrain functions
00053 
00054 void show_map(u_char *map, int line_start) {
00055         int y, addr;
00056         u_char *l;
00057 
00058         l = map + (line_start * MAP_WIDTH);
00059         addr = 6144;
00060         for (y = line_start; y < MAP_HEIGHT; y++) {
00061                 vwrite(l, addr, MAP_WIDTH);
00062                 addr += MAP_WIDTH;
00063                 l += MAP_WIDTH;
00064         }
00065         l = map;
00066         for (y = 0; y < line_start; y++) {
00067                 vwrite(l, addr, MAP_WIDTH);
00068                 addr += MAP_WIDTH;
00069                 l += MAP_WIDTH;
00070         }
00071 }
00072 
00073 void map_fill_line(u_char* line, int river_width, int river_offs) {
00074         int river_left;
00075         u_char *last;
00076 
00077         river_left = (MAP_WIDTH - river_width) / 2 + river_offs;
00078         last = line + MAP_WIDTH;
00079 
00080         while (river_left--)
00081                 *line++ = (get_rnd() & 1) + '%';
00082 
00083         while (river_width--)
00084                 *line++ = (get_rnd() % 3) + '"';
00085 
00086         while (line < last)
00087                 *line++ = (get_rnd() & 1) + '%';
00088 }
00089 
00090 void randomize_river(int *width, int *offs) {
00091         *width += (get_rnd() & 2) - 1;
00092         *offs  += (get_rnd() & 2) - 1;
00093         KEEP_RANGE(*width, 8, 16);
00094         KEEP_RANGE(*offs, -4, 4);
00095 }
00096 
00097 
00098 // player data
00099 
00100 typedef struct {
00101         int x;
00102         int y;  
00103         int vx, vy;
00104         bool trig;
00105 } player_t;
00106 
00107 
00108 // rocket data
00109 
00110 typedef struct {
00111         int x;
00112         int y;
00113         u_char sp;
00114         bool active;
00115 } rocket_t;
00116 
00117 
00118 // maximum number of rockets at a time
00119 
00120 #define MAX_ROCKET      3
00121 
00122 
00123 // rocket functions
00124 
00125 rocket_t* alloc_rocket(rocket_t *array) {
00126         int c;
00127         for (c = 0; c < MAX_ROCKET; c++) {
00128                 if (!array->active) {
00129                         array->active = true;
00130                         array->sp = 10 + c;
00131                         return array;
00132                 }
00133                 ++array;
00134         }
00135         return NULL;
00136 }
00137 
00138 void free_rocket(rocket_t *r) {
00139         r->active = false;
00140         put_sprite_16(r->sp, 0, 192, 0, 0);
00141 }
00142 
00143 void initialize_rockets(rocket_t *array) {
00144         int c;
00145         for (c = 0; c < MAX_ROCKET; c++)
00146                 free_rocket(array++);
00147 }
00148 
00149 void move_rockets(rocket_t *array) {
00150         int c;
00151         for (c = 0; c < MAX_ROCKET; c++) {
00152                 if (array->active) {
00153                         if ((array->y -= 7) < 0)
00154                                 free_rocket(array);
00155                         else
00156                                 put_sprite_16(array->sp, array->x, array->y, 1, 6);
00157                 } 
00158                 ++array;
00159         }
00160 }
00161 
00162 
00163 // player functions
00164 
00165 void move_player(player_t *player) {
00166         u_char s;
00167         char ax, ay;
00168         
00169         s = st_dir[get_stick(0)];
00170 
00171         ay = (s & st_up) ? -1 : ((s & st_down) ? 1 : 0);
00172         ax = (s & st_left) ? -1 : ((s & st_right) ? 1 : 0);
00173         
00174         player->vx += ax;
00175         player->vy += ay;
00176         KEEP_RANGE(player->vx, -3, 3);
00177         KEEP_RANGE(player->vy, -3, 3);
00178 
00179         player->x += player->vx;
00180         player->y += player->vy;
00181 
00182         put_sprite_16(0, player->x, player->y, 0, 15);
00183         put_sprite_16(31, player->x + 6, player->y + 6, 0, 1);          
00184 }
00185 
00186 
00187 // main :)
00188 
00189 main() {
00190         // allocating stuff
00191 
00192         int c, river_width, river_offs;
00193         player_t player;
00194         rocket_t rockets[MAX_ROCKET], *rckt;
00195 
00196         u_char *l;
00197         u_char map[MAP_WIDTH * MAP_HEIGHT];
00198 
00199         // set screen
00200         set_color(15, 1, 1);
00201         set_mangled_mode();
00202 
00203         // set sprites
00204         set_sprite_mode(sprite_large);
00205 
00206         set_sprite_16(0, spaceship);
00207         set_sprite_16(1, fire);
00208 
00209         // set char shapes and colors
00210         set_char('"', water1, NULL, 0x54, place_all);
00211         set_char('#', water2, NULL, 0x54, place_all);
00212         set_char('$', water3, NULL, 0x54, place_all);
00213         set_char('%', grass1, grass1_attr, 0, place_all);
00214         set_char('&', grass2, grass2_attr, 0, place_all);
00215 
00216         // initializing 
00217         initialize_rockets(rockets);
00218 
00219         river_width = 16;
00220         river_offs = 0;
00221 
00222         l = map + MAP_SIZE - MAP_WIDTH;
00223         for (c = 0; c < MAP_HEIGHT; c++) {
00224                 randomize_river(&river_width, &river_offs);
00225                 map_fill_line(l, river_width, river_offs);
00226                 l -= MAP_WIDTH;
00227         }
00228 
00229         c = 0;
00230 
00231         player.x = 128;
00232         player.y = 96;
00233         player.vx = player.vy = player.trig = 0;
00234 
00235         // main loop
00236         for (;;) {
00237                 move_player(&player);
00238 
00239                 player.trig |= get_trigger(0);
00240 
00241                 if ((c & 2) && player.trig && (rckt = alloc_rocket(rockets))) {
00242                         rckt->x = player.x + 4;
00243                         rckt->y = player.y - 8;
00244                         player.trig = false;
00245                 }
00246                 move_rockets(rockets);
00247 
00248                 if (--c < 0)
00249                         c += MAP_HEIGHT;
00250                 l = map + c * MAP_WIDTH;
00251                 randomize_river(&river_width, &river_offs);
00252                 map_fill_line(l, river_width, river_offs);
00253                 show_map(map, c);
00254         }
00255 }
00256 
00257 // binary data (shapes, attributes, whatever...)
00258 
00259 #asm
00260 psect data
00261 
00262 global _grass1
00263 _grass1:
00264         defb    00000000B
00265         defb    00111000B
00266         defb    00000000B
00267         defb    10000011B
00268         defb    00000000B
00269         defb    00110000B
00270         defb    00000100B
00271         defb    00011010B
00272 
00273 global _grass1_attr
00274 _grass1_attr:
00275         defb    032h ;00000000B
00276         defb    032h ;00111000B
00277         defb    032h ;00000000B
00278         defb    0B2h ;10000011B
00279         defb    032h ;00000000B
00280         defb    032h ;00110000B
00281         defb    0B2h ;00000100B
00282         defb    0A2h ;00011010B
00283 
00284 global _grass2
00285 _grass2:
00286         defb    01011000B
00287         defb    00000000B
00288         defb    00000000B
00289         defb    11100000B
00290         defb    00000000B
00291         defb    00000111B
00292         defb    00000000B
00293         defb    00100000B
00294 
00295 global _grass2_attr
00296 _grass2_attr:
00297         defb    0A2h 
00298         defb    032h 
00299         defb    032h 
00300         defb    0B2h 
00301         defb    032h 
00302         defb    032h 
00303         defb    032h 
00304         defb    0B2h 
00305 
00306 global _water1
00307 _water1:
00308         defb    00000000B
00309         defb    11111000B
00310         defb    00000000B
00311         defb    00000000B
00312         defb    00111111B
00313         defb    00000000B
00314         defb    00000000B
00315         defb    00000000B
00316 
00317 global _water2
00318 _water2:
00319         defb    00000000B
00320         defb    00000000B
00321         defb    00000000B
00322         defb    00000000B
00323         defb    11111111B
00324         defb    00000000B
00325         defb    00000111B
00326         defb    00000000B
00327 
00328 global _water3
00329 _water3:
00330         defb    0,0,0,0,0,0,0,0
00331 
00332 global _spaceship
00333 _spaceship:
00334         defb    00000011B
00335         defb    00000011B
00336         defb    00000011B
00337         defb    00000111B
00338         defb    00000111B
00339         defb    11000111B
00340         defb    11000111B
00341         defb    11100111B
00342         defb    11101110B
00343         defb    11101110B
00344         defb    11111110B
00345         defb    11111111B
00346         defb    11100111B
00347         defb    11000011B
00348         defb    11110000B
00349         defb    10010000B
00350 
00351         defb    11000000B
00352         defb    11000000B
00353         defb    11000000B
00354         defb    11100000B
00355         defb    11100000B
00356         defb    11100011B
00357         defb    11100011B
00358         defb    11100111B
00359         defb    01110111B
00360         defb    01110111B
00361         defb    01111111B
00362         defb    11111111B
00363         defb    11100111B
00364         defb    11000011B
00365         defb    00001111B
00366         defb    00001001B
00367 
00368 global _fire
00369 _fire:
00370         defb    00011000B
00371         defb    00111100B
00372         defb    00111100B
00373         defb    01111110B
00374         defb    01111110B
00375         defb    01111110B
00376         defb    01110110B
00377         defb    01010100B
00378         defb    00010000B
00379         defb    00010000B
00380         defb    00010000B
00381         defb    00000000B
00382         defb    00000000B
00383         defb    00000000B
00384         defb    00000000B
00385         defb    00000000B
00386         defb    0,0,0,0,0,0,0,0
00387         defb    0,0,0,0,0,0,0,0
00388 
00389 #endasm
00390 
00391 

Generated on Thu Mar 3 19:55:01 2005 for GFX lib by  doxygen 1.4.1