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

[Allegro 5] Bomberman - wybuch bomby (kolizje)

Ostatnio zmodyfikowano 2013-08-05 13:49
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
[Allegro 5] Bomberman - wybuch bomby (kolizje)
» 2013-08-05 11:02:56
Witam mam już cześć gry napisanej ale mam problem gdy dochodzi do kolizji wybuchu z terenem. Dla zasięgu = 1 nie mam problemu w sumie to nie wiem czy takie podejście to tego problemu jest prawidłowe spróbuje to w miarę dobrze opisać.
to jest moja pętla która obsługuje wybuch bomby dla  tylko zasięgu = 1 oraz 2 bo mam problemy z zasięgiem =2. Mapa kafelkowa 32 pixele
C/C++
itB = Bomba.begin();
while( itB != Bomba.end() && Bomba.size() > 0 ) //wybuchanee   bomby
{
   
    itB->logika();
    if( itB->getI() >= 280 )
    {
        if( player.getZasieg() == 1 )
        {
            Wybuch.push_back( wybuch( itB->getX(), itB->getY(), 0, 0, 0, 0 ) ); //0srodek 9 wybuchanie klocka
            Wybuch.push_back( wybuch( itB->getX() + 32, itB->getY(), 0, 0, 0, 1 ) ); //1prawo
            Wybuch.push_back( wybuch( itB->getX() - 32, itB->getY(), 0, 0, 0, 3 ) ); //3lewo
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() - 32, 0, 0, 0, 5 ) ); //5gora
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() + 32, 0, 0, 0, 7 ) ); //7dol
            //   5
            // 3 0 1
            //   7
            //cout<<Wybuch.size()<<endl;
            itB = Bomba.erase( itB );
        }
        else if( player.getZasieg() == 2 )
        {
            Wybuch.push_back( wybuch( itB->getX(), itB->getY(), 0, 0, 0, 0 ) ); //0srodek 9 wybuchanie klocka ostantia wartosc jest to kierunek wybuchu
            Wybuch.push_back( wybuch( itB->getX() + 32, itB->getY(), 0, 0, 0, 2 ) ); //1prawo
            Wybuch.push_back( wybuch( itB->getX() - 32, itB->getY(), 0, 0, 0, 4 ) ); //4lewo
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() - 32, 0, 0, 0, 6 ) ); //6gora pion
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() + 32, 0, 0, 0, 8 ) ); //8dol pion
            Wybuch.push_back( wybuch( itB->getX() + 64, itB->getY(), 0, 0, 0, 1 ) ); //2prawo poziom
            Wybuch.push_back( wybuch( itB->getX() - 64, itB->getY(), 0, 0, 0, 3 ) ); //3lewo poziom
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() - 64, 0, 0, 0, 5 ) ); //5gora
            Wybuch.push_back( wybuch( itB->getX(), itB->getY() + 64, 0, 0, 0, 7 ) ); //7dol
            // 5
            // 6
            //     3 4 0 2 1
            // 8
            // 7
            //cout<<Wybuch.size()<<endl;
            itB = Bomba.erase( itB );
        }
       
    }
    else itB++;
   
}
to pętla kolizji wybuchu z terenem dla zasiegu = 1 działa dobrze chciałem zrobić to tak, że jeżeli dojdzie do kolizji wybuchu 2 to usuwam tez wybuch 1 jeżeli 4 to 3 itd. natomiast jeżeli dojdzie do kolizji koncowych wybuchów z terenem to usuwam jedynie jeden
C/C++
itT = Teren.begin();
while( itT != Teren.end() && Teren.size() > 0 )
{
    itW = Wybuch.begin();
    while( itW != Wybuch.end() && Wybuch.size() > 0 ) //kolizja  terenu brazowego z wybuchem
    {
       
        if( Collision( itW->getX(), itW->getY(), itT->getX(), itT->getY(), 10, 10 ) && itT->getStan() == 1 )
        {
            if( player.getZasieg() == 1 )
            {
                itW = Wybuch.erase( itW );
                x = itT->getX(); y = itT->getY();
                itT = Teren.erase( itT );
                itT = Teren.begin();
                Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
            }
            else if( player.getZasieg() == 2 )
            {
                // 5
                // 6
                //     3 4 0 2 1
                // 8
                // 7
               
                if( itW->getKier() == 4 )
                {
                    itW = Wybuch.erase( itW );
                    x = itT->getX(); y = itT->getY();
                    itT = Teren.erase( itT );
                    itT = Teren.begin();
                    int i = 0;
                    while( i < 5 )
                    {
                       
                        if( itW->getKier() == 3 )
                        {
                            itW = Wybuch.erase( itW );
                        }
                        else
                        {
                            itW++; i++;
                        }
                    }
                    Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
                }
                else if( itW->getKier() == 6 )
                {
                    x = itT->getX(); y = itT->getY();
                    itT = Teren.erase( itT );
                    itT = Teren.begin();
                    int i = 0;
                    while( i < 5 )
                    {
                       
                        if( itW->getKier() == 5 )
                        {
                            itW = Wybuch.erase( itW );
                            //
                            break;
                        }
                        else {
                            itW++;
                            i++;
                        }
                    } itW = Wybuch.erase( itW );
                   
                    Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
                }
                else if( itW->getKier() == 2 )
                {
                    itW = Wybuch.erase( itW );
                    x = itT->getX(); y = itT->getY();
                    itT = Teren.erase( itT );
                    itT = Teren.begin();
                    int i = 0;
                    while( i < 5 )
                    {
                       
                        if( itW->getKier() == 1 )
                        {
                            itW = Wybuch.erase( itW );
                            break;
                        }
                        else {
                            itW++;
                            i++;
                        }
                    }
                    Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
                }
                else if( itW->getKier() == 8 )
                {
                   
                    itW = Wybuch.erase( itW );
                    x = itT->getX(); y = itT->getY();
                    itT = Teren.erase( itT );
                    itT = Teren.begin();
                    int i = 0;
                    while( i < 5 )
                    {
                       
                        if( itW->getKier() == 7 )
                        {
                            itW = Wybuch.erase( itW );
                            break;
                        }
                        else { itW++; i++; }
                    }
                    Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
                }
               
                else if( itW->getKier() == 9 )
                {
                    itW = Wybuch.erase( itW );
                }
                else if( itW->getKier() == 1 && itW->getKier() == 3 && itW->getKier() == 5 && itW->getKier() == 7 ) {
                    itW = Wybuch.erase( itW );
                    x = itT->getX(); y = itT->getY();
                    itT = Teren.erase( itT );
                    itT = Teren.begin();
                    Wybuch.push_back( wybuch( x, y, 0, 0, 0, 9 ) );
                }
            }
           
        }
        else
             itW++;
       
    }
    itT++;
}
tutaj jeszcze klasy wybuchu i terenu
C/C++
class wybuch
{
private:
    int x, y, i, kierunek;
    char * direction;
    bool stan;
public:
    wybuch( int xx, int yy, int ii, char * Dir, bool st, int kier );
    int getX() { return x; } //pozycja x
    int getY() { return y; } //pozycja y
    int getI() { return i; }
    int getKier() { return kierunek; }
    int getStan() { return stan; }
    void iniStan( bool st )
    {
        stan = st;
    }
    void addX( int xx ) { x += xx; }
    void addY( int yy ) { y += yy; }
    void addI( int yy ) { i += yy; }
    void logika()
    {
        i++;
    }
};
wybuch::wybuch( int xx, int yy, int ii, char * Dir, bool st, int kier )
    : x( xx )
    , y( yy )
    , i( ii )
    , direction( Dir )
    , stan( st )
    , kierunek( kier )
{
}
class teren
{
private:
    int x, y, i;
    char * direction;
    bool stan;
public:
    teren( int xx, int yy, int ii, char * Dir, bool st );
    int getX() { return x; } //pozycja x
    int getY() { return y; } //pozycja y
    int getI() { return i; }
    int getStan() { return stan; }
    void iniStan( bool st )
    {
        stan = st;
    }
    void addX( int xx ) { x += xx; }
    void addY( int yy ) { y += yy; }
    void addI( int yy ) { i += yy; }
    void logika()
    {
        i++;
    }
};
teren::teren( int xx, int yy, int ii, char * Dir, bool st )
    : x( xx )
    , y( yy )
    , i( ii )
    , direction( Dir )
    , stan( st )
{
}
nie wiem czy to podejście jest dobre jeżeli znacie lepsze rozwiązania tego problemu to proszę o pomoc.
P-89506
kubawal
» 2013-08-05 11:05:18
Masz już chyba wystarczająco dużo postów, aby wiedzieć jak się je pisze...

