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 ? 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 ) { 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 ); }
|
|
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.
|
|
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ć: ... |
|
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. |
|
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 :-/ ) |
|
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? |
|
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. |
|
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? |
|
« 1 » 2 3 |