Witam.
Ostatnio zacząłem pisać gierkę (strzelankę) polegającą na zabijaniu atakujących gracza zombie :) Gracz może zabić zombie strzelając do niego. Po śmierci wszystkich zombie respawnują się one na nowo i... po chwili pojawia się problem. Gdy tylko zombie pojawi się w okolicy w której poprzednio zginął to ginie ponownie. Czego jest to wina?
#include <allegro.h>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int postac_x, postac_y, blysk_x, blysk_y, powt, runda, myhp;
int p1, p1_x, p1_y, p2, p2_x, p2_y;
int ammow, ammoq;
void hp( int g, int l, int p, int d, int h )
{
double hp = 1;
if( blysk_y > g )
{
if( postac_y < g && blysk_x > l && blysk_x < p ) hp = 0;
}
if( blysk_x > l )
{
if( postac_x < l && blysk_y > g && blysk_y < d ) hp = 0;
}
if( blysk_x < p )
{
if( postac_x > p && blysk_y > g && blysk_y < d ) hp = 0;
}
if( blysk_y < d )
{
if( postac_y > d && blysk_x > l && blysk_x < p ) hp = 0;
}
if( h == 1 && hp == 0 ) p1 = 0;
if( h == 2 && hp == 0 ) p2 = 0;
}
void kolizja( int g, int l, int p, int d )
{
if( postac_y + 20 > g )
{
if( postac_y < g + 2 && postac_x + 20 > l && postac_x < p ) postac_y = postac_y - 1;
}
if( postac_x + 20 > l )
{
if( postac_x < l + 2 && postac_y + 20 > g && postac_y < d ) postac_x = postac_x - 1;
}
if( postac_x < p )
{
if( postac_x > l && postac_y + 20 > g && postac_y < d ) postac_x = postac_x + 1;
}
if( postac_y < d )
{
if( postac_y > g && postac_x + 20 > l && postac_x < p ) postac_y = postac_y + 1;
}
if( blysk_y > g )
{
if( blysk_y < g + 2 && blysk_x > l && blysk_x < p ) powt = 1000;
}
if( blysk_x > l )
{
if( blysk_x < l + 2 && blysk_y > g && blysk_y < d ) powt = 1000;
}
if( blysk_x < p )
{
if( blysk_x > p - 2 && blysk_y > g && blysk_y < d ) powt = 1000;
}
if( blysk_y < d )
{
if( blysk_y > d - 2 && blysk_x > l && blysk_x < p ) powt = 1000;
}
if( p1_y + 20 > g )
{
if( p1_y < g + 2 && p1_x + 20 > l && p1_x < p ) p1_y = p1_y - 1;
}
if( p1_x + 20 > l )
{
if( p1_x < l + 2 && p1_y + 20 > g && p1_y < d ) p1_x = p1_x - 1;
}
if( p1_x < p )
{
if( p1_x > l && p1_y + 20 > g && p1_y < d ) p1_x = p1_x + 1;
}
if( p1_y < d )
{
if( p1_y > g && p1_x + 20 > l && p1_x < p ) p1_y = p1_y + 1;
}
if( p2_y + 20 > g )
{
if( p2_y < g + 2 && p2_x + 20 > l && p2_x < p ) p2_y = p2_y - 1;
}
if( p2_x + 20 > l )
{
if( p2_x < l + 2 && p2_y + 20 > g && p2_y < d ) p2_x = p2_x - 1;
}
if( p2_x < p )
{
if( p2_x > l && p2_y + 20 > g && p2_y < d ) p2_x = p2_x + 1;
}
if( p2_y < d )
{
if( p2_y > g && p2_x + 20 > l && p2_x < p ) p2_y = p2_y + 1;
}
}
void atak( int g, int l, int p, int d )
{
if( postac_y + 20 >= g && postac_y <= g && postac_x + 20 >= l && postac_x <= p )
{
myhp = myhp - 1;
}
}
void ai( int g, int l, int p, int d, int ktory )
{
if( ktory == 1 )
{
if( postac_y < g )
{
p1_y = p1_y - 1;
}
if( postac_x < l )
{
p1_x = p1_x - 1;
}
if( postac_x > p - 20 )
{
p1_x = p1_x + 1;
}
if( postac_y > d - 20 )
{
p1_y = p1_y + 1;
}
}
if( ktory == 2 )
{
if( postac_y < g )
{
p2_y = p2_y - 1;
}
if( postac_x < l )
{
p2_x = p2_x - 1;
}
if( postac_x > p - 20 )
{
p2_x = p2_x + 1;
}
if( postac_y > d - 20 )
{
p2_y = p2_y + 1;
}
}
}
void kolizje()
{
kolizja( 84, 100, 200, 234 );
kolizja( 230, 300, 550, 290 );
kolizja( 80, 760, 810, 110 );
kolizja( 400, 210, 360, 520 );
kolizja( 600, 697, 700, 897 );
}
int main()
{
allegro_init();
install_keyboard();
set_color_depth( 16 );
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 900, 700, 0, 0 );
clear_to_color( screen, makecol( 128, 128, 128 ) );
BITMAP * bufor = NULL;
BITMAP * postac = NULL;
BITMAP * przeciwnik = NULL;
BITMAP * przeciwnik2 = NULL;
BITMAP * background = NULL;
BITMAP * blysk = NULL;
BITMAP * blysk2 = NULL;
bufor = create_bitmap( 900, 700 );
postac = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/postac.tga", default_palette );
przeciwnik = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/zombie.tga", default_palette );
przeciwnik2 = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/zombie.tga", default_palette );
background = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/mapa1.tga", default_palette );
blysk = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/blysk.tga", default_palette );
blysk2 = load_tga( "/home/donchris/Dokumenty/Projekt2/Modele/blysk2.tga", default_palette );
postac_x = 5,
postac_y = 200;
p1 = p2 = 1;
p1_y = 400;
p1_x = 500;
p2_y = 100;
p2_x = 300;
ammow = 100;
ammoq = 100;
myhp = 100;
runda = 1;
while( !key[ KEY_ESC ] )
{
powt = 1;
if( key[ KEY_LEFT ] ) postac_x = postac_x - 2;
if( key[ KEY_RIGHT ] ) postac_x = postac_x + 2;
if( key[ KEY_UP ] ) postac_y = postac_y - 2;
if( key[ KEY_DOWN ] ) postac_y = postac_y + 2;
kolizje();
clear_to_color( bufor, makecol( 150, 150, 150 ) );
blit( background, bufor, 0, 0, 0, 0, background->w, background->h );
textprintf_ex( bufor, font, 710, 610, makecol( 255, 255, 255 ), - 1, "Ammow: %d", ammow );
textprintf_ex( bufor, font, 710, 620, makecol( 255, 255, 255 ), - 1, "Ammoq: %d", ammoq );
textprintf_ex( bufor, font, 710, 630, makecol( 255, 255, 255 ), - 1, "HP: %d", myhp );
textprintf_ex( bufor, font, 710, 640, makecol( 255, 255, 255 ), - 1, "Runda: %d", runda );
if( p1 == 1 ) masked_blit( przeciwnik, bufor, 0, 0, p1_x, p1_y, przeciwnik->w, przeciwnik->h );
if( p2 == 1 ) masked_blit( przeciwnik2, bufor, 0, 0, p2_x, p2_y, przeciwnik2->w, przeciwnik2->h );
if( key[ KEY_W ] && ammow > 0 )
{
blysk_x = postac_x + 10;
blysk_y = postac_y + 10;
if( key[ KEY_LEFT ] && !key[ KEY_RIGHT ] )
{
do
{
blit( blysk, bufor, 0, 0, blysk_x, blysk_y, blysk->w, blysk->h );
blysk_x = blysk_x - 1;
powt = powt + 1;
kolizje();
} while( powt < 50 );
}
if( key[ KEY_RIGHT ] && !key[ KEY_LEFT ] )
{
do
{
blit( blysk, bufor, 0, 0, blysk_x, blysk_y, blysk->w, blysk->h );
blysk_x = blysk_x + 1;
powt = powt + 1;
kolizje();
} while( powt < 50 );
}
if( key[ KEY_UP ] && !key[ KEY_DOWN ] )
{
do
{
blit( blysk, bufor, 0, 0, blysk_x, blysk_y, blysk->w, blysk->h );
blysk_y = blysk_y - 1;
powt = powt + 1;
kolizje();
} while( powt < 50 );
}
if( key[ KEY_DOWN ] && !key[ KEY_UP ] )
{
do
{
blit( blysk, bufor, 0, 0, blysk_x, blysk_y, blysk->w, blysk->h );
blysk_y = blysk_y + 1;
powt = powt + 1;
kolizje();
} while( powt < 50 );
}
ammow = ammow - 1;
}
if( key[ KEY_Q ] && ammoq > 0 )
{
blysk_x = postac_x + 10;
blysk_y = postac_y + 10;
if( key[ KEY_LEFT ] && !key[ KEY_RIGHT ] )
{
do
{
blit( blysk2, bufor, 0, 0, blysk_x, blysk_y, blysk2->w, blysk2->h );
blysk_x = blysk_x - 1;
powt = powt + 1;
kolizje();
} while( powt < 100 );
}
if( key[ KEY_RIGHT ] && !key[ KEY_LEFT ] )
{
do
{
blit( blysk2, bufor, 0, 0, blysk_x, blysk_y, blysk2->w, blysk2->h );
blysk_x = blysk_x + 1;
powt = powt + 1;
kolizje();
} while( powt < 100 );
}
if( key[ KEY_UP ] && !key[ KEY_DOWN ] )
{
do
{
blit( blysk2, bufor, 0, 0, blysk_x, blysk_y, blysk2->w, blysk2->h );
blysk_y = blysk_y - 1;
powt = powt + 1;
kolizje();
} while( powt < 100 );
}
if( key[ KEY_DOWN ] && !key[ KEY_UP ] )
{
do
{
blit( blysk2, bufor, 0, 0, blysk_x, blysk_y, blysk2->w, blysk2->h );
blysk_y = blysk_y + 1;
powt = powt + 1;
kolizje();
} while( powt < 100 );
}
ammoq = ammoq - 1;
}
masked_blit( postac, bufor, 0, 0, postac_x, postac_y, postac->w, postac->h );
blit( bufor, screen, 0, 0, 0, 0, 900, 700 );
if( postac_x < 3 ) postac_x = 3;
if( postac_y < 3 ) postac_y = 3;
if( postac_x > 877 ) postac_x = 877;
if( postac_y > 677 ) postac_y = 677;
hp( p1_y, p1_x, p1_x + 20, p1_y + 20, 1 );
hp( p2_y, p2_x, p2_x + 20, p2_y + 20, 2 );
if( p1 == 1 ) atak( p1_y, p1_x, p1_x + 20, p1_y + 20 );
if( p2 == 1 ) atak( p2_y, p2_x, p2_x + 20, p2_y + 20 );
if( p1 == 1 ) ai( p1_y, p1_x, p1_x + 20, p1_y + 20, 1 );
if( p2 == 1 ) ai( p2_y, p2_x, p2_x + 20, p2_y + 20, 2 );
if( p1 == 0 && p2 == 0 )
{
runda = runda + 1;
ammoq = ammoq + 5;
ammow = ammow + 20;
p1_y = 400;
p1_x = 500;
p2_y = 100;
p2_x = 300;
p1 = 1;
p2 = 1;
}
}
destroy_bitmap( postac );
destroy_bitmap( bufor );
destroy_bitmap( background );
destroy_bitmap( blysk );
destroy_bitmap( blysk2 );
destroy_bitmap( przeciwnik );
allegro_exit();
return 0;
}
END_OF_MAIN();