Changeset 16


Ignore:
Timestamp:
Dec 13, 2002 8:27:16 PM (13 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.