Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro] kolizja z mapą i auto_ptr znikanie

Ostatnio zmodyfikowano 2010-01-21 16:02
Autor Wiadomość
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]
P-13148
malan
» 2010-01-20 16:38:51
Kafelkowi, który ma zniknąć zmień wartość w tablicy. Inaczej mówiąc zamień go z innym kafelkiem.
P-13151
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-01-20 18:54:06
Podmiana kafla działa dobrze, tylko jak mam więcej kafelków jak jeden, to przy kolizji z pierwszym kaflem, znikają wszystkie kafle. Jest na to jakiś sposób?

[source code src="C++"]
 if(kolizja1( ludek.x,ludek.y,ludek.s, ludek.w, ptr->x1[0][0],ptr->y1[0][0],ptr->s1[0][0],ptr->w1[0][0])==true)
    {
      map[0][0]=kolor[2][1];

    }
    if(kolizja1( ludek.x,ludek.y,ludek.s, ludek.w, ptr->x1[9][11],ptr->y1[9][11],ptr->s1[9][11],ptr->w1[9][11])==true)
    {
      //play_sample(skok,50,127,1000,0);
      map[9][11]=kolor[2][1];
    }
[/source]
P-13156
malan
» 2010-01-20 19:39:28
Jeśli tak się dzieje to znaczy, że gdzieś masz błąd. Jeśli chcesz to wrzuć cały projekt (z obrazkami itp. na jakiś serwer), jak będę miał czas to zerknę.
P-13157
wojownik266
Temat założony przez niniejszego użytkownika
» 2010-01-20 20:43:36
Wrzuciłem tutaj: http://krzysztof_posluszny.eu.interia.pl/. Kiedy mogę spodziewać się odpowiedzi? Mój e-mail jakby co: wojownik266@wp.pl
P-13163
malan
» 2010-01-21 00:19:19
Jak zobaczyłem mapę kafelkową (w kodzie) to wyobrażałem sobie małe kwadraciki 16x16, a tu widzę 80x80 heh. Nie wiem, czy jest sens używać mapy kafelkowej do tak dużych obiektów, chociaż mam małe doświadczenie, więc mogę się mylić.
Po uruchomieniu programu zobaczyłem jedną kulkę (czerwoną), potem zza ekranu "przyleciała" niebieska. Kiedy próbowałem zderzyć te obie kulki to kolizja zadziałała, ale za wcześnie. Innym obiektów (kulek) nie widać, ale może to wina 15 calowego monitora :).
Jeśli chodzi o znikanie wszystkich kafli (bo to kafelki nie są ;p) to cóż się dziwić skoro wszystkie mają takie same położenie:
C/C++
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;
}
To by się zgadzało. Skoro położenie wszystkich obiektów (kulek) jest takie same to w momencie wykrycie kolizji u jednego znikają wszystkie :).
P-13166
DejaVu
» 2010-01-21 15:24:32
auto_ptr<> to zło :) Polecam używać boost::shared_ptr<>. Do używania shared_ptr'ów wystarczy tylko ściągnąć bibliotekę i wgrać pliki nagłówkowe (no i dodać odpowiedniego include'a).

Tu masz jakiś opis auto_ptr'a jak go należy używać i czego należy unikać:
http://www.gotw.ca/publications/using_auto_ptr_effectively.htm

Autor tego tekstu pisze: "That's a shame, because it turns out that auto_ptr neatly solves common C++ design and coding problems, and using it well can lead to more robust code.".

Dodaje jeszcze: "This article shows how to use auto_ptr correctly to make your code safer--and how to avoid the dangerous but common abuses of auto_ptr that create intermittent and hard-to-diagnose bugs."

Artykuł jest z 1999 roku, więc ma 11 lat. Używając boost::shared_ptr nie musisz myśleć nad bezpieczeństwem itd. dopóki nie zaczniesz programować wielowątkowo. Po prostu piszesz i wiesz, że dane zawsze są i znikną wraz z pozbyciem się ostatniego obiektu, który wskazuje na dane.
P-13175
Elaine
» 2010-01-21 16:02:16
auto_ptr<> to zło
Wyjątkowo się zgadzam - w końcu nie bez powodu jest deprecated w C++0x, a zamiast niego powinno się używać unique_ptr<>.

Polecam używać boost::shared_ptr<>.
...który służy do zupełnie innych rzeczy. Zresztą - w tym kodzie to powinno być użyte normalne new z normalnym delete i normalnymi T*, bez sprytnych wskaźników. Totalnie nie mam pojęcia, co ten auto_ptr tu daje.

Po prostu piszesz i wiesz, że dane zawsze są i znikną wraz z pozbyciem się ostatniego obiektu, który wskazuje na dane.
Czyli jak w dowolnym języku z GC...
Używając boost::shared_ptr nie musisz myśleć nad bezpieczeństwem itd. dopóki nie zaczniesz programować wielowątkowo.
...a jednak nie, bo przy GC nie trzeba o tym myśleć. O takich "pomijalnych" zaletach, jak wydajność i brak konieczności pisania cały czas boost::shared_ptr<Foo> (wystarczy samo Foo albo wręcz nic), to mówić nie będę, bo szkoda miejsca.
P-13177
« 1 »
  Strona 1 z 1