/edit: Widzę, że byłeś szybszy :)
P-89508
pekfos
» 2013-08-05 11:08:40
Implementacja zasięgu jest na prawdę prymitywna. Można to zrobić na 4 pętlach, zamiast klepać powtarzający się kod. Już teraz jest za długi, a do tego zasięgów będzie więcej.

Widzę, że byłeś szybszy :)
Nie on ;P

PS: czekam na opis problemu.
P-89509
aaadam
Temat założony przez niniejszego użytkownika
» 2013-08-05 11:41:40
no to byl ten opis a ja nie jestem dobrym programistą także proszę o jakieś rady :)
P-89512
pekfos
» 2013-08-05 11:57:10
mam problem gdy dochodzi do kolizji wybuchu z terenem
To ma być ten opis problemu? Tematy tak opisane trafiają do innego działu..
P-89517
aaadam
Temat założony przez niniejszego użytkownika
» 2013-08-05 12:16:00
pekfos napisał że impementacja jest ptymitywna także nie wiem czy jest sens opisywać poprostu gdy dochodzi do wybuchu dodaje odpowiednio do wektora wybuch nowe obiekty w zależności jaki jest zasięg narazie powiedzmy ze zrobiłem dla zasięgu 2 oraz 1 potem sprawdzana jest kolizja i tu dla zasięgu =2 nie działa ona dobrze i nie mogę  sobie z tym poradzić. Tzn usuwa się więcej terenu niż powinno
P-89520
DejaVu
» 2013-08-05 13:49:43
C/C++
for( int x = bomba.x + 1; x <= bomba.x + bomba.zasieg; ++x )
if( !mapa.czyPolePuste( x, bomba.y ) )
{
    mapa.wysadzPole( x, bomba.y );
    break;
}
Robisz cztery takie pętle (każda w innym kierunku) i problem masz załatwiony.
P-89535
« 1 »
  Strona 1 z 1