From 26596fa2c36e8e88d5e79034502e5ddb6be0e704 Mon Sep 17 00:00:00 2001 From: h4570 Date: Sun, 14 Aug 2022 20:48:10 +0200 Subject: [PATCH] add basic shoot on enemy --- ROADMAP.txt | 6 +++-- demo/inc/states/game/enemy/enemy.hpp | 6 ++++- demo/inc/states/game/enemy/enemy_manager.hpp | 4 +++- demo/src/states/game/enemy/enemy.cpp | 23 +++++++++++++++++++- demo/src/states/game/enemy/enemy_manager.cpp | 7 +++--- demo/src/states/game/game_state.cpp | 6 +---- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/ROADMAP.txt b/ROADMAP.txt index e50e978..cd4351b 100644 --- a/ROADMAP.txt +++ b/ROADMAP.txt @@ -1,5 +1,9 @@ ------------ Tyra's v2.0 roadmap to publish on GitHub ------------ +- [Renderer] utility functions +- [Renderer] drawLine() +- [Renderer] drawBBox() +- [Renderer] drawPoint() - [Demo] Red screen on hit - [Demo] Count of killed zombies - [Demo] Crosshair @@ -36,9 +40,7 @@ because Mesh rendering uses only core.render() - [renderer] fog - [renderer] bbox parts optimization - [md2] refactor -- [3D] Add drawLine(x, y , color, size) - [2D] Fixed font support -- [3D] Add drawBBox(x, y , color, size) - [File] Async file loading - [obj] Add multicolor support to obj - [Obj] Improve obj importing for multiple usemtl with same names diff --git a/demo/inc/states/game/enemy/enemy.hpp b/demo/inc/states/game/enemy/enemy.hpp index 18bfdb6..2967141 100644 --- a/demo/inc/states/game/enemy/enemy.hpp +++ b/demo/inc/states/game/enemy/enemy.hpp @@ -13,6 +13,7 @@ #include #include "states/game/renderer/renderer_dynamic_pair.hpp" #include "states/game/terrain/heightmap.hpp" +#include "states/game/player/player_shoot_action.hpp" #include "./enemy_info.hpp" using Tyra::AnimationSequenceCallback; @@ -35,7 +36,8 @@ class Enemy { DynPipOptions* options; RendererDynamicPair* pair; - void update(const Heightmap& heightmap, const Vec4& playerPosition); + void update(const Heightmap& heightmap, const Vec4& playerPosition, + const PlayerShootAction& shootAction); private: std::vector walkSequence; @@ -45,9 +47,11 @@ class Enemy { void walk(const Heightmap& heightmap, const Vec4& positionDiff); void animationCallback(const AnimationSequenceCallback& callback); void fight(); + void handlePlayerShoot(const PlayerShootAction& shootAction); bool isWalking = true; bool isFighting = false; + Vec4 spawnPoint; Audio* audio; EnemyInfo info; diff --git a/demo/inc/states/game/enemy/enemy_manager.hpp b/demo/inc/states/game/enemy/enemy_manager.hpp index 6eda9ad..acb0db2 100644 --- a/demo/inc/states/game/enemy/enemy_manager.hpp +++ b/demo/inc/states/game/enemy/enemy_manager.hpp @@ -13,6 +13,7 @@ #include #include #include "states/game/terrain/heightmap.hpp" +#include "states/game/player/player_shoot_action.hpp" #include "./enemy.hpp" using Tyra::DynamicMesh; @@ -28,7 +29,8 @@ class EnemyManager { EnemyManager(Engine* engine, const Heightmap& heightmap); ~EnemyManager(); - void update(const Heightmap& heightmap, const Vec4& playerPosition); + void update(const Heightmap& heightmap, const Vec4& playerPosition, + const PlayerShootAction& shootAction); std::vector getPairs() const; diff --git a/demo/src/states/game/enemy/enemy.cpp b/demo/src/states/game/enemy/enemy.cpp index 852fc5b..40c8783 100644 --- a/demo/src/states/game/enemy/enemy.cpp +++ b/demo/src/states/game/enemy/enemy.cpp @@ -39,6 +39,7 @@ Enemy::Enemy(Engine* engine, const EnemyInfo& t_info) { walkSequence = {0, 1, 2}; fightSequence = {3, 4, 5}; + spawnPoint = info.spawnPoint; mesh->setPosition(info.spawnPoint); mesh->animation.setSequence(walkSequence); @@ -61,9 +62,12 @@ Enemy::~Enemy() { delete pair; } -void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition) { +void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition, + const PlayerShootAction& shootAction) { auto* enemyPosition = mesh->getPosition(); + handlePlayerShoot(shootAction); + auto diff = *enemyPosition - playerPosition; auto ang = Math::atan2(diff.x, diff.z); @@ -81,6 +85,23 @@ void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition) { mesh->update(); } +void Enemy::handlePlayerShoot(const PlayerShootAction& shootAction) { + if (!shootAction.isShooting) { + return; + } + + const auto& ray = shootAction.ray.value(); + auto bbox = + mesh->getCurrentBoundingBox().getTransformed(mesh->getModelMatrix()); + + auto isOnEnemy = ray.intersectBox(bbox.min(), bbox.max()); + + if (isOnEnemy) { + mesh->setPosition(spawnPoint); + TYRA_LOG("Enemy hit!"); + } +} + void Enemy::walk(const Heightmap& heightmap, const Vec4& positionDiff) { if (isFighting) { mesh->animation.setSequence(walkSequence); diff --git a/demo/src/states/game/enemy/enemy_manager.cpp b/demo/src/states/game/enemy/enemy_manager.cpp index e71dedd..9705cbc 100644 --- a/demo/src/states/game/enemy/enemy_manager.cpp +++ b/demo/src/states/game/enemy/enemy_manager.cpp @@ -43,7 +43,7 @@ EnemyManager::EnemyManager(Engine* engine, const Heightmap& heightmap) { auto* sample = engine->audio.adpcm.load( FileUtils::fromCwd("game/models/zombie/punch.adpcm")); - const int enemyCount = 10; + const int enemyCount = 2; for (int i = 0; i < enemyCount; i++) { EnemyInfo info; info.adpcmChannel = 9 + i; @@ -80,9 +80,10 @@ std::vector EnemyManager::getPairs() const { } void EnemyManager::update(const Heightmap& heightmap, - const Vec4& playerPosition) { + const Vec4& playerPosition, + const PlayerShootAction& shootAction) { for (auto* enemy : enemies) { - enemy->update(heightmap, playerPosition); + enemy->update(heightmap, playerPosition, shootAction); } } diff --git a/demo/src/states/game/game_state.cpp b/demo/src/states/game/game_state.cpp index bfc324e..959f6a6 100644 --- a/demo/src/states/game/game_state.cpp +++ b/demo/src/states/game/game_state.cpp @@ -67,12 +67,8 @@ void GameState::update() { skybox->update(player->getPosition()); player->update(terrain->heightmap); - enemyManager->update(terrain->heightmap, player->getPosition()); - auto shootAction = player->getShootAction(); - if (shootAction.isShooting) { - shootAction.ray.value().print(); - } + enemyManager->update(terrain->heightmap, player->getPosition(), shootAction); auto cameraInfo = player->getCameraInfo(); dbgObj->setPosition(*cameraInfo.looksAt);