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

Logika potworów w grze

Ostatnio zmodyfikowano 2024-09-04 22:05
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Logika potworów w grze
» 2024-05-22 11:49:07
Witam. Napisałem prostą logikę potworów w grze. Wydaje mi się, że przewidziałem każde zachowanie. Co o tym sądzicie ?

C/C++
void update( float dt ) {
   
   
if( state == states::fight ) {
       
       
if( playerInAttackRange() ) {
           
           
if( cooldown <= 0 ) {
               
player->takeDamage( 2 );
               
cooldown = attackTime;
               
frame = 0;
           
}
           
           
frame = cooldown / attackTime * 4.0f - 1.0f;
           
sprite->setTexture( * fightTextures[ direction * 4 + frame ] );
           
       
}
       
else if( playerInViewRange() ) {
           
target = player->position;
           
searchPath();
           
state = states::run;
       
}
       
else
       
{
           
state = states::idle;
           
frame = 0;
           
sprite->setTexture( * idleTextures[ direction * 4 + frame ] );
       
}
    }
   
else if( state == states::run ) {
       
       
if( playerInAttackRange() ) {
           
state = states::fight;
       
}
       
       
if( playerInViewRange() ) {
           
target = player->position;
           
searchPath();
       
}
       
       
calculateCurrentFrame( dt );
       
float distance = 15.0f * stepSize * dt;
       
move( distance );
       
sprite->setTexture( * runTextures[ direction * 4 + frame ] );
   
}
   
   
else if( playerInAttackRange() ) {
       
state = states::fight;
   
}
   
else if( playerInViewRange() ) {
       
target = player->position;
       
searchPath();
       
state = states::run;
   
}
   
   
if( state == states::idle ) {
       
if( rand() % 300 == 0 ) {
           
           
// rangdom target
           
target.x = pointBase.x +( rand() % 3 - 1 ) * 100;
           
target.y = pointBase.y +( rand() % 3 - 1 ) * 100;
           
state = states::run;
       
}
       
else {
           
calculateCurrentFrame( dt );
           
sprite->setTexture( * idleTextures[ direction * 4 + frame ] );
       
}
    }
   
   
   
mouseOvering();
   
   
if( cooldown >= 0.0f )
       
 cooldown -= dt;
   
   
sprite->setPosition( position );
   
collider->setPosition( position );
   
viewRangeArea->setPosition( position );
   
attackRangeArea->setPosition( position );
   
   
textname->setPosition( position.x, position.y - height - 30 );
   
panelHP->setPosition( position.x, position.y - height - 10 );
   
panelHPcurrent->setPosition( position.x, position.y - height - 10 );
   
}
P-181114
DejaVu
» 2024-05-22 12:25:51
ChatGPT 4o:
Analizując logikę potworów w Twojej grze, oto kilka uwag dotyczących potencjalnych braków stanów lub sytuacji, które mogą nie być obsłużone:

Stan śmierci (death): Brakuje stanu, który obsługuje śmierć potwora. Gdy potwór traci wszystkie punkty zdrowia, powinien przejść do stanu death, w którym przestaje wykonywać inne akcje i wyświetla animację śmierci.
Stan ogłuszenia (stun): Brakuje stanu, który obsługuje sytuację, gdy potwór zostaje ogłuszony przez gracza. W takim stanie potwór nie powinien móc atakować ani się poruszać przez określony czas.
Stan patrolowania (patrol): Brakuje stanu, który obsługuje patrolowanie określonego obszaru, gdy gracz nie jest w zasięgu widzenia. Mogłoby to uczynić potwory bardziej interesującymi, gdy nie są bezczynne w stanie idle.
Stan ucieczki (flee): Brakuje stanu, który obsługuje sytuację, gdy potwór postanawia uciekać przed graczem (np. gdy jego zdrowie spadnie poniżej pewnego progu). Mogłoby to dodać więcej dynamiki do rozgrywki.
Stan poszukiwania (search): Brakuje stanu, który obsługuje sytuację, gdy potwór traci z oczu gracza, ale nadal podejrzewa jego obecność i zaczyna go szukać w ostatniej znanej lokalizacji gracza.
P-181115
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-22 12:34:18
-stan śmierci obsługuję poza logiką potwora - w mainie
-stan patrolowania to state::run - dąży do wylosowanego celu w state::idle
-stan poszukiwania to state::run, gdy gracz nie jest w zasięgu więc potwór dąży do ostatniej znanej lokalizacji gracza

mi Chat GPT też słabo odpisał :
Twój kod wydaje się być dobrze zorganizowany, co pozwala na łatwe zrozumienie logiki potworów w grze. Jest kilka punktów, które można by ulepszyć lub przemyśleć: ...
P-181116
DejaVu
» 2024-05-22 19:43:00
W pierwszej iteracji ChatGPT napisał mi nową implementację i zrefaktorował Twój kod z miejsca, aby wyglądał inaczej, więc w drugiej iteracji masz feedback nawiązujący bezpośrednio do Twojej implementacji. Dałeś kontekst jednej metody, więc dostałeś odpowiedź do jednej metody. ChatGPT nie zna całej struktury Twojego kodu. My też jej nie znamy.
P-181117
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-22 21:26:21
No więc mam kilka bazowych funkcji i stanów z których próbuję zbudować logikę update'u potworków. Robię to pierwszy raz i nie mam doświadczenia.

Logika ma działać następująco:
-gdy gracz jest w zasiegu ataku - potwór atakuje gracza
-gdy gracz jest w polu widzenia - potwór idzie na pozycje gracza
-gdy gracz znika z pola widzenia - potwor idzie do miejsca, w którym ostatnio widział gracza
-gdy potwór dojdzie do celu i nie ma w zasięgu ataku ani w polu widzenia gracza to nic nie robi
-gdy potwór nic nie robi to co jakiś czas szuka sobie celu do którego może się przejść


Bazowe funkcje to:
-playerInAttackRange(); // bool gracz w zasięgu ataku
-playerInViewRange(); // bool gracz w polu widzenia
-player->takeDamage(2); // zadaj "2" obrazenia graczowi
-searchPath(); // szuka drogi do celu opisanej punktami

Stany:
-state::fight; // stan atakowania gracza
-state::run; // stan dazenia do jakiegoś celu
-state::idle; // potwor stoi bezczynnie w miejscu

Dodatkowo dodałem:
-sf::vector2f pointBase; // punkt spawnu potwora
-sf::vector2f target; // cel do ktorego potwor zmierza
-std::vector <Point> path; // droga do celu opisana punktami ( powinna być opisywana przez punkty sf::Vector2f ale jeszcze tego nie zrobiłem :-/ )
P-181118
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-23 14:21:52
Znalazłem coś takiego jak maszyna stanów. Czy warto iść w tym kierunku?
P-181119
DejaVu
» 2024-05-23 14:25:05
Osobiście nie polecam maszyn stanów. Lepiej reagować po prostu na aktualny stan zmiennych, które mają dla Ciebie znaczenie.
P-181120
tBane
Temat założony przez niniejszego użytkownika
» 2024-05-23 14:39:19
W takim razie, czy istnieje jakaś metoda rozkładająca taką logikę na czynniki pierwsze?
P-181121
« 1 » 2 3
  Strona 1 z 3 Następna strona