From d639e6e45d818cd34b9075aae0f34ed273799805 Mon Sep 17 00:00:00 2001 From: Mihai Dumitrescu Date: Sun, 21 Dec 2025 17:57:46 +0200 Subject: [PATCH 1/2] Modify dropped item size and add new get method Signed-off-by: Mihai Dumitrescu --- src/Rpg/inventory/items/DroppedItem.cpp | 8 ++++++-- src/Rpg/inventory/items/DroppedItem.h | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Rpg/inventory/items/DroppedItem.cpp b/src/Rpg/inventory/items/DroppedItem.cpp index d302932..25c6126 100644 --- a/src/Rpg/inventory/items/DroppedItem.cpp +++ b/src/Rpg/inventory/items/DroppedItem.cpp @@ -2,7 +2,7 @@ DroppedItem::DroppedItem(std::shared_ptr item, const sf::Vector2f& position, int quantity) : mItem(std::move(item)), mPosition(position), mQuantity(quantity), mCanPickUp(false) { - mItemShape.setRadius(11.5f); + mItemShape.setRadius(8.f); mItemShape.setFillColor(sf::Color(20, 20, 20, 100)); mItemShape.setOutlineColor(sf::Color::White); mItemShape.setOutlineThickness(1.5f); @@ -14,7 +14,7 @@ void DroppedItem::render(sf::RenderWindow& window) { if (mItem) { sf::RectangleShape icon = mItem->getIcon(); - icon.setScale(0.25f, 0.25f); + icon.setScale(0.2f, 0.2f); sf::Vector2f iconSize = icon.getSize(); iconSize.x *= icon.getScale().x; @@ -46,6 +46,10 @@ sf::Vector2f DroppedItem::getPosition() const { return mPosition; } +sf::Vector2f DroppedItem::getCenterPosition() const { + return mPosition + sf::Vector2f(mItemShape.getRadius(), mItemShape.getRadius()); +} + float DroppedItem::getHeight() const { return mItemShape.getGlobalBounds().height; } diff --git a/src/Rpg/inventory/items/DroppedItem.h b/src/Rpg/inventory/items/DroppedItem.h index 0c52355..7d31153 100644 --- a/src/Rpg/inventory/items/DroppedItem.h +++ b/src/Rpg/inventory/items/DroppedItem.h @@ -13,6 +13,8 @@ class DroppedItem : public DrawableEntity { int getQuantity() const; const Item* getItem(); sf::Vector2f getPosition() const override; + sf::Vector2f getCenterPosition() const; + float getHeight() const override; sf::CircleShape getItemShape() const { return mItemShape; } bool getPickUpCap(); From 2d0d00b18fb1653521b5b334456fd45fb4594518 Mon Sep 17 00:00:00 2001 From: Mihai Dumitrescu Date: Sun, 21 Dec 2025 17:59:18 +0200 Subject: [PATCH 2/2] Calculate drop position gradually until collision Signed-off-by: Mihai Dumitrescu --- src/Rpg/gamengine/RPGEngine.cpp | 89 ++++++++++++++++--------- src/Rpg/gamengine/RPGEngine.h | 2 + src/Rpg/inventory/items/DroppedItem.cpp | 2 +- 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/Rpg/gamengine/RPGEngine.cpp b/src/Rpg/gamengine/RPGEngine.cpp index 8ae5742..ae0a900 100755 --- a/src/Rpg/gamengine/RPGEngine.cpp +++ b/src/Rpg/gamengine/RPGEngine.cpp @@ -288,19 +288,8 @@ void RPGEngine::processEvents() { int quantity = mInventory.getItemQuantityAt(slotIndex); std::unique_ptr uniqueItem = mInventory.extractItemAt(slotIndex); std::shared_ptr sharedItem(std::move(uniqueItem)); - sf::Vector2f droppedItemPos; - if (mCharacter.getAnimation() == 1) - droppedItemPos = {-35.5f, 2.f}; - else if (mCharacter.getAnimation() == 2) - droppedItemPos = {13.f, 2.f}; - else if (mCharacter.getAnimation() == 3) - droppedItemPos = {-11.5f, -mCharacter.getHeight() / 1.1f}; - else if (mCharacter.getAnimation() == 4) - droppedItemPos = {-11.5f, mCharacter.getHeight() / 2.f}; - const DroppedItem dropItem(sharedItem, - mCharacter.getCenterPosition() + droppedItemPos, - quantity); + const DroppedItem dropItem(sharedItem, calculateDropPosition(), quantity); mDroppedItems.push_back(std::move(dropItem)); } } @@ -313,19 +302,8 @@ void RPGEngine::processEvents() { int quantity = mInventory.getItemQuantityAt(slotIndex); std::unique_ptr uniqueItem = mInventory.extractItemAt(slotIndex); std::shared_ptr sharedItem(std::move(uniqueItem)); - sf::Vector2f droppedItemPos; - if (mCharacter.getAnimation() == 1) - droppedItemPos = {-35.5f, 2.f}; - else if (mCharacter.getAnimation() == 2) - droppedItemPos = {13.f, 2.f}; - else if (mCharacter.getAnimation() == 3) - droppedItemPos = {-11.5f, -mCharacter.getHeight() / 1.1f}; - else if (mCharacter.getAnimation() == 4) - droppedItemPos = {-11.5f, mCharacter.getHeight() / 2.f}; - const DroppedItem dropItem(sharedItem, - mCharacter.getCenterPosition() + droppedItemPos, - quantity); + const DroppedItem dropItem(sharedItem, calculateDropPosition(), quantity); mDroppedItems.push_back(std::move(dropItem)); } } @@ -463,21 +441,25 @@ void RPGEngine::update() { mShowDialogue = false; } + sf::FloatRect playerBounds = mCharacter.getBounds(); + sf::Vector2f playerCenter = {playerBounds.left + playerBounds.width / 2.f, playerBounds.top + playerBounds.height / 2.f}; + for (auto it = mDroppedItems.begin(); it != mDroppedItems.end();) { + sf::Vector2f itemCenter = it->getCenterPosition(); float distance = std::sqrt( - std::pow(mCharacter.getPosition().x - it->getPosition().x, 2.f) + - std::pow(mCharacter.getPosition().y - it->getPosition().y, 2.f) + std::pow(playerCenter.x - itemCenter.x, 2.f) + + std::pow(playerCenter.y - itemCenter.y, 2.f) ); if (it->getPickUpCap()) { - if (distance < 35.f) { + if (distance < 28.f) { auto itemClone = it->getItem()->clone(); mInventory.addItem(std::move(itemClone), it->getQuantity()); it = mDroppedItems.erase(it); continue; } } else { - if (distance > 35.f) + if (distance > 28.f) it->setPickUpCap(true); } ++it; @@ -569,7 +551,6 @@ void RPGEngine::render() { renderQueue.emplace_back(depth, entity); } - renderQueue.emplace_back(mCharacter.getPosition().y + mCharacter.getHeight(), &mCharacter); for (auto& npc : mNPCManager.getNPCs()) renderQueue.emplace_back(npc->getPosition().y + npc->getHeight(), static_cast(npc.get())); @@ -577,6 +558,8 @@ void RPGEngine::render() { for (auto& droppedItem : mDroppedItems) renderQueue.emplace_back(droppedItem.getPosition().y + droppedItem.getHeight(), &droppedItem); + renderQueue.emplace_back(mCharacter.getBounds().top + mCharacter.getBounds().height, &mCharacter); + std::sort(renderQueue.begin(), renderQueue.end(), [](const std::pair& a, const std::pair& b) { return a.first < b.first; @@ -586,9 +569,6 @@ void RPGEngine::render() { for (auto& entity : renderQueue) entity.second->render(mWindow); - for (auto& droppedItem : mDroppedItems) - droppedItem.render(mWindow); - if (mShowInteract) { mWindow.draw(mInteractCircle); mWindow.draw(mInteractText); @@ -1178,3 +1158,48 @@ Inventory& RPGEngine::getInventory() { return mInventory; } +sf::Vector2f RPGEngine::calculateDropPosition() { + sf::FloatRect playerBounds = mCharacter.getBounds(); + sf::Vector2f startPos = {playerBounds.left + playerBounds.width / 2.f, playerBounds.top + playerBounds.height / 2.f}; + + sf::Vector2f dir(0.f, 0.f); + int playerAnimation = mCharacter.getAnimation(); + if (playerAnimation == 1) { + dir = {-1.f, 0.f}; + startPos.x += 5.f; + startPos.y -= 4.f; + } else if (playerAnimation == 2) { + dir = {1.f, 0.f}; + startPos.x -= 6.f; + startPos.y -= 5.f; + } else if (playerAnimation == 3) { + dir = {0.f, -1.f}; + } else if (playerAnimation == 4) { + dir = {0.f, 1.f}; + startPos.y -= 7.f; + } + + float maxDist = 28.f; + float step = 2.f; + float itemSize = 22.f; + sf::Vector2f validPos = startPos; + + for (float dist = itemSize; dist <= maxDist; dist += step) { + sf::Vector2f nextPos = startPos + (dir * dist); + + sf::FloatRect itemBounds( + nextPos.x - itemSize / 2.f, + nextPos.y - itemSize / 2.f, + itemSize, + itemSize + ); + + if (mZoneManager.checkCollision(itemBounds)) + break; + + validPos = nextPos; + } + + return validPos - sf::Vector2f(8.f, 8.f); +} + diff --git a/src/Rpg/gamengine/RPGEngine.h b/src/Rpg/gamengine/RPGEngine.h index c896c3b..32e439b 100644 --- a/src/Rpg/gamengine/RPGEngine.h +++ b/src/Rpg/gamengine/RPGEngine.h @@ -154,5 +154,7 @@ class RPGEngine { GameContext mGameContext; ZoneManager mZoneManager; WaypointManager mWaypointManager; + + sf::Vector2f calculateDropPosition(); }; diff --git a/src/Rpg/inventory/items/DroppedItem.cpp b/src/Rpg/inventory/items/DroppedItem.cpp index 25c6126..f019ca0 100644 --- a/src/Rpg/inventory/items/DroppedItem.cpp +++ b/src/Rpg/inventory/items/DroppedItem.cpp @@ -5,7 +5,7 @@ DroppedItem::DroppedItem(std::shared_ptr item, const sf::Vector2f& p mItemShape.setRadius(8.f); mItemShape.setFillColor(sf::Color(20, 20, 20, 100)); mItemShape.setOutlineColor(sf::Color::White); - mItemShape.setOutlineThickness(1.5f); + mItemShape.setOutlineThickness(1.4f); mItemShape.setPosition(mPosition); }