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

Warunek sprawdzający jakiego typu jest obiekt

Ostatnio zmodyfikowano 2021-06-10 18:49
Autor Wiadomość
puciek95
Temat założony przez niniejszego użytkownika
Warunek sprawdzający jakiego typu jest obiekt
» 2021-06-10 14:37:13
Witam piszę grę na zaliczenie zajęć ze studiów, generalnie wszystko działa całkiem w porządku ale mam problem z tym, że albo to gracz strzela zgodnie z kierunkiem ruchu przeciwnika, a przeciwnik zgodnie ze swoim kierunkiem ruchu, albo to gracz strzela zgodnie ze swoim kierunkiem ruchu, a przeciwnik zgodnie z kierunkiem gracza zamiast swoim. Teraz wpadłem na pomysł by w konstruktorze strzału sprawdzić czy to gracz czy przeciwnik wywołują ten konstruktor, czy coś takiego jest możliwe ? Przeciwnik i gracz są różnych typów, natomiast mają w sobie obiekt tej samej klasy Mag. W klasie Mag jest też zapisana informacja bool isCPU - czy dany mag jest CPU czy nie. Próbowałem też warunkiem:
C/C++
if( game->enemy->enemyMage->isCPU == 0
Ale to niestety też nie działa tak jakbym chciał, ponieważ jest zawsze prawdziwe. Poniżej kod źródłowy, bardzo proszę o pomoc, bo nie mogę nic na ten temat znaleźć
C/C++
Bullet_Air::Bullet_Air()
{
   
setPixmap( QPixmap( ":/images/ATAK_Powietrze.png" ) );
   
if( game->Renemy() ) // tutaj nie wiem jak sprawdzić i czy jest wgl taka możliwość sprawdzenia czy wywołał to enemy czy player.
   
{
       
bulletDirection = game->Renemy()->RenemyMage()->RcurrentDirection();
   
}
   
else if( game->Rplayer() )
   
{
       
bulletDirection = game->Rplayer()->RplayerMage()->RcurrentDirection();
   
}
   
   
draw();
}
void Bullet_Air::move() {
   
if( isDestroyed )
       
 return;
   
   
//move bullet
   
switch( bulletDirection )
   
{
   
case 4:
       
setPos( x() - 20, y() );
       
break;
   
case 6:
       
setPos( x() + 20, y() );
       
break;
   
case 8:
       
setPos( x(), y() - 20 );
       
break;
   
case 2:
       
setPos( x(), y() + 20 );
       
break;
   
}
   
deleteIfOffScreen();
}
P-178754
DejaVu
» 2021-06-10 14:46:29
Możesz dorobić sobie metodę wirtualną do klasy bazowej jakiego typu jest obiekt i w klasach pochodnych przeciążyć metodę, wystawiając informację o typie.
C/C++
enum class TypObiektu
{
   
Gracz,
   
Przeciwnik
};

class Obiekt
{
public:
   
virtual TypObiektu dajTypObiektu() = 0;
};

class Gracz
    : public Obiekt
{
public:
   
TypObiektu dajTypObiektu() override { return TypObiektu::Gracz; }
}
;

class Przeciwnik
    : public Obiekt
{
public:
   
TypObiektu dajTypObiektu() override { return TypObiektu::Przeciwnik; }
}
;
P-178755
puciek95
Temat założony przez niniejszego użytkownika
» 2021-06-10 17:20:47
Czyli rozumiem, że powinienem zrobić nową klasę w ten sposób:
C/C++
enum class obiectType
{
   
Player,
   
Enemy
};
class Obiect
{
public:
   
virtual obiectType getObiectType();
};

Następnie w klasie Player i Enemy dodać dziedziczenie po tym obiekcie i przeładować funkcję wirtualną ?
C/C++
public:
obiectType getObiectType() override { return obiectType::Enemy; }

Jeśli tak miało to wyglądać to niestety ale nie działa dostaję błąd kompilacji:

error: 'obiectType' does not name a type; did you mean '_isctype'?
     obiectType getObiectType() {return obiectType::Enemy;}
     ^~~~~~~~~~
     _isctype
P-178757
pekfos
» 2021-06-10 17:29:04
C/C++
Bullet_Air::Bullet_Air()
{
   
setPixmap( QPixmap( ":/images/ATAK_Powietrze.png" ) );
   
if( game->Renemy() ) // tutaj nie wiem jak sprawdzić i czy jest wgl taka możliwość sprawdzenia czy wywołał to enemy czy player.
   
{
       
bulletDirection = game->Renemy()->RenemyMage()->RcurrentDirection();
   
}
   
else if( game->Rplayer() )
   
{
       
bulletDirection = game->Rplayer()->RplayerMage()->RcurrentDirection();
   
}
   
   
draw();
}
Po prostu przekaż parametry zamiast próbować zgadnąć, skąd samemu je wyciągnąć. Pocisk jest tworzony przez gracza, lub wroga. Niech ta jednostka sama sobie ustawi odpowiedni kierunek. Co będzie, jak będziesz chciał mieć drugiego wroga?
P-178758
puciek95
Temat założony przez niniejszego użytkownika
» 2021-06-10 18:19:37
pekfos, bardzo bym chciał żeby było takie rozwiązanie zadziałało, niestety wtedy gracz strzela zgodnie z kierunkiem przeciwnika :(
P-178760
pekfos
» 2021-06-10 18:28:38
Tak działa błędnie, czy tak ma działać? Nie bardzo jest jasne w którą stronę chcesz to poprawiać. Wydaje się mieć więcej sensu by gracz strzelał zgodnie z własnym kierunkiem i wróg zgodnie z własnym. Podaj kod, który działa błędnie.
P-178761
puciek95
Temat założony przez niniejszego użytkownika
» 2021-06-10 18:30:43
Powinno działać w sposób taki, że przeciwnik strzela zgodnie ze swoim kierunkiem ruchu, natomiast gracz zgodnie ze swoim kierunkiem ruchu. W rozwiązaniu które podałeś przeciwnik jak i gracz strzelają zgodnie z kierunkiem ruchu przeciwnika.
P-178762
pekfos
» 2021-06-10 18:37:21
W rozwiązaniu które podałeś przeciwnik jak i gracz strzelają zgodnie z kierunkiem ruchu przeciwnika.
Ewidentny błąd w implementacji. Napisałem że gracz gdy strzela, powinien ustawiać pociskowi swój kierunek ruchu. I wróg gdy strzela, powinien ustawiać pociskowi swój kierunek ruchu.
P-178764
« 1 » 2
  Strona 1 z 2 Następna strona