Jestem trochę wybredny: mówię, że tworzę prostą, 2D, podobną do Zelda grę. Gdy zderzają się dwa obiekty, każdy powinien otrzymać wynikową akcję. Jednakże, gdy główny bohater zderza się z czymś, jego reakcja zależy wyłącznie od rodzaju obiektu, z którym się zderzył. Jeśli to potwór, powinien się odbić, jeśli jest to ściana, nic nie powinno się wydarzyć, jeśli to magiczne niebieskie pudełko z wstążkami, powinien go leczyć, itd. (To tylko przykłady).Jak napisać elegancki mechanizm do obsługi kolizji?
Muszę również zauważyć, że OBUŻE rzeczy są częścią kolizji, to znaczy zderzenia kolizji powinny mieć miejsce zarówno dla postaci, jak i potwora, a nie tylko dla jednego i drugiego.
Jak napisać kod w ten sposób? Mogę wymyślić wiele niesamowicie nieeleganckich sposobów, na przykład posiadanie funkcji wirtualnych w globalnej klasie WorldObject, w celu identyfikacji atrybutów - na przykład funkcji GetObjectType() (zwraca znaki, char * s, wszystko, co identyfikuje obiekt jako Monster , Box lub Wall), a następnie w klasach o większej liczbie atrybutów, powiedzmy Monster, może być więcej funkcji wirtualnych, powiedzmy GetSpecies().
to jednak staje się irytujące do utrzymania, i prowadzi do dużego przełącznika kaskadowego (lub) oświadczenie obsługi kolizji
MainCharacter::Handler(Object& obj)
{
switch(obj.GetType())
{
case MONSTER:
switch((*(Monster*)&obj)->GetSpecies())
{
case EVILSCARYDOG:
...
...
}
...
}
}
Istnieje również możliwość korzystania z plików, a pliki miałby takie rzeczy :
Object=Monster
Species=EvilScaryDog
Subspecies=Boss
A następnie kod może pobrać atrybuty bez potrzeby funkcji wirtualnych zaśmiecających wszystko. Nie rozwiązuje to jednak problemu kaskadowego Jeśli jednak.
I NASTĘPNIE istnieje opcja posiadania funkcji dla każdego przypadku, powiedzmy CollideWall(), CollideMonster(), CollideHealingThingy(). To jest osobiście moja najmniej ulubiona (choć daleko im do sympatii), ponieważ wydaje się najbardziej nieporęczna w utrzymaniu.
Czy ktoś mógłby podać wgląd w bardziej eleganckie rozwiązania tego problemu? Dzięki za wszelką pomoc!
Newton miałby dla ciebie kilka słów :) –