Changeset 16


Ignore:
Timestamp:
Dec 13, 2002 8:27:16 PM (11 years ago)
Author:
sam
Message:
  • moved nuke from explosions to weapons.
  • used a cool Bresenham algorithm to draw the nuke circles.
  • nuke collides with aliens.
Location:
ttyvaders/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • ttyvaders/trunk/collide.c

    r12 r16  
    88    int i; 
    99 
    10     for( i = 0; i < SHOTS; i++ ) 
     10    for( i = 0; i < WEAPONS; i++ ) 
    1111    { 
    1212        if( wp->y[i] >= 0 ) 
     
    6060    int i, j; 
    6161 
    62     for( i = 0; i < SHOTS; i++ ) 
     62    for( i = 0; i < WEAPONS; i++ ) 
    6363    { 
    6464        if( wp->y[i] >= 0 ) 
    6565        { 
    6666            int ok = 0; 
     67            int r; 
    6768 
    68             for( j = 0; j < ALIENS; j++ ) 
     69            switch( wp->type[i] ) 
    6970            { 
    70                 if( wp->x[i] >= al->x[j] 
    71                      && wp->x[i] <= al->x[j] + 4 
    72                      && wp->y[i] >= al->y[j] 
    73                      && wp->y[i] <= al->y[j] + 2 ) 
     71            case 2: 
     72                /* Big nuke */ 
     73                r = (34 - wp->n[i]) * (34 - wp->n[i]) / 10; 
     74 
     75                for( j = 0; j < ALIENS; j++ ) 
    7476                { 
    75                     al->life[j]--; 
    76                     if( al->life[j] == 0 ) 
     77                    if( al->x[j] < 0 ) 
    7778                    { 
     79                        continue; 
     80                    } 
     81 
     82                    if( (al->x[j] - wp->x[i]) * (al->x[j] - wp->x[i]) 
     83                          + 4 * (al->y[j] - wp->y[i]) * (al->y[j] - wp->y[i]) 
     84                        <= r * r ) 
     85                    { 
     86                        /* Kill alien, not nuke */ 
     87                        add_explosion( g, ex, al->x[j], al->y[j], 0, 0, 1 ); 
    7888                        al->x[j] = -1; 
    7989                        al->y[j] = -1; 
    80                         add_explosion( g, ex, wp->x[i], wp->y[i], 0, 0, 1 ); 
    8190                    } 
    82                     ok = 1; 
    8391                } 
    84                 else if( wp->x[i] >= al->x[j] 
    85                           && wp->x[i] <= al->x[j] + 4 
    86                           && wp->y[i]+1 >= al->y[j] 
    87                           && wp->y[i]+1 <= al->y[j] + 2 ) 
     92                break; 
     93 
     94            case 1: 
     95            default: 
     96                for( j = 0; j < ALIENS; j++ ) 
    8897                { 
    89                     al->life[j]--; 
    90                     if( al->life[j] == 0 ) 
     98                    if( wp->x[i] >= al->x[j] 
     99                         && wp->x[i] <= al->x[j] + 4 
     100                         && wp->y[i] >= al->y[j] 
     101                         && wp->y[i] <= al->y[j] + 2 ) 
    91102                    { 
    92                         al->x[j] = -1; 
    93                         al->y[j] = -1; 
    94                         add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 0, 1 ); 
     103                        al->life[j]--; 
     104                        if( al->life[j] == 0 ) 
     105                        { 
     106                            al->x[j] = -1; 
     107                            al->y[j] = -1; 
     108                            add_explosion( g, ex, wp->x[i], wp->y[i], 0, 0, 1 ); 
     109                        } 
     110                        ok = 1; 
    95111                    } 
    96                     ok = 1; 
     112                    else if( wp->x[i] >= al->x[j] 
     113                              && wp->x[i] <= al->x[j] + 4 
     114                              && wp->y[i]+1 >= al->y[j] 
     115                              && wp->y[i]+1 <= al->y[j] + 2 ) 
     116                    { 
     117                        al->life[j]--; 
     118                        if( al->life[j] == 0 ) 
     119                        { 
     120                            al->x[j] = -1; 
     121                            al->y[j] = -1; 
     122                            add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 0, 1 ); 
     123                        } 
     124                        ok = 1; 
     125                    } 
    97126                } 
    98             } 
    99127 
    100             if( ok ) 
    101             { 
    102                 wp->y[i] = -1; 
     128                if( ok ) 
     129                { 
     130                    wp->y[i] = -1; 
     131                } 
     132                break; 
    103133            } 
    104134        } 
  • ttyvaders/trunk/common.h

    r12 r16  
    11 
    22#define STARS 50 
    3 #define SHOTS 50 
     3#define WEAPONS 50 
    44#define ROCKS 10 
    55#define ALIENS 10 
     
    1717#   define GFX_WRITE(x) addch(x) 
    1818#endif 
     19 
     20#define GFX_WRITETO(x,y,c) do{ GFX_GOTO(x,y); GFX_WRITE(c); }while(0) 
    1921 
    2022#define GET_RAND(p,q) ((p)+(int)((1.0*((q)-(p)))*rand()/(RAND_MAX+1.0))) 
     
    5557typedef struct 
    5658{ 
    57     int x[SHOTS]; 
    58     int y[SHOTS]; 
    59     int v[SHOTS]; 
     59    int x[WEAPONS]; 
     60    int y[WEAPONS]; 
     61    int v[WEAPONS]; 
     62    int n[WEAPONS]; 
     63    int type[WEAPONS]; 
    6064 
    6165} weapons; 
     
    6569    int x, y; 
    6670    int dir; 
    67     int weapon; 
     71    int weapon, nuke; 
    6872 
    6973} player; 
     
    113117void draw_weapons( game *g, weapons *wp ); 
    114118void update_weapons( game *g, weapons *wp ); 
    115 void add_weapon( game *g, weapons *wp, int x, int y ); 
     119void add_weapon( game *g, weapons *wp, int x, int y, int type ); 
    116120 
    117121void init_starfield( game *g, starfield *s ); 
  • ttyvaders/trunk/explosions.c

    r12 r16  
    11 
    22#include <stdlib.h> 
    3 #include <math.h> 
    43 
    54#include "common.h" 
     
    76static void draw_small_explosion( int x, int y, int frame ); 
    87static void draw_big_explosion( int x, int y, int frame ); 
    9 static void draw_huge_explosion( int x, int y, int frame ); 
    108 
    119void init_explosions( game *g, explosions *ex ) 
     
    8684        switch( ex->type[i] ) 
    8785        { 
    88             case 2: 
    89                 draw_huge_explosion( ex->x[i], ex->y[i], ex->n[i] ); 
    90                 break; 
    9186            case 1: 
    9287                draw_big_explosion( ex->x[i], ex->y[i], ex->n[i] ); 
     
    309304} 
    310305 
    311 static void draw_circle( int x, int y, float r ); 
    312  
    313 static void draw_huge_explosion( int x, int y, int frame ) 
    314 { 
    315     float r = 1.5 * (30 - frame); 
    316  
    317     GFX_COLOR( BLUE ); 
    318     draw_circle( x, y, r ); 
    319  
    320     r += 0.7; 
    321  
    322     GFX_COLOR( CYAN ); 
    323     draw_circle( x, y, r ); 
    324  
    325     r += 0.7; 
    326  
    327     GFX_COLOR( WHITE ); 
    328     draw_circle( x, y, r ); 
    329 } 
    330  
    331 static void draw_circle( int x, int y, float r ) 
    332 { 
    333 #if 1 
    334     float c; 
    335  
    336     for( c = 0 ; c <= 90 ; c += 1 ) 
    337     { 
    338         float dx = 0.5 + r * 2.0 * sin( c * M_PI / 180.0 ); 
    339         float dy = 0.5 + r * cos( c * M_PI / 180.0 ); 
    340  
    341         GFX_GOTO( x + dx, y + dy ); 
    342         GFX_WRITE( '#' ); 
    343         GFX_GOTO( x - dx, y + dy ); 
    344         GFX_WRITE( '#' ); 
    345         GFX_GOTO( x + dx, y - dy ); 
    346         GFX_WRITE( '#' ); 
    347         GFX_GOTO( x - dx, y - dy ); 
    348         GFX_WRITE( '#' ); 
    349     } 
    350 #endif 
    351  
    352 #if 0 
    353 int dx,dy,a2,b2, S, T; 
    354 float a = r*8, b = r*2; 
    355  
    356  a2 = a*a; 
    357  b2 = b*b; 
    358  dx = 0; 
    359  dy = b; 
    360  S = a2*(1-2*b) + 2*b2; 
    361  T = b2 - 2*a2*(2*b-1); 
    362         GFX_GOTO( x + dx, y + dy ); 
    363         GFX_WRITE( '#' ); 
    364         GFX_GOTO( x - dx, y + dy ); 
    365         GFX_WRITE( '#' ); 
    366         GFX_GOTO( x + dx, y - dy ); 
    367         GFX_WRITE( '#' ); 
    368         GFX_GOTO( x - dx, y - dy ); 
    369         GFX_WRITE( '#' ); 
    370  
    371  do 
    372    { 
    373     if (S<0) 
    374        { 
    375         S += 2*b2*(2*x+3); 
    376         T += 4*b2*(x+1); 
    377         dx++; 
    378        } 
    379       else if (T<0) 
    380           { 
    381            S += 2*b2*(2*x+3) - 4*a2*(dy-1); 
    382            T += 4*b2*(x+1) - 2*a2*(2*dy-3); 
    383            dx++; 
    384            dy--; 
    385           } 
    386          else 
    387           { 
    388            S -= 4*a2*(dy-1); 
    389            T -= 2*a2*(2*dy-3); 
    390            dy--; 
    391           } 
    392         GFX_GOTO( x + dx, y + dy ); 
    393         GFX_WRITE( '#' ); 
    394         GFX_GOTO( x - dx, y + dy ); 
    395         GFX_WRITE( '#' ); 
    396         GFX_GOTO( x + dx, y - dy ); 
    397         GFX_WRITE( '#' ); 
    398         GFX_GOTO( x - dx, y - dy ); 
    399         GFX_WRITE( '#' ); 
    400    } 
    401  while (dy>0); 
    402 #endif 
    403  
    404 } 
    405  
  • ttyvaders/trunk/main.c

    r12 r16  
    9999                    break; 
    100100                case 'j': 
    101                     //if( p->y < g->h - 2 ) p->y += 1; 
     101                    if( p->y < g->h - 2 ) p->y += 1; 
    102102                    break; 
    103103                case 'k': 
    104                     //if( p->y > 1 ) p->y -= 1; 
     104                    if( p->y > 1 ) p->y -= 1; 
    105105                    break; 
    106106                case 'l': 
     
    108108                    break; 
    109109                case '\r': 
    110                     add_explosion( g, ex, p->x + 2, p->y, 0, 0, 2 ); 
     110                    if( p->nuke == 0 ) 
     111                    { 
     112                        p->nuke = 40; 
     113                        add_weapon( g, wp, p->x + 2, p->y, 2 ); 
     114                    } 
    111115                    break; 
    112116                case ' ': 
     
    114118                    { 
    115119                        p->weapon = 4; 
    116                         add_weapon( g, wp, p->x, p->y ); 
    117                         add_weapon( g, wp, p->x + 5, p->y ); 
     120                        add_weapon( g, wp, p->x, p->y, 1 ); 
     121                        add_weapon( g, wp, p->x + 5, p->y, 1 ); 
    118122                    } 
    119123                    break; 
  • ttyvaders/trunk/player.c

    r12 r16  
    1313    p->dir = 0; 
    1414    p->weapon = 0; 
     15    p->nuke = 0; 
    1516 
    1617    return p; 
     
    5253    } 
    5354 
     55    if( p->nuke ) 
     56    { 
     57        p->nuke--; 
     58    } 
     59 
    5460    if( p->dir < 0 ) 
    5561    { 
  • ttyvaders/trunk/weapons.c

    r12 r16  
    44#include "common.h" 
    55 
     6static void draw_nuke( int x, int y, int frame ); 
     7static void draw_circle( int x, int y, int r ); 
     8 
    69void init_weapons( game *g, weapons *wp ) 
    710{ 
    811    int i; 
    912 
    10     for( i = 0; i < SHOTS; i++ ) 
     13    for( i = 0; i < WEAPONS; i++ ) 
    1114    { 
    1215        wp->x[i] = -1; 
    1316        wp->y[i] = -1; 
    1417        wp->v[i] = 0; 
     18        wp->n[i] = 0; 
     19        wp->type[i] = 0; 
    1520    } 
    1621} 
     
    2025    int i; 
    2126 
    22     for( i = 0; i < SHOTS; i++ ) 
     27    for( i = 0; i < WEAPONS; i++ ) 
    2328    { 
    2429        if( wp->x[i] >= 0 ) 
    2530        { 
    26             GFX_COLOR( WHITE ); 
    27             GFX_GOTO( wp->x[i], wp->y[i] ); 
    28             GFX_WRITE( '|' ); 
    29             GFX_COLOR( CYAN ); 
    30             GFX_GOTO( wp->x[i], wp->y[i] + 1 ); 
    31             GFX_WRITE( '|' ); 
     31            switch( wp->type[i] ) 
     32            { 
     33                case 2: 
     34                    draw_nuke( wp->x[i], wp->y[i], wp->n[i] ); 
     35                    break; 
     36                case 1: 
     37                default: 
     38                    GFX_COLOR( WHITE ); 
     39                    GFX_GOTO( wp->x[i], wp->y[i] ); 
     40                    GFX_WRITE( '|' ); 
     41                    GFX_COLOR( CYAN ); 
     42                    GFX_GOTO( wp->x[i], wp->y[i] + 1 ); 
     43                    GFX_WRITE( '|' ); 
     44                    break; 
     45            } 
    3246        } 
    3347    } 
     
    3852    int i; 
    3953 
    40     for( i = 0; i < SHOTS; i++ ) 
     54    for( i = 0; i < WEAPONS; i++ ) 
    4155    { 
    4256        if( wp->y[i] < 0 ) 
     
    4761        else 
    4862        { 
    49             wp->y[i] += wp->v[i]; 
     63            switch( wp->type[i] ) 
     64            { 
     65            case 2: 
     66                wp->n[i]--; 
     67                if( wp->n[i]-- < 0 ) 
     68                { 
     69                    wp->y[i] = -1; 
     70                } 
     71                break; 
     72            case 1: 
     73            default: 
     74                wp->y[i] += wp->v[i]; 
     75                break; 
     76            } 
    5077 
    5178            /* Check collisions */ 
     
    5481} 
    5582 
    56 void add_weapon( game *g, weapons *wp, int x, int y ) 
     83void add_weapon( game *g, weapons *wp, int x, int y, int type ) 
    5784{ 
    5885    int i; 
    5986 
    60     for( i = 0; i < SHOTS; i++ ) 
     87    for( i = 0; i < WEAPONS; i++ ) 
    6188    { 
    6289        if( wp->y[i] < 0 ) 
     
    6491            wp->x[i] = x; 
    6592            wp->y[i] = y; 
     93            wp->type[i] = type; 
    6694            wp->v[i] = -2; 
     95            wp->n[i] = 30; 
    6796            break; 
    6897        } 
     
    7099} 
    71100 
     101static void draw_nuke( int x, int y, int frame ) 
     102{ 
     103    int r = (34 - frame) * (34 - frame) / 10; 
     104 
     105    /* Lots of duplicate pixels, but we don't care */ 
     106    GFX_COLOR( BLUE ); 
     107    draw_circle( x, y, r++ ); 
     108    GFX_COLOR( CYAN ); 
     109    draw_circle( x, y, r++ ); 
     110    GFX_COLOR( WHITE ); 
     111    draw_circle( x, y, r++ ); 
     112    draw_circle( x, y, r++ ); 
     113} 
     114 
     115static void draw_circle( int x, int y, int r ) 
     116{ 
     117    int test, dx, dy; 
     118 
     119    /* Optimized Bresenham. Kick ass. */ 
     120    for( test = 0, dx = 0, dy = r ; dx <= dy ; dx++ ) 
     121    { 
     122        GFX_WRITETO( x + dx, y + dy / 2, '#' ); 
     123        GFX_WRITETO( x - dx, y + dy / 2, '#' ); 
     124        GFX_WRITETO( x + dx, y - dy / 2, '#' ); 
     125        GFX_WRITETO( x - dx, y - dy / 2, '#' ); 
     126 
     127        GFX_WRITETO( x + dy, y + dx / 2, '#' ); 
     128        GFX_WRITETO( x - dy, y + dx / 2, '#' ); 
     129        GFX_WRITETO( x + dy, y - dx / 2, '#' ); 
     130        GFX_WRITETO( x - dy, y - dx / 2, '#' ); 
     131 
     132        test += test > 0 ? dx - dy-- : dx; 
     133    } 
     134} 
     135 
Note: See TracChangeset for help on using the changeset viewer.