Ignore:
Timestamp:
Dec 13, 2002, 8:27:16 PM (18 years ago)
Author:
Sam Hocevar
Message:
  • moved nuke from explosions to weapons.
  • used a cool Bresenham algorithm to draw the nuke circles.
  • nuke collides with aliens.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.