Witam. Napisałem prostą logikę potworów w grze. Wydaje mi się, że przewidziałem każde zachowanie. Co o tym sądzicie ?
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 :-/ )
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;
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;
}
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;
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]);
}
}