From fdb1c69775a308492d85400bba7c3a4354e0fae0 Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Sat, 1 Apr 2023 23:52:34 -0700 Subject: [PATCH] Made the hurt hazard work better. --- assets/games/rose/prefabs/Urchin.xml | 17 ++++-- assets/games/rose/textures/Urchin.png | Bin 0 -> 8959 bytes src/dawn/display/Transform.cpp | 9 ++++ src/dawn/display/Transform.hpp | 9 ++++ src/dawn/physics/2d/Box.cpp | 6 +-- src/dawn/physics/2d/Physics2D.hpp | 13 +++++ .../components/physics/2d/BoxCollider.hpp | 1 + .../physics/2d/CharacterController2D.cpp | 16 +++--- .../physics/2d/SolidController2D.cpp | 6 +-- .../physics/2d/TriggerController2D.cpp | 4 +- .../physics/2d/TriggerController2D.hpp | 1 - src/dawnrose/scene/components/HurtHazard.cpp | 38 +++++++++++++- src/dawnrose/scene/components/HurtHazard.hpp | 13 +++++ .../scene/components/entity/EntityHealth.cpp | 49 ++++++++---------- .../scene/components/entity/EntityHealth.hpp | 9 ---- src/dawnrose/scenes/HelloWorldScene.hpp | 6 +-- src/dawntools/prefabtool/PrefabRegistry.cpp | 12 ++++- 17 files changed, 141 insertions(+), 68 deletions(-) create mode 100644 assets/games/rose/textures/Urchin.png create mode 100644 src/dawn/physics/2d/Physics2D.hpp diff --git a/assets/games/rose/prefabs/Urchin.xml b/assets/games/rose/prefabs/Urchin.xml index 0b8e0dfb..500e52a4 100644 --- a/assets/games/rose/prefabs/Urchin.xml +++ b/assets/games/rose/prefabs/Urchin.xml @@ -1,10 +1,19 @@ - + - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/games/rose/textures/Urchin.png b/assets/games/rose/textures/Urchin.png new file mode 100644 index 0000000000000000000000000000000000000000..a562f6f1d0c5061594b3dde33bce1fe2437468f7 GIT binary patch literal 8959 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 Z{||ozkCl{4dwu`_002ovPDHLkV1k+qB+>u? literal 0 HcmV?d00001 diff --git a/src/dawn/display/Transform.cpp b/src/dawn/display/Transform.cpp index c01a9218..710de272 100644 --- a/src/dawn/display/Transform.cpp +++ b/src/dawn/display/Transform.cpp @@ -175,6 +175,15 @@ Transform * Transform::getParent() { return this->parent; } +bool_t Transform::isChildOf(Transform *parent) { + Transform *current = this->getParent(); + while(current != nullptr) { + if(current == parent) return true; + current = current->getParent(); + } + return false; +} + Transform::~Transform() { this->setParent(nullptr); diff --git a/src/dawn/display/Transform.hpp b/src/dawn/display/Transform.hpp index e3708b8a..4a0f9562 100644 --- a/src/dawn/display/Transform.hpp +++ b/src/dawn/display/Transform.hpp @@ -162,6 +162,15 @@ namespace Dawn { */ Transform * getParent(); + /** + * Returns true if this transform is a child of the given transform, this + * climbs up the heirarchy until it finds a match. + * + * @param p Transform to check if this transform is a child of. + * @return True if this transform is a child of the given transform. + */ + bool_t isChildOf(Transform *p); + /** * Dispose and clenaup this transform, also removes self from parent. */ diff --git a/src/dawn/physics/2d/Box.cpp b/src/dawn/physics/2d/Box.cpp index e51da607..52cd74ae 100644 --- a/src/dawn/physics/2d/Box.cpp +++ b/src/dawn/physics/2d/Box.cpp @@ -85,15 +85,13 @@ bool_t Dawn::boxIsBoxColliding( glm::vec2 posB, glm::vec2 minB, glm::vec2 maxB ) { // Check for no overlap in X axis - if (posA.x + maxA.x < posB.x + minB.x || posA.x + minA.x > posB.x + maxB.x) { + if (posA.x + maxA.x < posB.x + minB.x || posB.x + maxB.x < posA.x + minA.x) { return false; } // Check for no overlap in Y axis - if (posA.y + maxA.y < posB.y + minB.y || posA.y + minA.y > posB.y + maxB.y) { + if (posA.y + maxA.y < posB.y + minB.y || posB.y + maxB.y < posA.y + minA.y) { return false; } - - // There is overlap in both X and Y axis, so the boxes are colliding return true; } \ No newline at end of file diff --git a/src/dawn/physics/2d/Physics2D.hpp b/src/dawn/physics/2d/Physics2D.hpp new file mode 100644 index 00000000..3c1872d2 --- /dev/null +++ b/src/dawn/physics/2d/Physics2D.hpp @@ -0,0 +1,13 @@ +// Copyright (c) 2023 Dominic Masters +// +// This software is released under the MIT License. +// https://opensource.org/licenses/MIT + +#pragma once +#include "dawnlibs.hpp" + +namespace Dawn { + static inline glm::vec2 physics3Dto2D(glm::vec3 v) { + return glm::vec2(v.x, v.z); + } +} \ No newline at end of file diff --git a/src/dawn/scene/components/physics/2d/BoxCollider.hpp b/src/dawn/scene/components/physics/2d/BoxCollider.hpp index 903b6a05..edf2d80c 100644 --- a/src/dawn/scene/components/physics/2d/BoxCollider.hpp +++ b/src/dawn/scene/components/physics/2d/BoxCollider.hpp @@ -6,6 +6,7 @@ #pragma once #include "Collider2D.hpp" #include "physics/2d/Box.hpp" +#include "physics/2d/Physics2D.hpp" namespace Dawn { class BoxCollider : public Collider2D { diff --git a/src/dawn/scene/components/physics/2d/CharacterController2D.cpp b/src/dawn/scene/components/physics/2d/CharacterController2D.cpp index bf72d931..21fafefa 100644 --- a/src/dawn/scene/components/physics/2d/CharacterController2D.cpp +++ b/src/dawn/scene/components/physics/2d/CharacterController2D.cpp @@ -16,10 +16,6 @@ void CharacterController2D::onStart() { useEvent([&](float_t delta){ // Common variables auto myCollider = item->getComponent(); - glm::vec2 currentPosition( - this->transform->getLocalPosition().x, - this->transform->getLocalPosition().z - ); // Friction velocity -= velocity * friction * delta; @@ -40,7 +36,7 @@ void CharacterController2D::onStart() { while(itColliders != allColliders.end()) { auto c = *itColliders; ++itColliders; - if(c->item == this->item) continue; + if(c->item == this->item || c->transform->isChildOf(this->transform)) continue; result = c->getCollidingResult( velocity, myCollider, @@ -66,10 +62,10 @@ void CharacterController2D::onStart() { } } - if( - mathAbs(moveAmount.x) <= 0.001f && - mathAbs(moveAmount.y) <= 0.001f - ) return; + // if( + // mathAbs(moveAmount.x) <= 0.001f && + // mathAbs(moveAmount.y) <= 0.001f + // ) return; transform->setLocalPosition( transform->getLocalPosition() + (glm::vec3(moveAmount.x, 0, moveAmount.y) * delta) @@ -81,7 +77,7 @@ void CharacterController2D::onStart() { while(itTriggers != allTriggers.end()) { auto c = *itTriggers; ++itTriggers; - if(c->item == this->item) continue; + if(c->item == this->item || c->transform->isChildOf(this->transform)) continue; if(c->getCollidingResult(myCollider)) { c->eventTriggerEnter.invoke(this); } diff --git a/src/dawn/scene/components/physics/2d/SolidController2D.cpp b/src/dawn/scene/components/physics/2d/SolidController2D.cpp index 1dca0682..265f8690 100644 --- a/src/dawn/scene/components/physics/2d/SolidController2D.cpp +++ b/src/dawn/scene/components/physics/2d/SolidController2D.cpp @@ -29,8 +29,7 @@ bool_t SolidController2D::getCollidingResult( assertNotNull(movingObject); if(movement.x == 0 && movement.y == 0) return false; - auto localPos = movingObject->transform->getWorldPosition(); - glm::vec2 myPos(localPos.x, localPos.z); + auto myPos = physics3Dto2D(movingObject->transform->getWorldPosition()); // Check what the moving object is switch(movingObject->getColliderType()) { @@ -43,8 +42,7 @@ bool_t SolidController2D::getCollidingResult( case COLLIDER2D_TYPE_BOX: { auto box2 = dynamic_cast(this->collider); assertNotNull(box2); - auto localPos2 = box2->transform->getWorldPosition(); - glm::vec2 otherPos(localPos2.x, localPos2.z); + auto otherPos = physics3Dto2D(box2->transform->getWorldPosition()); return boxCheckCollision( myPos, box1->min, box1->max, diff --git a/src/dawn/scene/components/physics/2d/TriggerController2D.cpp b/src/dawn/scene/components/physics/2d/TriggerController2D.cpp index 0e3b303d..a0e1a6bb 100644 --- a/src/dawn/scene/components/physics/2d/TriggerController2D.cpp +++ b/src/dawn/scene/components/physics/2d/TriggerController2D.cpp @@ -32,8 +32,8 @@ bool_t TriggerController2D::getCollidingResult(Collider2D* movingObject) { auto box2 = dynamic_cast(collider); assertNotNull(box2); return boxIsBoxColliding( - box1->transform->getWorldPosition(), box1->min, box1->max, - box2->transform->getWorldPosition(), box2->min, box2->max + physics3Dto2D(box1->transform->getWorldPosition()), box1->min, box1->max, + physics3Dto2D(box2->transform->getWorldPosition()), box2->min, box2->max ); } diff --git a/src/dawn/scene/components/physics/2d/TriggerController2D.hpp b/src/dawn/scene/components/physics/2d/TriggerController2D.hpp index 00b14d97..3cbefcb1 100644 --- a/src/dawn/scene/components/physics/2d/TriggerController2D.hpp +++ b/src/dawn/scene/components/physics/2d/TriggerController2D.hpp @@ -13,7 +13,6 @@ namespace Dawn { class TriggerController2D : public SceneItemComponent { public: Collider2D *collider = nullptr; - StateEvent eventTriggerEnter; TriggerController2D(SceneItem *i); diff --git a/src/dawnrose/scene/components/HurtHazard.cpp b/src/dawnrose/scene/components/HurtHazard.cpp index b26f863d..05cd6ebe 100644 --- a/src/dawnrose/scene/components/HurtHazard.cpp +++ b/src/dawnrose/scene/components/HurtHazard.cpp @@ -7,5 +7,41 @@ using namespace Dawn; -HurtHazard::HurtHazard(SceneItem* item) : SceneItemComponent(item) {} +HurtHazard::HurtHazard(SceneItem* item) : + trigger(nullptr), + SceneItemComponent(item) +{ +} +void HurtHazard::onStart() { + this->evtTriggerEnter = [&]{}; + + useEffect([&]{ + this->evtTriggerEnter(); + if(this->trigger == nullptr) return; + + this->evtTriggerEnter = useEvent([&](CharacterController2D *controller) { + // Check faction(s) + auto otherFaction = controller->item->getComponent(); + if(otherFaction != nullptr && faction == otherFaction->faction) return; + + // Check health + auto otherHealth = controller->item->getComponent(); + if(otherHealth == nullptr) return; + + // Damage + if(otherHealth->isInvincible()) return; + + glm::vec2 back = ( + physics3Dto2D(this->transform->getWorldPosition()) - + physics3Dto2D(controller->transform->getWorldPosition()) + ); + controller->velocity = back * -hitKnockback; + otherHealth->damage({ + .amount = damage + }); + + std::cout << "Trigger" << std::endl; + }, this->trigger->eventTriggerEnter); + }, this->trigger)(); +} \ No newline at end of file diff --git a/src/dawnrose/scene/components/HurtHazard.hpp b/src/dawnrose/scene/components/HurtHazard.hpp index 6c1f7aa0..947e75d1 100644 --- a/src/dawnrose/scene/components/HurtHazard.hpp +++ b/src/dawnrose/scene/components/HurtHazard.hpp @@ -6,13 +6,26 @@ #pragma once #include "scene/SceneItemComponent.hpp" #include "scene/components/entity/EntityFaction.hpp" +#include "scene/components/physics/2d/TriggerController2D.hpp" +#include "scene/components/entity/EntityHealth.hpp" +#include "scene/components/entity/EntityFaction.hpp" namespace Dawn { class HurtHazard : public SceneItemComponent { + private: + std::function evtTriggerEnter; + public: + // @optional + float_t hitKnockback = 20.0f; + // @optional int32_t damage = 1; enum Faction faction = FACTION_NONE; + // @optional + StateProperty trigger; HurtHazard(SceneItem* item); + + void onStart() override; }; } \ No newline at end of file diff --git a/src/dawnrose/scene/components/entity/EntityHealth.cpp b/src/dawnrose/scene/components/entity/EntityHealth.cpp index 9c96b8cf..79a78339 100644 --- a/src/dawnrose/scene/components/entity/EntityHealth.cpp +++ b/src/dawnrose/scene/components/entity/EntityHealth.cpp @@ -11,13 +11,6 @@ EntityHealth::EntityHealth(SceneItem* item) : SceneItemComponent(item) { } -std::vector EntityHealth::getDependencies() { - return { - this->characterController = this->item->getComponent(), - this->entityFaction = this->item->getComponent() - }; -} - void EntityHealth::onStart() { // Update useEvent([&](float_t delta){ @@ -32,29 +25,31 @@ void EntityHealth::onStart() { // Hurt Hazard Processing - useEvent([&](struct CharacterController2DCollisionEventInfo info) { - if(this->isInvincible()) return; + // if(this->characterController != nullptr) { + // useEvent([&](struct CharacterController2DCollisionEventInfo info) { + // if(this->isInvincible()) return; - auto hurtHazard = info.collider->item->getComponent(); - if(hurtHazard == nullptr) return; - if( - entityFaction != nullptr && - hurtHazard->faction == this->entityFaction->faction - ) return; + // auto hurtHazard = info.collider->item->getComponent(); + // if(hurtHazard == nullptr) return; + // if( + // entityFaction != nullptr && + // hurtHazard->faction == this->entityFaction->faction + // ) return; - glm::vec2 back = glm::vec2( - info.collider->transform->getLocalPosition().x, - info.collider->transform->getLocalPosition().z - ) - glm::vec2( - this->transform->getLocalPosition().x, - this->transform->getLocalPosition().z - ); + // glm::vec2 back = glm::vec2( + // info.collider->transform->getLocalPosition().x, + // info.collider->transform->getLocalPosition().z + // ) - glm::vec2( + // this->transform->getLocalPosition().x, + // this->transform->getLocalPosition().z + // ); - this->characterController->velocity = back * -hitKnockback; - this->damage({ - .amount = hurtHazard->damage - }); - }, this->characterController->eventCollision); + // this->characterController->velocity = back * -hitKnockback; + // this->damage({ + // .amount = hurtHazard->damage + // }); + // }, this->characterController->eventCollision); + // } } bool_t EntityHealth::isInvincible() { diff --git a/src/dawnrose/scene/components/entity/EntityHealth.hpp b/src/dawnrose/scene/components/entity/EntityHealth.hpp index 419a57b6..b93742c9 100644 --- a/src/dawnrose/scene/components/entity/EntityHealth.hpp +++ b/src/dawnrose/scene/components/entity/EntityHealth.hpp @@ -5,9 +5,7 @@ #pragma once #include "scene/SceneItemComponent.hpp" -#include "scene/components/entity/EntityFaction.hpp" #include "scene/components/physics/2d/CharacterController2D.hpp" -#include "scene/components/HurtHazard.hpp" namespace Dawn { struct DamageInformation { @@ -17,10 +15,6 @@ namespace Dawn { }; class EntityHealth : public SceneItemComponent { - protected: - EntityFaction *entityFaction = nullptr; - CharacterController2D *characterController = nullptr; - public: // @optional int32_t health = 10; @@ -30,11 +24,8 @@ namespace Dawn { float_t invincibleTime = 0.0f; // @optional float_t stunTime = 0.0f; - // @optional - float_t hitKnockback = 20.0f; EntityHealth(SceneItem* item); - std::vector getDependencies() override; void onStart() override; /** diff --git a/src/dawnrose/scenes/HelloWorldScene.hpp b/src/dawnrose/scenes/HelloWorldScene.hpp index f469571a..91c27b6d 100644 --- a/src/dawnrose/scenes/HelloWorldScene.hpp +++ b/src/dawnrose/scenes/HelloWorldScene.hpp @@ -24,10 +24,8 @@ namespace Dawn { auto player = Player::create(this); - auto wall = Wall::create(this); - - // auto urchin = Urchin::create(this); - // urchin->transform.setLocalPosition(glm::vec3(0, 0, -5)); + auto urchin = Urchin::create(this); + urchin->transform.setLocalPosition(glm::vec3(0, 0, -5)); // auto crab = Crab::create(this); // crab->transform.setLocalPosition(glm::vec3(3, 0, 0)); diff --git a/src/dawntools/prefabtool/PrefabRegistry.cpp b/src/dawntools/prefabtool/PrefabRegistry.cpp index 9473d408..8f910ef5 100644 --- a/src/dawntools/prefabtool/PrefabRegistry.cpp +++ b/src/dawntools/prefabtool/PrefabRegistry.cpp @@ -64,7 +64,15 @@ struct PrefabComponentParserRuleset PrefabRegistry::getRuleset(std::string type) // Find each instance of "@optional" when it's used within a comment // e.g. // @optional or /* @optional */ in the string data. - std::regex regex("^\\s*(?:\\/\\/|\\/\\*){1}\\s*\\@optional\\s*(?:\\*\\/)?\\s*$", std::regex_constants::ECMAScript | std::regex_constants::multiline); + + std::regex_constants::syntax_option_type regexFlags; + #if defined(__GNUC__) + regexFlags = std::regex_constants::ECMAScript | std::regex_constants::multiline; + #else + regexFlags = std::regex_constants::ECMAScript; + #endif + + std::regex regex("^\\s*(?:\\/\\/|\\/\\*){1}\\s*\\@optional\\s*(?:\\*\\/)?\\s*$", regexFlags); std::sregex_iterator it(data.begin(), data.end(), regex); std::sregex_iterator end; while(it != end) { @@ -92,7 +100,7 @@ struct PrefabComponentParserRuleset PrefabRegistry::getRuleset(std::string type) auto variableString = data.substr(varStart, varLength); // Now (should) be able to extract the type; - std::regex regex2("^\\s*(?:[\\S]+<)?([\\w*:_\\s]+)(?:[\\S]+)? (\\**[\\w]+)\\s*$", std::regex_constants::ECMAScript | std::regex_constants::multiline); + std::regex regex2("^\\s*(?:[\\S]+<)?([\\w*:_\\s]+)(?:[\\S]+)? (\\**[\\w]+)\\s*$", regexFlags); std::smatch match; if(!std::regex_search(variableString, match, regex2)) { std::cout << "Failed to extract type and name from variable string! " << variableString << std::endl;