wojownik266 Temat założony przez niniejszego użytkownika |
[Allegro] kolizja z mapą i auto_ptr znikanie » 2010-01-20 14:33:59 Witam. Chodzi mi o napisanie takiego programiku z uzyciem klasy auto_ptr i mapy w którym to programie następowała by kolizja bohatera z mapą a na skutek tej kolizji znikał kafelek mapy(czer_kula) z którym koliduje bohater(nieb_kula) a reszta mapy pozostawała nienaruszona i tak w koło macieju. Pomoże mi ktoś napisać taki prosty przykładzik opisanego problemu ?
Moje wypociny mają się tak: [source code src = "C++" zwin]
#include <allegro.h> #include <memory> using namespace std;
BITMAP *bufor = NULL; BITMAP *nieb_kula=NULL; SAMPLE *skok = NULL;
class kulka { public: kulka(){} ~kulka(){} short int x1[10][12]; short int y1[10][12]; short int s1[10][12]; short int w1[10][12];
BITMAP *czer_kula; }; auto_ptr<kulka> ptr(new kulka); class bohater { public: short int x,y; short int xx, yy; short int s,w; short int kierunek, klatka; int hp; int exp; int lvl; int max_exp; int pexp; int max_hp; int zloto; int xl, yl;
void hpup(int ile); void hpdown(int ile); void expup(int ile); void expdown(int ile); void lvlup(); void wyswietl(BITMAP*); void dodaj_wartosci(); void update(); void idz(); char string[]; void skacz();
}; void bohater::hpup(int ile) { hp += ile; if (hp>max_hp) { hp=max_hp;
} } void bohater::hpdown(int ile) { hp -= ile ; if (hp<0) hp=0; }
void bohater::expup(int ile) { exp += ile;
} void bohater::expdown(int ile) { exp -= ile ; if (exp<0) exp=0; } void bohater::lvlup() { lvl++; max_exp=lvl*1000; exp=0; hpup(lvl * 50); max_hp=lvl * 200; zloto+=100;
}
void bohater::wyswietl(BITMAP * bufor) { textprintf_ex(bufor, font, 4, 4, makecol(255, 255, 0), -1, "CZAS %d ",0); textprintf_ex(bufor, font, 4, 16, makecol(255,255, 0), -1, "PUNKTY %d ",0);
} void bohater::dodaj_wartosci() { lvl=1; hp=lvl * 100; max_hp=200; exp=1000; max_exp=lvl * 2000; pexp= max_exp-exp; zloto=100;
} void bohater::update() { pexp= max_exp-exp;
} volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION(increment_speed); LOCK_VARIABLE(speed); LOCK_FUNCTION(increment_speed); //kafelki mapy short int map[10][12]= {
6,6,6,6,6,6,6,6,6,0,0,0, 6,1,0,1,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,0,6,6,1, 6,1,6,0,6,6,6,1,1,1,6,6, 6,6,6,6,6,6,1,6,6,6,1,6, 6,6,6,6,6,6,6,1,1,1,6,6, 6,6,6,6,1,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6, }; int mapa_x = 0, mapa_y = 0;//Zmienne do mapy // Funkcja wyświetlająca mapę: void wys_mape() { int licznik_x, licznik_y; for (licznik_x = 0; licznik_x < 12 ; licznik_x++) { for (licznik_y = 0; licznik_y < 10 ; licznik_y++) { masked_blit(ptr->czer_kula,bufor, (map[licznik_y + mapa_y][licznik_x + mapa_x]%8) * 80, (map[licznik_y + mapa_y][licznik_x + mapa_x]/8) * 80, licznik_x * 80,licznik_y * 80,80,80);
} } }; bool kolizja1(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(); set_palette(default_palette); set_color_depth(16); install_timer(); install_int_ex(increment_speed,BPS_TO_TIMER(100)); set_gfx_mode(GFX_AUTODETECT_FULLSCREEN,1280,1024,0,0); install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,""); set_volume(255,255); ptr->czer_kula = load_bmp("czer_kula.bmp",NULL); nieb_kula = load_bmp("kula.bmp",NULL); skok=load_sample("skok.wav"); bufor=create_bitmap(1280,1024);
bohater ludek; ludek.x=640,ludek.y=612,ludek.s=80,ludek.w=80; for(int i=0;i<10;++i) for(int j=0;j<12;++j) { ptr->x1[i][j]=80; ptr->y1[i][j]=80; ptr->s1[i][j]=80; ptr->w1[i][j]=80; }
while(!key[KEY_ESC]) { clear_to_color(bufor,makecol(0,0,0)); while(speed>0) { if(key[KEY_LEFT]) {ludek.x--;} if(key[KEY_RIGHT]){ludek.x++;} if(key[KEY_UP]) {ludek.y--;} if(key[KEY_DOWN]) {ludek.y++;} speed--; } wys_mape();
for(int i=0;i<10;++i) for(int j=0;j<12;++j) if(kolizja1( ludek.x,ludek.y,ludek.s, ludek.w, ptr->x1[i][j],ptr->y1[i][j],ptr->s1[i][j],ptr->w1[i][j])==true) { play_sample(skok,50,127,1000,0);
} masked_blit(nieb_kula,bufor,0,0,ludek.x,ludek.y,ludek.s,ludek.w); blit(bufor,screen,0,0,0,0,1280,1024); } destroy_bitmap(bufor); destroy_bitmap(ptr->czer_kula); destroy_bitmap(nieb_kula); destroy_sample(skok); allegro_exit(); } END_OF_MAIN();
[/source] |