0
0
mirror of https://github.com/Nimac0/SDL_Minigame synced 2026-01-12 13:43:41 +00:00

rework calculateSpawnPosition()

This commit is contained in:
ineslelin 2024-12-03 12:06:09 +01:00
parent 1cd604e1f0
commit a49753e39a
2 changed files with 27 additions and 23 deletions

View File

@ -27,7 +27,7 @@ public:
void createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, int speed, const char* texturePath, Entity* owner); void createProjectile(Vector2D pos, Vector2D velocity, int scale, int range, int speed, const char* texturePath, Entity* owner);
void createPowerup(Vector2D pos, std::function<void (Entity*)> pickupFunc, std::string texturePath); void createPowerup(Vector2D pos, std::function<void (Entity*)> pickupFunc, std::string texturePath);
Vector2D calculateSpawnPosition(); Vector2D calculateSpawnPosition(int width, int height);
template <typename T> T calculateType(int amount); template <typename T> T calculateType(int amount);
//texture management //texture management

View File

@ -14,6 +14,7 @@
#include "Vector2D.h" #include "Vector2D.h"
#include "PowerupComponent.h" #include "PowerupComponent.h"
#include <iostream> #include <iostream>
#include <algorithm>
AssetManager::AssetManager(Manager* manager) : man(manager) {} AssetManager::AssetManager(Manager* manager) : man(manager) {}
@ -73,29 +74,32 @@ void AssetManager::createPowerup(Vector2D pos, std::function<void (Entity*)> pic
powerups.addGroup((size_t)Entity::GroupLabel::POWERUPS); powerups.addGroup((size_t)Entity::GroupLabel::POWERUPS);
} }
Vector2D AssetManager::calculateSpawnPosition() Vector2D AssetManager::calculateSpawnPosition(int width, int height)
{ {
Vector2D spawnPos = Vector2D(-1, -1); Vector2D spawnPos = Vector2D(-1, -1);
bool conflict = false;
for (int i = 0; i <= SPAWN_ATTEMPTS; i++) for(int i = 0; i <= SPAWN_ATTEMPTS; i++)
{ {
SDL_Rect spawnRect; SDL_Rect spawnRect = {
spawnRect.h = spawnRect.w = 32; rand() % (SCREEN_SIZE_WIDTH - width),
spawnRect.x = rand() % (SCREEN_SIZE_WIDTH - spawnRect.w); rand() % (SCREEN_SIZE_HEIGHT - height),
spawnRect.y = rand() % (SCREEN_SIZE_HEIGHT - spawnRect.h); width,
conflict = false; height
for (auto cc : this->man->getGame()->collisionHandler->getColliders({ Entity::GroupLabel::MAPTILES })) };
{
if (SDL_HasIntersection(&spawnRect, &cc->collider) && strcmp(cc->tag, "projectile")) std::vector<ColliderComponent*> colliders = this->man->getGame()->collisionHandler->getColliders({Entity::GroupLabel::MAPTILES});
{ bool conflict = std::any_of(colliders.begin(), colliders.end(),
conflict = true; [&](const auto& cc) {
break; return SDL_HasIntersection(&spawnRect, &cc->collider);} );
}
} if(!conflict)
if (conflict) continue; {
spawnPos = Vector2D(spawnRect.x, spawnRect.y); spawnPos = Vector2D(spawnRect.x, spawnRect.y);
} break;
return spawnPos; }
}
return spawnPos;
} }
template <typename T> template <typename T>