Pociski Allegro5

0

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;
			}
		}
	}


 
0

Twoja funkcja strzelania wystrzeliwuje wszystkie pociski na raz , są one nałożone na siebie dlatego wydaje ci się że strzelasz 1 pocisk, dodaj prostą funkcję dzięki której ograniczysz liczbę wystrzeliwanych pocisków.

przy okazji:



 void DrawBullet(Bullet bullet[], int size){
        for(int i=0;i<size;i++){
            if(bullet[i].live=true)   //<<<< nie powinno byc "==" ??  bez tego twój pocisk zawsze będzie rysowany.
                al_draw_filled_circle(bullet[i].x,bullet[i].y,10,al_map_rgb(252,255,0));
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1