void Game::drawCursor(int screen_width) { if (m_Enemies.size()) { for (auto iter = m_Enemies.begin(); iter != m_Enemies.end(); iter++) { shared_ptr<Enemy> enemy = *iter; if (circleCollision(enemy->getX(), enemy->getY(), input::getMouseX(), input::getMouseY(), screen_width / Map::width() / 2)) { if (Map::distance(player->getTilePos(), enemy->getTilePos()) <= Map::fogVisibility()) { gfx::drawCursor("aim_cursor.png", input::getMouseX() - 16, input::getMouseY() - 16); if (input::buttonHeld(SDL_BUTTON_RIGHT)) { player->setTarget(enemy.get()); } } else { gfx::drawCursor("cursor.png", input::getMouseX(), input::getMouseY()); } break; } else if (*iter == m_Enemies.back()) { gfx::drawCursor("cursor.png", input::getMouseX(), input::getMouseY()); break; } } } else { gfx::drawCursor("cursor.png", input::getMouseX(), input::getMouseY()); } }
glm::vec3 spawn() { glm::vec3 cand; do { cand = glm::vec3(randf(-10.0f, 10.0f), 2.0f, randf(-10.0f, 10.0f)); } while (glm::length(circleCollision(cand, MINE_RADIUS, 4, true, true)) > 0.0f); return cand; }
void MyGame::processGameplay() { processPlayer(); map->update(this->player->getPosition(), SCREEN_WIDTH, SCREEN_HEIGHT); Vector2 playerPos = { player->getPosition().x, player->getPosition().y }; for (int i = 0; i < enemies.size(); i++) { Vector2 hunterPos = { enemies[i]->getPosition().x, enemies[i]->getPosition().y }; if (player->isAtDamageFrame() && distanceBetweenVectors(playerPos, hunterPos) <= 100) { if (circleCollision(player->getAttackCollision(), enemies[i]->getDamageCollision())) { enemies[i]->updateHealth(5); } } if (enemies[i]->getStatus() != DEAD) { enemies[i]->update(player->getPosition(), this->gameTimer.getCurrentRuntime(), this->mapTexture->getLocation().w, this->mapTexture->getLocation().h, this->obstacles); if (enemies[i]->getStatus() == SHOOTING) { std::vector<Projectile> newBullets = enemies[i]->shootBullets(this->gameTimer.getCurrentRuntime()); for (int i = 0; i < newBullets.size(); i++) { activeProjectiles.push_back(newBullets[i]); } } } else if (enemies[i]->getStatus() == DEAD) { std::uniform_int_distribution<int> keyDropChance(1, 1); if (keyDropChance(this->randomNumberGen) == 1 && keyDropped == false) { keyDropped = true; keyLocation = { enemies[i]->getPosition().x - map->getDrawLocation().x - 16, enemies[i]->getPosition().y - map->getDrawLocation().y - 16, 32, 32 }; keyCollision = { enemies[i]->getPosition().x - 16, enemies[i]->getPosition().y - 16, 32, 32 }; keyDropTimeout = gameTimer.getCurrentRuntime() + 1000; } } for (int i = activeProjectiles.size() - 1; i > 0; i--) { if (activeProjectiles[i].isActive()) { bool hitSomething = false; Vector2 playerPos = { this->player->getPosition().x, this->player->getPosition().y }; Vector2 bulletPos = { this->activeProjectiles[i].getLocation().x, this->activeProjectiles[i].getLocation().y }; if (distanceBetweenVectors(playerPos, bulletPos) < 100) { if (circleCollision(this->player->getDamageCollision(), this->activeProjectiles[i].getCollision())) { hitSomething = true; } if (hitSomething) { player->updateHealth(-5); } } for (int j = 0; j < obstacles.size(); j++) { if (AABBCollision(this->activeProjectiles[i].getObjCollision(), obstacles[j].getCollisionBox())) { hitSomething = true; break; } } activeProjectiles[i].update(hitSomething); } if (!activeProjectiles[i].isActive()) { activeProjectiles.erase(activeProjectiles.begin() + i); } } } }