Pociski Allegro5

Odpowiedz Nowy wątek
2014-12-12 15:38
Mały Lew
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;
            }
        }
    }
 

Pozostało 580 znaków

2014-12-20 21:12
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));
        }
    }

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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