Data: 2010-06-03 14:03:47
wojownik266 | [Allegro] kosmiczna strzelanka
Mam już napisany kawałek gry, która zachowuje się tak jak sobie to zaplanowałem. statki(wrogowie) poruszają się z góry na dół a statek (bohater) porusza się w pozimie z lewej do prawej i na odwrót oddając przy tym strzały (po nacisnieciu spacji), i wszystko niby jest okey poza takim mankamentem że po zajsciu kolizji pocisku z wrogim statkiem następuje kolizja która się nie kończy bo kiedy statek wroga znajduje się jeszcze u góry ekranu a statek bohater na lini jego lotu (toru lotu), następuje znowu kolizja... Co zrobić aby kolizja następowała tylko po oddaniu strzału i trafieniu pociskiem wrogiego statku? Ani wcześniej ani później? Poniżej kod programu a tutaj link do kodu źródłowego (załącznika) i grafik: http://www.easykoder.vot.pl/forum/showthread.php?tid=152 Prawie na samym dole:"kosmiczna strzelanka".
#include <allegro.h> #include <vector>
using std::vector;
BITMAP* bufor=NULL; BITMAP* niebo = NULL; BITMAP* niebo1 = NULL; BITMAP* statek = NULL; BITMAP* pocisk = NULL; SAMPLE* laser = NULL; MIDI* muzyczka;
volatile long int speed=0; volatile long int k = 0;
void increment_speed() { speed++; } END_OF_FUNCTION(increment_speed); LOCK_FUNCTION(increment_speed); LOCK_VARIABLE(speed); LOCK_VARIABLE(k);
class Bohater { public: int poz_x,poz_y; short int x,y; short int s,w; vector<BITMAP*>spodki; Bohater(); ~Bohater(); };
Bohater::Bohater() { spodki.reserve(10); }
Bohater::~Bohater() { }
bool kolizja(float x1,float y1,float s1,float w1,float x2,float y2,float s2,float w2) { if(x1+s1>=x2 && x1<=x2+s2 && y1+w1>=y2 && y1<=y2+w2) return(true); return(false); };
int main() { allegro_init(); install_keyboard(); install_timer(); set_color_depth(16); set_gfx_mode(GFX_AUTODETECT,640,480,0,0); install_int_ex(increment_speed,BPS_TO_TIMER(80)); detect_digi_driver(DIGI_AUTODETECT); detect_midi_driver(MIDI_AUTODETECT); install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT, NULL);
Bohater boh,wrog[10],pocisk0[10];// Obiekty klasy Bohater //Wczytywanie grafik i dzwięków muzyczka = load_midi ("muzyczka.mid"); laser = load_sample("laser.wav"); bufor=create_bitmap(640,480); niebo=load_bmp("glob.bmp", default_palette); niebo1=load_bmp("glob.bmp", default_palette); statek =load_bmp ("statek.bmp",NULL); pocisk =load_bmp ("pocisk.bmp", NULL); for (int i=0;i<10;++i) boh.spodki[i]=load_bmp("spodek.bmp", NULL);
boh.x=320, boh.y=420; int pociskx=320, pocisky=420;// Poruszanie pociskiem int pozsx=320,pozsy=420;// Zmienne do statek
for ( int i=0;i<10;++i) { wrog[i].x=40; wrog[i].y=40; wrog[i].s=40; wrog[i].w=40; }
pocisk0[0].x=320, pocisk0[0].y=420,pocisk0[0].w=40, pocisk0[0].s=40; //Zmienne potrzebne do scrollowania tła int niebo_x = 0, niebo_y = 0; int niebo1_x = 0, niebo1_y = 0; int niebo2_x = 0, niebo2_y = 0; int mapa_y=0, ekran_y=480; int obraz_y=ekran_y;
play_midi( muzyczka, 1); while (!key[KEY_ESC]) { clear_to_color(bufor,makecol(0,0,0)); niebo_y = -mapa_y%ekran_y; niebo1_y = ekran_y-mapa_y%ekran_y; mapa_y++; blit( niebo, bufor, 0,0, niebo_x, niebo_y, niebo->w, niebo->h); blit( niebo1, bufor, 0,0, niebo1_x, niebo1_y, niebo1->w, niebo1->h);
while (speed>0) { if (key[KEY_LEFT]){pozsx-=2;pocisk0[0].x-=2; } if (key[KEY_RIGHT]){pozsx+=2;pocisk0[0].x+=2;} if (key[KEY_SPACE]) {
/*Przemieszczanie pocisku*/ for (int i=0;i<=10;++i) { if (pocisk0[i].y<480) { pocisk0[i].y-=15; } if (pocisk0[i].y<=0) { pocisk0[i].y=420; //pocx=320; } pocisk0[i].y--; }
create_bitmap(pocisk->w,pocisk->h);/* kopiowanie pocisku do bufora*/ masked_blit(pocisk,bufor,0,0,pocisk0[0].x,pocisk0[0].y,pocisk0[0].s,pocisk0[0].w); } speed--;
} /*Scrollowanie statków, wrogów*/ for (int i=0;i<10;++i) { if (wrog[i].y<480) { wrog[i].y+=2;
} else if (wrog[i].y>=480) { wrog[i].x=20; wrog[i].y=20; } } k++; if(k == 256) k = 0;
// rect(bufor,0,0,bufor->w - 1,bufor->h - 1,makecol(255,255,255));
// rotate_sprite(bufor,boh.spodki[0], wrog.x-80 , wrog.y+40 ,itofix(k));
masked_blit(boh.spodki[0],bufor,0,0,wrog[0].x=200,wrog[0].y+40,wrog[0].s,wrog[0].w); masked_blit(boh.spodki[1],bufor,0,0,wrog[1].x=280,wrog[1].y+120,wrog[1].s,wrog[1].w); masked_blit(boh.spodki[2],bufor,0,0,wrog[2].x=360,wrog[2].y+40,wrog[2].s,wrog[2].w); masked_blit(statek,bufor,0,0,pozsx,pozsy,statek->w,statek->h);
if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[0].x,wrog[0].y,wrog[0].s, wrog[0].w)==true) { textprintf_ex(bufor, font, 0, 460, makecol(255, 255, 0), -1, "Kolizja 0"); play_sample(laser,2000,1000,255,0);
} if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[1].x,wrog[1].y,wrog[1].s, wrog[1].w)==true) { textprintf_ex(bufor, font, 0, 460, makecol(155, 155, 0), -1, "Kolizja 1"); play_sample(laser,2000,1000,255,0); } if (kolizja(pocisk0[0].x,pocisk0[0].y, pocisk0[0].s, pocisk0[0].w,wrog[2].x,wrog[2].y,wrog[2].s, wrog[2].w)==true) { textprintf_ex(bufor, font, 0, 460, makecol(255,255,255), -1, "Kolizja 2"); play_sample(laser,2000,1000,255,0); }
blit(bufor, screen,0,0,0,0,640,480); } for (int i=0;i<10;++i) destroy_bitmap(boh.spodki[i]); destroy_bitmap(bufor); destroy_bitmap(niebo); destroy_bitmap(pocisk); destroy_sample(laser); allegro_exit(); return 0; } END_OF_MAIN(); | Data: 2010-06-11 09:00:27
lemis.aryl |
Statki wroga tak zasuwają, że ich prawie nie widać. | |
| Statystyki tematu | Ostatnio przeczytali |
|---|
| Czytało użytkowników: | 30 | maciejo, Iromix, shutdown, adwi32, madmike44, dmx81, Czarnt, pixelmaster, filipesq, szyx_yankez, Dragonit, michalp, Piotr Szawdyński, SeaMonster131, lenrokskate, TheLukon, Patzick, malan, Iname (√ιק), lemis.aryl | | Przeczytało użytkowników: | 20 | | Czytało osób ogólnie: | 71 | | Przeczytało osób ogólnie: | 44 |
| Ostatnia Aktualizacja| 2010-09-01 19:27:34 (4 dni temu) | |
| Ostatnio aktywni |
|---|
| Mateusz124 | 4 min | | SeaMonster131 | 9 min | | Gronek8624 | 21 min | | wiew | 68 min | | Koni | 79 min | | fish13 | 1 godz | | wiewiorka | 2 godz | | lenrokskate | 9 godz | | dmx81 | 11 godz | | steckel | 12 godz | | pixelmaster | 15 godz | | maciejo | 15 godz |
|