Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 57 additions & 32 deletions src/Rpg/gamengine/RPGEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -288,19 +288,8 @@ void RPGEngine::processEvents() {
int quantity = mInventory.getItemQuantityAt(slotIndex);
std::unique_ptr<Item> uniqueItem = mInventory.extractItemAt(slotIndex);
std::shared_ptr<const Item> 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));
}
}
Expand All @@ -313,19 +302,8 @@ void RPGEngine::processEvents() {
int quantity = mInventory.getItemQuantityAt(slotIndex);
std::unique_ptr<Item> uniqueItem = mInventory.extractItemAt(slotIndex);
std::shared_ptr<const Item> 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));
}
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -569,14 +551,15 @@ 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<DrawableEntity*>(npc.get()));

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<float, DrawableEntity*>& a, const std::pair<float, DrawableEntity*>& b) {
return a.first < b.first;
Expand All @@ -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);
Expand Down Expand Up @@ -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);
}

2 changes: 2 additions & 0 deletions src/Rpg/gamengine/RPGEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,5 +154,7 @@ class RPGEngine {
GameContext mGameContext;
ZoneManager mZoneManager;
WaypointManager mWaypointManager;

sf::Vector2f calculateDropPosition();
};

10 changes: 7 additions & 3 deletions src/Rpg/inventory/items/DroppedItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

DroppedItem::DroppedItem(std::shared_ptr<const Item> 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);
mItemShape.setOutlineThickness(1.4f);
mItemShape.setPosition(mPosition);
}

Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions src/Rpg/inventory/items/DroppedItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Loading