Working on enemies and attack
This commit is contained in:
parent
493eb5a5d7
commit
984d7489d5
@ -21,28 +21,6 @@
|
||||
"description": "A token from the Guard - sign of respect",
|
||||
"icon": "resources/fire2.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "npc_02_ghost",
|
||||
"name": "NPC Floating Ghost",
|
||||
"texturePath": "resources/w/ghost_skin001.png",
|
||||
"animationIdlePath": "resources/w/default_float001.txt",
|
||||
"animationWalkPath": "resources/w/default_float001.txt",
|
||||
"positionX": 0.0,
|
||||
"positionY": 0.0,
|
||||
"positionZ": -20.0,
|
||||
"walkSpeed": 1.5,
|
||||
"rotationSpeed": 8.0,
|
||||
"modelScale": 0.01,
|
||||
"modelCorrectionRotX": 0.0,
|
||||
"modelCorrectionRotY": 180.0,
|
||||
"modelCorrectionRotZ": 0.0,
|
||||
"gift": {
|
||||
"id": "ghost_essence",
|
||||
"name": "Ghost's Essence",
|
||||
"description": "A mysterious essence from the Ghost realm",
|
||||
"icon": "resources/fire2.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
427765
resources/w/default_float001_cut.txt
Normal file
427765
resources/w/default_float001_cut.txt
Normal file
File diff suppressed because it is too large
Load Diff
427765
resources/w/float_attack003_cut.txt
Normal file
427765
resources/w/float_attack003_cut.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -4,6 +4,8 @@
|
||||
|
||||
namespace ZL {
|
||||
|
||||
const float ATTACK_COOLDOWN_TIME = 3.0f;
|
||||
|
||||
void Character::loadAnimation(AnimationState state, const std::string& filename, const std::string& zipFile) {
|
||||
auto& data = animations[state];
|
||||
data.model.LoadFromFile(filename, zipFile);
|
||||
@ -83,6 +85,16 @@ void Character::update(int64_t deltaMs) {
|
||||
resetAnim = true;
|
||||
}
|
||||
|
||||
if (canAttack && attack == 0 && attack_cooldown < 0.f && currentState == AnimationState::ACTION_IDLE)
|
||||
{
|
||||
attack = 1;
|
||||
attack_cooldown = ATTACK_COOLDOWN_TIME;
|
||||
}
|
||||
if (canAttack && attack_cooldown >= 0.f)
|
||||
{
|
||||
attack_cooldown = attack_cooldown - deltaMs / 1000.f;
|
||||
}
|
||||
|
||||
if (attack == 1 && currentState == AnimationState::ACTION_IDLE)
|
||||
{
|
||||
currentState = AnimationState::ACTION_ATTACK;
|
||||
|
||||
@ -55,6 +55,8 @@ public:
|
||||
bool resetAnim = false;
|
||||
int attack = 0;
|
||||
AnimationState currentState = AnimationState::STAND;
|
||||
float attack_cooldown = 0.f;
|
||||
bool canAttack = false;
|
||||
|
||||
private:
|
||||
struct AnimationData {
|
||||
|
||||
85
src/Game.cpp
85
src/Game.cpp
@ -175,6 +175,7 @@ namespace ZL
|
||||
/*Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5f, Eigen::Vector3f::UnitX())) * */
|
||||
/*Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitZ()));*/
|
||||
|
||||
player->canAttack = true;
|
||||
std::cout << "Load resurces step 9" << std::endl;
|
||||
|
||||
// Load NPCs from JSON
|
||||
@ -201,11 +202,19 @@ namespace ZL
|
||||
npc01->setTarget(npc01->position);
|
||||
npcs.push_back(std::move(npc01));
|
||||
|
||||
*/
|
||||
|
||||
auto ghostTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/ghost_skin001.png", CONST_ZIP_FILE));
|
||||
|
||||
std::cout << "Load resurces step 11" << std::endl;
|
||||
auto npc02 = std::make_unique<Character>();
|
||||
npc02->loadAnimation(AnimationState::STAND, "resources/w/default_float001.txt", CONST_ZIP_FILE);
|
||||
npc02->loadAnimation(AnimationState::WALK, "resources/w/default_float001.txt", CONST_ZIP_FILE);
|
||||
npc02->loadAnimation(AnimationState::ACTION_IDLE, "resources/w/float_attack003_cut.txt", CONST_ZIP_FILE);
|
||||
npc02->loadAnimation(AnimationState::ACTION_ATTACK, "resources/w/float_attack003.txt", CONST_ZIP_FILE);
|
||||
npc02->loadAnimation(AnimationState::STAND_TO_ACTION, "resources/w/default_float001_cut.txt", CONST_ZIP_FILE);
|
||||
npc02->loadAnimation(AnimationState::ACTION_TO_STAND, "resources/w/default_float001_cut.txt", CONST_ZIP_FILE);
|
||||
|
||||
//npc02->loadAnimation(AnimationState::STAND, "resources/w/float_attack003.txt", CONST_ZIP_FILE);
|
||||
//npc02->loadAnimation(AnimationState::STAND, "resources/idleviola_uv010.txt", CONST_ZIP_FILE);
|
||||
npc02->setTexture(ghostTexture);
|
||||
@ -217,10 +226,11 @@ namespace ZL
|
||||
|
||||
npc02->position = Eigen::Vector3f(0.f, 0.f, -20.f);
|
||||
npc02->setTarget(npc02->position);
|
||||
npc02->canAttack = true;
|
||||
|
||||
npcs.push_back(std::move(npc02));
|
||||
|
||||
std::cout << "Load resurces step 12" << std::endl;
|
||||
*/
|
||||
|
||||
loadingCompleted = true;
|
||||
|
||||
@ -497,6 +507,65 @@ namespace ZL
|
||||
if (player) player->update(delta);
|
||||
for (auto& npc : npcs) npc->update(delta);
|
||||
|
||||
for (auto& npc : npcs)
|
||||
{
|
||||
if (npc->canAttack)
|
||||
{
|
||||
float distToGhost = (player->position - npc->position).norm();
|
||||
if (distToGhost >= 10.f)
|
||||
{
|
||||
if (npc->battle_state != 0)
|
||||
{
|
||||
npc->battle_state = 0;
|
||||
}
|
||||
}
|
||||
else if (distToGhost < 10.0f && distToGhost >= 1.f) {
|
||||
npc->setTarget(player->position);
|
||||
if (npc->battle_state != 0)
|
||||
{
|
||||
npc->battle_state = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
npc->setTarget(npc->position);
|
||||
if (npc->battle_state != 1)
|
||||
{
|
||||
npc->battle_state = 1;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (playerAttackTarget != nullptr)
|
||||
{
|
||||
auto pos = playerAttackTarget->position;
|
||||
float distToTarget = (player->position - pos).norm();
|
||||
|
||||
if (distToTarget > 1.0)
|
||||
{
|
||||
player->setTarget(Eigen::Vector3f(pos.x(), 0.f, pos.z()));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (player->battle_state != 1)
|
||||
{
|
||||
player->setTarget(player->position);
|
||||
player->battle_state = 1;
|
||||
//player->attack = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (playerAttackTarget == nullptr)
|
||||
{
|
||||
if (player->battle_state != 0)
|
||||
{
|
||||
player->battle_state = 0;
|
||||
player->attack = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if player reached target interactive object
|
||||
if (targetInteractiveObject && player) {
|
||||
float distToObject = (player->position - targetInteractiveObject->position).norm();
|
||||
@ -529,6 +598,12 @@ namespace ZL
|
||||
dialogueSystem.update(static_cast<int>(delta), player->position);
|
||||
}
|
||||
}
|
||||
|
||||
// Some AI stuff
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -616,6 +691,8 @@ namespace ZL
|
||||
std::cout << "\n========== MOUSE DOWN EVENT ==========" << std::endl;
|
||||
handleDown(ZL::UiManager::MOUSE_FINGER_ID, mx, my);
|
||||
|
||||
playerAttackTarget = nullptr;
|
||||
|
||||
// Calculate ray for picking
|
||||
if (dialogueSystem.blocksGameplayInput()) {
|
||||
dialogueSystem.handlePointerReleased(static_cast<float>(mx), Environment::projectionHeight - static_cast<float>(my));
|
||||
@ -669,6 +746,12 @@ namespace ZL
|
||||
if (npcIndex != -1) {
|
||||
std::cout << "[CLICK] *** SUCCESS: Clicked on NPC index: " << npcIndex << " ***" << std::endl;
|
||||
scriptEngine.callNpcInteractCallback(npcIndex);
|
||||
|
||||
if (clickedNpc->canAttack)
|
||||
{
|
||||
playerAttackTarget = clickedNpc;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else if (rayDir.y() < -0.001f && player) {
|
||||
|
||||
@ -84,6 +84,7 @@ namespace ZL {
|
||||
// Public access for ScriptEngine
|
||||
MenuManager menuManager;
|
||||
ScriptEngine scriptEngine;
|
||||
Character* playerAttackTarget = nullptr;
|
||||
|
||||
private:
|
||||
bool rightMouseDown = false;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user