Witam mam problem z moją pierwsza gra, mianowicie gdy oddaje strzaly na ekranie moze znajdywac sie tylko jeden pocisk, nie wiem dlaczego. Prosze o pomoc chcialem zeby maksymalna iloscia pociskow na ekranie bylo 5, nigdzie nie moge dopatrzyc sie bledu. Oto najwazniejszy fragment kodu odpowiedzialny za strzelanie.
#include<iostream>
#include<allegro5\allegro_native_dialog.h>
#include<allegro5\allegro_font.h>
#include<allegro5\allegro_ttf.h>
#include<allegro5\allegro_image.h>
#include<allegro5\allegro_primitives.h>
#include"header.h"
void InitShip(ship &gracz);
void Drawship(ship &gracz);
void Moveshipleft(ship &gracz);
void Moveshipright(ship &gracz);
void Moveshipup(ship &gracz);
void Moveshipdown(ship &gracz);
void InitBullet(Bullet bullet[], int size);
void DrawBullet(Bullet bullet[], int size);
void FireBullet(Bullet bullet[], int size,ship &gracz);
void UpdateBullet(Bullet bullet[], int size);
enum KEYS{UP,DOWN,LEFT,RIGHT,SPACE};
bool keys[5]={false,false,false,false,false};
const int NUM_BULLETS=5;
int main(void){
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_DISPLAY_MODE disp_mode;
ALLEGRO_FONT *font;
ALLEGRO_BITMAP *image;
ALLEGRO_BITMAP *bcg;
bool done= false;
bool redraw = true;
// header.h
ship gracz;
Bullet bullets[5];
if(!al_init()) return -1;
al_set_new_display_flags(ALLEGRO_FULLSCREEN);
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
if(!(display=al_create_display(disp_mode.width,disp_mode.height))){
al_show_native_message_box(NULL,NULL,NULL,"BLAD AL_CREATE_DISPLAY",NULL,ALLEGRO_MESSAGEBOX_ERROR);
return -2;
}
al_init_image_addon();
al_init_font_addon();
al_init_ttf_addon();
al_init_primitives_addon();
al_install_keyboard();
ALLEGRO_TIMER *timer=al_create_timer(1.0/90);
ALLEGRO_EVENT_QUEUE *ev_queue=al_create_event_queue();
al_register_event_source(ev_queue,al_get_keyboard_event_source());
al_register_event_source(ev_queue,al_get_timer_event_source(timer));
al_register_event_source(ev_queue,al_get_display_event_source(display));
image=al_load_bitmap("gracz2.png");
bcg=al_load_bitmap("space.jpg");
InitShip(gracz);
InitBullet(bullets, NUM_BULLETS);
al_start_timer(timer);
//Główna pętla gry
while(!done){
ALLEGRO_EVENT event;
al_wait_for_event(ev_queue,&event);
if(event.type==ALLEGRO_EVENT_TIMER){
redraw=true;
if(keys[UP])
Moveshipup(gracz);
if(keys[DOWN])
Moveshipdown(gracz);
if(keys[LEFT])
Moveshipleft(gracz);
if(keys[RIGHT])
Moveshipright(gracz);
UpdateBullet(bullets, NUM_BULLETS);
}
else if(event.type==ALLEGRO_EVENT_DISPLAY_CLOSE){
done=true;
}
//obsluga klawiatury
else if(event.type==ALLEGRO_EVENT_KEY_DOWN){
switch(event.keyboard.keycode){
case ALLEGRO_KEY_UP:
keys[UP]=true;
break;
case ALLEGRO_KEY_DOWN:
keys[DOWN]=true;
break;
case ALLEGRO_KEY_LEFT:
keys[LEFT]=true;
break;
case ALLEGRO_KEY_RIGHT:
keys[RIGHT]=true;
break;
case ALLEGRO_KEY_SPACE:
keys[SPACE]=true;
FireBullet(bullets, NUM_BULLETS, gracz);
break;
case ALLEGRO_KEY_ESCAPE:
done=true;
break;
}
}
else if(event.type==ALLEGRO_EVENT_KEY_UP){
switch(event.keyboard.keycode)
{
case ALLEGRO_KEY_UP:
keys[UP]=false;
break;
case ALLEGRO_KEY_DOWN:
keys[DOWN]=false;
break;
case ALLEGRO_KEY_LEFT:
keys[LEFT]=false;
break;
case ALLEGRO_KEY_RIGHT:
keys[RIGHT]=false;
break;
case ALLEGRO_KEY_SPACE:
keys[SPACE]=false;
break;
case ALLEGRO_KEY_ESCAPE:
done=true;
break;
}
}
// rysowanie modelów
if(redraw && al_is_event_queue_empty(ev_queue)){
redraw=false;
al_clear_to_color(al_map_rgb(0,0,0));
al_draw_bitmap(bcg,0,0,0);
Drawship(gracz);
DrawBullet(bullets, NUM_BULLETS);
al_flip_display();
}
}
al_destroy_display(display);
return 0;
}
void InitShip(ship &gracz){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
gracz.x=disp_mode.width/2;
gracz.y=disp_mode.height/2;
gracz.id=player;
gracz.lives=3;
gracz.speed=7;
gracz.boundx=6;
gracz.boundy=7;
gracz.score=0;
}
//rysowanie i poruszanie sie statku gracza
void Drawship(ship &gracz){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
ALLEGRO_BITMAP *image;
image=al_load_bitmap("gracz2.png");
int x=gracz.x,y=gracz.y;
int frameWidth = 48;
int frameHeight = 48;
al_draw_bitmap(image, x, y, 1);
}
void Moveshipup(ship &gracz){
gracz.y-=gracz.speed;
if(gracz.y<0)
gracz.y=0;
}
void Moveshipdown(ship &gracz){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
int frameWidth = 48;
int frameHeight = 48;
gracz.y+=gracz.speed;
if(gracz.y+frameHeight>disp_mode.height)
gracz.y=disp_mode.height-frameHeight;
}
void Moveshipleft(ship &gracz){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
int frameWidth=48;
gracz.x-=gracz.speed;
if(gracz.x<0) gracz.x=disp_mode.width-frameWidth;
}
void Moveshipright(ship &gracz){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
int frameWidth=48;
gracz.x+=gracz.speed;
if(gracz.x+frameWidth>disp_mode.width)
gracz.x=0;
}
//pociski
void InitBullet(Bullet bullet[], int size){
for(int i =0;i<size;i++){
bullet[i].ID=111;
bullet[i].speed=10;
bullet[i].live=false;
}
}
void DrawBullet(Bullet bullet[], int size){
for(int i=0;i<size;i++){
if(bullet[i].live=true)
al_draw_filled_circle(bullet[i].x,bullet[i].y,10,al_map_rgb(252,255,0));
}
}
void FireBullet(Bullet bullet[], int size,ship &gracz){
for(int i=0;i<size;i++){
if(bullet[i].live){
bullet[i].x=gracz.x+24;
bullet[i].y=gracz.y;
bullet[i].live=true;
break;
}
}
}
void UpdateBullet(Bullet bullet[], int size){
ALLEGRO_DISPLAY_MODE disp_mode;
al_get_display_mode(al_get_num_display_modes()-1,&disp_mode);
for(int i=0;i<size;i++){
if(bullet[i].live){
bullet[i].y-=bullet[i].speed;
if(bullet[i].y<disp_mode.height)
bullet[i].live=false;
}
}
}