Mam pewien problem z moim programem w C++, przy użyciu biblioteki allegro. Zrobiłem już kilka klas oraz dodałem klasę PociskWroga, której obiekt jest inicjalizowany(w main.cpp)tablicą obiektów i chciałem ,żeby te obiekty były "malowane" na mojej wersji bitmapy, jednakże "namalowany" zostaje tylko jeden obiekt i do momentu, aż on nie "zginie" żaden inny nie zostanie "namalowany". Podejrzewam, że to może być głupi problem, jedn prosiłbym o pomoc lub podpowiedź, abym się dowiedział co i jak. Wiem, że kod jest trochę długi, ale może znajdzie się ktoś pomocny :)
main.cpp
#include<allegro5\allegro5.h>
#include<allegro5\allegro_font.h>
#include<allegro5\allegro_ttf.h>
#include<allegro5\allegro_audio.h>
#include<allegro5\allegro_acodec.h>
#include<iostream>
#include "kometa.h"
#include "statek.h"
#include "pocisk.h"
#include "eksplozja.h"
#include "Cbitmap.h"
#include "wrog.h"
#include "dodatki.h"
#include "PociskWroga.h"
//==============================================
//ZMIENNE GLOBALNE
//==============================================
enum KEYS{UP, DOWN, LEFT, RIGHT, SPACE};
bool keys[5] = {false, false, false, false, false};
enum STAN{MENU, GRANIE, PRZEGRANA};
ALLEGRO_SAMPLE_INSTANCE *songInstance = NULL;
//==============================================
//DEFINICJA FUNKCJI
//==============================================
void ZmienStan(int &stan, int nowy_stan);
int main()
{
//==============================================
//ZMIENNE ALLEGRO
//==============================================
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
ALLEGRO_TIMER *timer = NULL;
ALLEGRO_FONT *font18 = NULL;
ALLEGRO_BITMAP *shipImage = NULL;
ALLEGRO_BITMAP *kometaImage = NULL;
ALLEGRO_BITMAP *eksplozjaImage = NULL;
ALLEGRO_BITMAP *bgImage = NULL;
ALLEGRO_BITMAP *mgImage = NULL;
ALLEGRO_BITMAP *fgImage = NULL;
ALLEGRO_BITMAP *wrogImage = NULL;
ALLEGRO_BITMAP *dodatekImage = NULL;
ALLEGRO_SAMPLE *song = NULL;
//==============================================
//ZMIENNE PROJEKTOWE
//==============================================
bool done = false;
bool redraw = true;
const int FPS = 60;
int stan = -1;
//==============================================
//FUNKCJE INICJALIZACYJNE ALLEGRO
//==============================================
if(!al_init()) //inicjalizacja allegro
{
return -1;
}
display = al_create_display(WIDTH, HEIGHT); //stworzenie objektu wyswiettlającego
if(!display) //testowanie obiektu wyświetlającego
{
return -1;
}
//==============================================
//ADDON INSTALL ?
//==============================================
al_init_primitives_addon();
al_install_keyboard();
al_init_font_addon();
al_init_ttf_addon();
al_init_image_addon();
al_install_audio();
al_init_acodec_addon();
//==============================================
//INICJALIZACJA ZMIENNYCH
//==============================================
font18 = al_load_font("arial.ttf", 18, 0);
al_reserve_samples(10);
shipImage = al_load_bitmap("statek.png");
al_convert_mask_to_alpha(shipImage, al_map_rgb(255, 0, 255));
kometaImage = al_load_bitmap("kometa.png");
eksplozjaImage = al_load_bitmap("eksplozja.png");
bgImage = al_load_bitmap("starBG.png");
mgImage = al_load_bitmap("starMG.png");
fgImage = al_load_bitmap("starFG.png");
wrogImage = al_load_bitmap("wrog.png");
al_convert_mask_to_alpha(wrogImage, al_map_rgb(255, 0, 255));
dodatekImage = al_load_bitmap("dodatek.png");
song = al_load_sample("hdab.ogg");
songInstance = al_create_sample_instance(song);
al_set_sample_instance_playmode(songInstance, ALLEGRO_PLAYMODE_LOOP);
al_attach_sample_instance_to_mixer(songInstance, al_get_default_mixer());
ZmienStan(stan, MENU);
srand(time(NULL));
//==============================================
//ZMIENNE OBIEKTOWE
//==============================================
statek ship(shipImage);
pocisk bullets[NUM_BULLETS];
kometa comets[NUM_COMETS];
eksplozja eksplozje[NUM_EKSPLOSIONS];
Cbitmap *bg = new Cbitmap;
bg->InitBitmap(0, 0, 1, 0, -1, 1, 800, 600, bgImage);
Cbitmap *mg = new Cbitmap;
mg->InitBitmap(0, 0, 3, 0, -1, 1, 1600, 600, mgImage);
Cbitmap *fg = new Cbitmap;
fg->InitBitmap(0, 0, 5, 0, -1, 1, 800, 600, fgImage);
wrog *wrog1 = new wrog;
wrog1->InitWrog(3, wrogImage);
dodatki *dod = new dodatki;
dod->UstawObraz(dodatekImage);
PociskWroga *w_pocisk = new PociskWroga[NUM_ENEMY_BULLETS];
for (int i = 0; i < NUM_ENEMY_BULLETS; i++)
{
w_pocisk[i].InitPociskWrog(wrog1, w_pocisk, NUM_ENEMY_BULLETS);
}
for (int i = 0; i < NUM_COMETS; i++)
{
comets[i].ustawObraz(kometaImage);
}
for (int i = 0; i < NUM_EKSPLOSIONS; i++)
{
eksplozje[i].ustawObraz(eksplozjaImage);
}
//==============================================
//INICJALIZACJA TIMERA I START
//==============================================
event_queue = al_create_event_queue();
timer = al_create_timer(1.0 / FPS);
al_register_event_source(event_queue, al_get_keyboard_event_source());
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_register_event_source(event_queue, al_get_display_event_source(display));
al_start_timer(timer);
int j = 0;
while (!done)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);
//==============================================
//GAME UPDATE
//==============================================
if (ev.type == ALLEGRO_EVENT_TIMER)
{
redraw = true;
if (keys[UP])
{
ship.moveShipUP();
}
else if (keys[DOWN])
{
ship.moveShipDOWN();
}
else
{
ship.resetShipAnimation(ship, 1);
}
if (keys[LEFT])
{
ship.moveShipLEFT();
}
else if (keys[RIGHT])
{
ship.moveShipRIGHT();
}
else
{
ship.resetShipAnimation(ship, 2);
}
if (stan == MENU)
{
}
else if (stan == GRANIE)
{
bg->UpdateBackground();
mg->UpdateBackground();
fg->UpdateBackground();
wrog1->UpdateWrog();
w_pocisk->UpdatePociskuWrog(w_pocisk, NUM_ENEMY_BULLETS);
wrog1->ZmienLive();
w_pocisk->OdpalPociskWroga(wrog1, w_pocisk, NUM_ENEMY_BULLETS);
dod->UpdateDodatku();
eksplozje->updateEksplozji(eksplozje, NUM_EKSPLOSIONS);
bullets->updatePocisk(bullets, NUM_BULLETS);
w_pocisk->UpdatePociskuWrog(w_pocisk, NUM_ENEMY_BULLETS);
comets->startKomety(comets, NUM_COMETS);
comets->updateKomety(comets, NUM_COMETS);
dod->KolizjaDodatku(ship);
wrog1->KolizjaWroga(ship, eksplozje, NUM_EKSPLOSIONS);
w_pocisk->KolizjaPociskuWroga(ship, eksplozje, NUM_EKSPLOSIONS, w_pocisk, NUM_ENEMY_BULLETS);
bullets->kolizjaPocisku(bullets, NUM_BULLETS, comets, NUM_COMETS, ship, eksplozje, NUM_EKSPLOSIONS, wrog1, dod);
comets->kolizjaKomety(comets, NUM_COMETS, ship, eksplozje, NUM_EKSPLOSIONS);
if (ship.zwroc_lives() <=0)
{
ZmienStan(stan, PRZEGRANA);
}
}
else if (stan == PRZEGRANA)
{
}
}
else if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
{
done = true;
}
//==============================================
//INPUT
//==============================================
else if (ev.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch (ev.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
done = true;
break;
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;
if (stan == MENU)
{
ZmienStan(stan, GRANIE);
}
else if (stan == GRANIE)
{
bullets->odpalPocisk(bullets, NUM_BULLETS, ship);
}
else if (stan == PRZEGRANA)
{
ZmienStan(stan, GRANIE);
ship.ResetujZycia(ship);
bullets->ResetujPocisk();
comets->ResetujKomete(comets, NUM_COMETS);
eksplozje->ResetujEksplozje(eksplozje, NUM_EKSPLOSIONS);
wrog1->ResetWrog();
w_pocisk->ResetPociskWroga(w_pocisk, NUM_ENEMY_BULLETS);
dod->ResetujDodatek();
}
break;
}
}
else if (ev.type == ALLEGRO_EVENT_KEY_UP)
{
switch (ev.keyboard.keycode)
{
case ALLEGRO_KEY_ESCAPE:
done = true;
break;
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;
}
}
//==============================================
//REDRAW
//==============================================
if (redraw && al_is_event_queue_empty(event_queue))
{
redraw = false;
if (stan == MENU)
{
}
else if (stan == GRANIE)
{
bg->RysujBackground();
mg->RysujBackground();
fg->RysujBackground();
ship.drawShip();
wrog1->RysujWrog();
w_pocisk->RysujPociskWroga(w_pocisk, NUM_ENEMY_BULLETS);
dod->RysujDodatek();
bullets->rysujPocisk(bullets, NUM_BULLETS);
comets->rysujKomete(comets, NUM_COMETS);
eksplozje->rysujEksplozje(eksplozje, NUM_EKSPLOSIONS);
if (ship.zwroc_wynik() == 1)
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0, "Gracz posiada %i zycia. Zniszczyles %i komete oraz", ship.zwroc_lives(), ship.zwroc_wynik());
}
else if (ship.zwroc_wynik() > 1 && ship.zwroc_wynik() < 5)
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0, "Gracz posiada %i zycia. Zniszczyles %i komety oraz", ship.zwroc_lives(), ship.zwroc_wynik());
}
else
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0, "Gracz posiada %i zycia. Zniszczyles %i komet oraz", ship.zwroc_lives(), ship.zwroc_wynik());
}
if (ship.zwrocWynik2() == 1)
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 400, 5, 0, "%i statek", ship.zwrocWynik2());
}
else if (ship.zwrocWynik2() > 1 && ship.zwrocWynik2() < 5)
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 400, 5, 0, "%i statki", ship.zwrocWynik2());
}
else
{
al_draw_textf(font18, al_map_rgb(255, 0, 255), 400, 5, 0, "%i statkow", ship.zwrocWynik2());
}
}
else if (stan == PRZEGRANA)
{
al_draw_textf(font18, al_map_rgb(0, 255, 255), WIDTH / 2, HEIGHT / 2, ALLEGRO_ALIGN_CENTRE, "KONIEC GRY! WYNIK KONCZOWY: %i", ship.zwroc_wynik());
}
al_flip_display();
al_clear_to_color(al_map_rgb(0, 0, 0));
}
}
delete bg;
delete mg;
delete fg;
delete wrog1;
delete dod;
delete [] w_pocisk;
al_destroy_bitmap(dodatekImage); // zniszczeni obrazu dodatku
al_destroy_bitmap(wrogImage); // zniszczeni obrazu wroga
al_destroy_bitmap(bgImage); // zniszczeni obrazu bg
al_destroy_bitmap(mgImage); // zniszczeni obrazu mg
al_destroy_bitmap(fgImage); // zniszczeni obrazu fg
al_destroy_sample(song); // zniszczenie muzyki "song"
al_destroy_bitmap(shipImage); // znieszczenie obrazu statku
al_destroy_bitmap(kometaImage); // zniszczenie obrazu komety
al_destroy_bitmap(eksplozjaImage); // zniszczenie obrazu eksplozji
al_destroy_event_queue(event_queue); // znieszczenie kolejki
al_destroy_timer(timer); // znieszczenie timera
al_destroy_display(display); //znieszczenie obiektu wyświetlającegoa
return 0;
}
void ZmienStan(int &stan, int nowy_stan)
{
if (stan == MENU)
{
}
else if (stan == GRANIE)
{
al_stop_sample_instance(songInstance);
}
else if (stan == PRZEGRANA)
{
}
stan = nowy_stan;
if (stan == MENU)
{
}
else if (stan == GRANIE)
{
al_play_sample_instance(songInstance);
}
else if (stan == PRZEGRANA)
{
}
}
Klasa wrog.h
#pragma once
#include "statek.h"
#include "eksplozja.h"
#include "dodatki.h"
class wrog
{
public:
wrog(void);
~wrog(void);
private:
int ID;
int x;
int y;
int bound_x;
int bound_y;
int lives;
int speed;
bool live;
bool gora;
bool dol;
ALLEGRO_BITMAP *image;
public:
void InitWrog(int w_lives, ALLEGRO_BITMAP *w_image);
void RysujWrog(void);
void KolizjaWroga(statek &ship, eksplozja eksplozja[], int eSize);
void UpdateWrog(void);
void ResetWrog(void);
void ZmniejszZycie(statek &statek, dodatki *dodatek);
void ZmienLive(void);
bool ZwrocLive(void);
int ZwrocX(void);
int ZwrocY(void);
int ZwrocBoundX(void);
int ZwrocBoundY(void);
};
metody klasy wrog, wrog.cpp
#include "wrog.h"
#include "PociskWroga.h"
wrog::wrog(void)
{
}
wrog::~wrog(void)
{
}
void wrog::InitWrog(int w_lives, ALLEGRO_BITMAP *w_image)
{
ID = ENEMY;
x = WIDTH - 15;
y = HEIGHT / 2;
bound_x = 25;
bound_y = 24;
lives = w_lives;
speed = 4;
live = true;
gora = true;
dol = false;
image = w_image;
}
void wrog::RysujWrog(void)
{
if (live)
{
al_draw_bitmap(image, x - 25, y - 24, 0);
}
}
void wrog::KolizjaWroga(statek &ship, eksplozja eksplozja[], int eSize)
{
if (live)
{
if (x - bound_x < ship.zwroc_x() + ship.zwroc_boundx() &&
x + bound_x > ship.zwroc_x() - ship.zwroc_boundx() &&
y - bound_y < ship.zwroc_y() + ship.zwroc_boundy() &&
y + bound_y > ship.zwroc_y() - ship.zwroc_boundy())
{
ship.zmniejsz_zycie();
ResetWrog();
eksplozja->startEksplozji(eksplozja, eSize, ship.zwroc_x(), ship.zwroc_y());
}
else if (x <= 0)
{
ResetWrog();
}
}
}
void wrog::UpdateWrog(void)
{
if (live)
{
x -= speed * 0.2;
if (gora)
{
y -= speed;
if (y <= 10)
{
gora = false;
dol = true;
}
}
else
{
y += speed;
if (y >= HEIGHT - 10)
{
gora = true;
dol = false;
}
}
if (x < 0)
{
live = false;
}
}
}
void wrog::ResetWrog(void)
{
live = false;
x = WIDTH - 15;
y = HEIGHT / 2;
lives = 3;
}
void wrog::ZmniejszZycie(statek &statek, dodatki *dodatek)
{
lives--;
if (lives <= 0)
{
statek.zwiekszWynik2();
if (rand() % 2 == 0)
{
dodatek->StartDodatku(ZwrocX(), ZwrocY());
}
ResetWrog();
}
}
void wrog::ZmienLive(void)
{
if (!live)
{
if (rand() % 10 == 0)
{
live = true;
}
}
}
bool wrog::ZwrocLive(void)
{
return live;
}
int wrog::ZwrocX(void)
{
return x;
}
int wrog::ZwrocY(void)
{
return y;
}
int wrog::ZwrocBoundX(void)
{
return bound_x;
}
int wrog::ZwrocBoundY(void)
{
return bound_y;
}
klasa PociskWroga.h
#pragma once
#include <allegro5\allegro_primitives.h>
#include "wrog.h"
class PociskWroga
{
public:
PociskWroga(void);
~PociskWroga(void);
private:
int fire_x;
int fire_y;
int fire_bound_x;
int fire_bound_y;
int fire_speed;
bool fire_live;
//ALLEGRO_BITMAP *image;
public:
void InitPociskWrog(wrog *wrog1, PociskWroga pocisk[], int pSize);
void UpdatePociskuWrog(PociskWroga pocisk[], int pSize);
void OdpalPociskWroga(wrog *wrog1, PociskWroga pocisk[], int pSize);
void KolizjaPociskuWroga(statek &ship, eksplozja eksplozja[], int eSize, PociskWroga pocisk[], int pSize);
void RysujPociskWroga(PociskWroga pocisk[], int pSize);
void ResetPociskWroga(PociskWroga pocisk[], int pSize);
void ZmienZycie(void);
};
Metody klasy PociskWroga, PociskWroga.cpp
#include "PociskWroga.h"
PociskWroga::PociskWroga(void)
{
}
PociskWroga::~PociskWroga(void)
{
}
void PociskWroga::InitPociskWrog(wrog *wrog1, PociskWroga pocisk[], int pSize)
{
for (int i = 0; i < pSize; i++)
{
//pocisk[i].fire_x = wrog1->ZwrocX() - 17;
//pocisk[i].fire_y = wrog1->ZwrocY();
pocisk[i].fire_bound_x = 20;
pocisk[i].fire_bound_y = 20;
pocisk[i].fire_speed = 6;
pocisk[i].fire_live = false;
}
}
void PociskWroga::UpdatePociskuWrog(PociskWroga pocisk[], int pSize)
{
for (int i = 0; i < pSize; i++)
{
if (pocisk[i].fire_live)
{
pocisk[i].fire_x -= pocisk[i].fire_speed;
//RysujPociskWroga();
if (pocisk[i].fire_x < 0)
{
//ZmienBool2();
pocisk[i].fire_live = false;
}
}
}
}
void PociskWroga::OdpalPociskWroga(wrog *wrog1, PociskWroga pocisk[], int pSize)
{
for (int i = 0; i < pSize; i++)
{
if (wrog1->ZwrocLive() && pocisk[i].fire_live == false)
{
//if (rand() % 2 == 0)
//{
pocisk[i].fire_x = wrog1->ZwrocX() - 15;
pocisk[i].fire_y = wrog1->ZwrocY();
pocisk[i].fire_live = true;
break;
//}
}
}
}
void PociskWroga::KolizjaPociskuWroga(statek &ship, eksplozja eksplozja[], int eSize, PociskWroga pocisk[], int pSize)
{
for (int i = 0; i <pSize; i++)
{
if (fire_live)
{
if (fire_x - fire_bound_x < ship.zwroc_x() + ship.zwroc_boundx() &&
fire_x + fire_bound_x > ship.zwroc_x() - ship.zwroc_boundx() &&
fire_y - fire_bound_y < ship.zwroc_y() + ship.zwroc_boundy() &&
fire_y + fire_bound_y > ship.zwroc_y() - ship.zwroc_boundy())
{
ship.zmniejsz_zycie();
ResetPociskWroga(pocisk, pSize);
eksplozja->startEksplozji(eksplozja, eSize, ship.zwroc_x(), ship.zwroc_y());
}
else if (fire_x <= 10)
{
ResetPociskWroga(pocisk, pSize);
//ship.zmniejsz_zycie();
}
}
}
}
void PociskWroga::RysujPociskWroga(PociskWroga pocisk[], int pSize)
{
if (fire_live)
{
al_draw_filled_circle(fire_x - 20, fire_y, 5, al_map_rgb(255, 111, 255));
}
}
void PociskWroga::ResetPociskWroga(PociskWroga pocisk[], int pSize)
{
for (int i = 0; i < pSize; i++)
{
pocisk[i].fire_live = false;
pocisk[i].fire_x = 10;//x;
pocisk[i].fire_y = 10;//y;
}
}
void PociskWroga::ZmienZycie(void)
{
if (fire_live)
{
fire_live = false;
}
else
{
fire_live = true;
}
}
klasa statek.h
#pragma once
#include<allegro5\allegro_primitives.h>
#include "globalne.h"
class statek
{
public:
statek(ALLEGRO_BITMAP *simage);
~statek(void);
private:
int ID;
int x;
int y;
int lives;
int speed;
int boundx;
int boundy;
int score;
int score2;
int max_frame;
int cur_frame;
int frame_count;
int frame_delay;
int frame_width;
int frame_height;
int animation_columns;
int animation_direction;
int animation_row;
ALLEGRO_BITMAP *image;
public:
void resetShipAnimation(statek &statek, int pozycja);
void moveShipUP(void);
void moveShipDOWN(void);
void moveShipLEFT(void);
void moveShipRIGHT(void);
void drawShip(void);
int zwroc_x(void);
int zwroc_y(void);
int zwroc_boundx(void);
int zwroc_boundy(void);
int zwroc_lives(void);
int zwroc_wynik(void);
int zwrocWynik2(void);
void zwiekszWynik(void);
void zwiekszWynik2(void);
void zmniejsz_zycie(void);
void ZwiekszZycie(void);
void ResetujZycia(statek &statek);
};
metody klasy statek, statek.cpp
#include "statek.h"
statek::statek(ALLEGRO_BITMAP *simage)
{
x = 20;
y = HEIGHT / 2;
ID = PLAYER;
lives = 10;
speed = 7;
boundx = 6;
boundy = 7;
score = 0;
score2 = 0;
max_frame = 3;
cur_frame = 0;
frame_count = 0;
frame_delay = 50;
frame_width = 46;
frame_height = 41;
animation_columns = 3;
animation_direction = 1;
animation_row = 1;
image = simage;
}
statek::~statek(void)
{
}
void statek::resetShipAnimation(statek &statek, int pozycja)
{
if (pozycja == 1)
{
animation_row = 1;
}
else
{
cur_frame = 0;
}
}
void statek::moveShipUP(void)
{
animation_row = 0;
y -= speed;
if (y < 0)
{
y = 0;
}
}
void statek::moveShipDOWN(void)
{
animation_row = 2;
y += speed;
if (y > 650)
{
y = 650;
}
}
void statek::moveShipLEFT(void)
{
cur_frame = 2;
x -= speed;
if (x < 12)
{
x = 12;
}
}
void statek::moveShipRIGHT(void)
{
cur_frame = 1;
x += speed;
if (x > 450)
{
x = 450;
}
}
void statek::drawShip(void)
{
int fx = (cur_frame % animation_columns) * frame_width;
int fy = animation_row * frame_height;
al_draw_bitmap_region(image, fx, fy, frame_width, frame_height, x - frame_width / 2, y - frame_height / 2, 0);
}
int statek::zwroc_x(void)
{
return x;
}
int statek::zwroc_y(void)
{
return y;
}
int statek::zwroc_boundx(void)
{
return boundx;
}
int statek::zwroc_boundy(void)
{
return boundy;
}
int statek::zwroc_lives(void)
{
return lives;
}
int statek::zwroc_wynik(void)
{
return score;
}
int statek::zwrocWynik2(void)
{
return score2;
}
void statek::zwiekszWynik()
{
score++;
}
void statek::zwiekszWynik2(void)
{
score2++;
}
void statek::zmniejsz_zycie(void)
{
lives--;
}
void statek::ZwiekszZycie(void)
{
lives++;
}
void statek::ResetujZycia(statek &statek)
{
x = 20;
y = HEIGHT / 2;
ID = PLAYER;
lives = 10;
speed = 7;
boundx = 6;
boundy = 7;
score = 0;
}
klasa pocisk.h
#pragma once
#include "kometa.h"
#include "eksplozja.h"
#include "wrog.h"
class pocisk
{
public:
pocisk(void);
~pocisk(void);
private:
int ID;
int x;
int y;
bool live;
int speed;
public:
void rysujPocisk(pocisk pocisk[], int size);
void odpalPocisk(pocisk pociski[], int size, statek ship);
void updatePocisk(pocisk pocisk[], int size);
void kolizjaPocisku(pocisk pocisk[], int pSize, kometa kometa[], int kSize, statek &statek, eksplozja eksplozja[], int eSize, wrog *wrog1, dodatki *dod);
void ResetujPocisk();
};
metody klasy pocisk, pocisk.cpp
#include "pocisk.h"
//#include "globalne.h"
pocisk::pocisk(void)
{
ID = BULLET;
speed = 10;
live = false;
}
pocisk::~pocisk(void)
{
}
void pocisk::rysujPocisk(pocisk pocisk[], int size)
{
for (int i = 0; i < size; i++)
{
if (pocisk[i].live)
{
al_draw_filled_circle(pocisk[i].x, pocisk[i].y, 2, al_map_rgb(255, 255, 255));
}
}
}
void pocisk::odpalPocisk(pocisk pociski[], int size, statek ship)
{
for (int i = 0; i < size; i++)
{
if (!pociski[i].live)
{
pociski[i].x = ship.zwroc_x() + 17;
pociski[i].y = ship.zwroc_y();
pociski[i].live = true;
break;
}
}
}
void pocisk::updatePocisk(pocisk pocisk[], int size)
{
for (int i = 0; i < size; i++)
{
if (pocisk[i].live)
{
pocisk[i].x += pocisk[i].speed;
if (pocisk[i].x > WIDTH)
{
pocisk[i].live = false;
}
}
}
}
void pocisk::kolizjaPocisku(pocisk pocisk[], int pSize, kometa kometa[], int kSize, statek &statek, eksplozja eksplozja[], int eSize, wrog *wrog1, dodatki *dod)
{
for (int i = 0; i < pSize; i++)
{
if (pocisk[i].live)
{
for (int j = 0; j < kSize; j++)
{
if (kometa[j].zwroc_live())
{
if (pocisk[i].x > (kometa[j].zwroc_x() - kometa[j].zwroc_boundx()) &&
pocisk[i].x < (kometa[j].zwroc_x() + kometa[j].zwroc_boundx()) &&
pocisk[i].y > (kometa[j].zwroc_y() - kometa[j].zwroc_boundy()) &&
pocisk[i].y < (kometa[j].zwroc_y() + kometa[j].zwroc_boundy()))
{
pocisk[i].live = false;
kometa[j].zmienBool();
statek.zwiekszWynik();
eksplozja->startEksplozji(eksplozja, eSize, pocisk[i].x, pocisk[i].y);
}
}
}
if (wrog1->ZwrocLive())
{
if (pocisk[i].x > (wrog1->ZwrocX() - wrog1->ZwrocBoundX()) &&
pocisk[i].x < (wrog1->ZwrocX() + wrog1->ZwrocBoundX()) &&
pocisk[i].y > (wrog1->ZwrocY() - wrog1->ZwrocBoundY()) &&
pocisk[i].y < (wrog1->ZwrocY() + wrog1->ZwrocBoundY()))
{
pocisk[i].live = false;
wrog1->ZmniejszZycie(statek, dod);
eksplozja->startEksplozji(eksplozja, eSize, pocisk[i].x, pocisk[i].y);
}
}
}
}
}
void pocisk::ResetujPocisk()
{
ID = BULLET;
speed = 10;
live = false;
}
Są jeszcze klasy bitmapy, eksplozji, komety oraz dodatku, ale one w tym przypadku nie odgrywają żadnej roli. Jeżeli ktoś domyśli się, badź wie jaki błąd popełniłem, proszę o pomoc :)