void MainMenuState::processEvent(sf::Event event, sf::RenderTarget &target) { if(event.type == sf::Event::MouseButtonPressed) { if(!m_draggingPlayer) { sf::Vector2f realCoords = target.mapPixelToCoords( sf::Vector2i(event.mouseButton.x, event.mouseButton.y) ); sf::FloatRect playerRect( m_playerSprite.getPosition().x, m_playerSprite.getPosition().y, m_playerSprite.getScale().x, m_playerSprite.getScale().y ); if(playerRect.contains(realCoords)) { m_draggingPlayer = true; m_offsetToPlayer = sf::Vector2f( realCoords.x - playerRect.left, realCoords.y - playerRect.top ); m_playerSprite.setCurrentAnimation("jump"); } } } else if(event.type == sf::Event::MouseButtonReleased) { m_draggingPlayer = false; } else if(event.type == sf::Event::KeyPressed) { if(m_selectedKeyButton != nullptr) { if(event.key.code != sf::Keyboard::Escape) { strncpy(m_selectedKeyButton, keyToString(event.key.code).data(), 31); m_selectedKeyButton[31] = '\0'; } m_selectedKeyButton = nullptr; updateSettingsFromKeysButtons(); updateKeysButtonsFromSettings(); } } }
void GameScene::handleCollisions() { // Acquire player Rectangle cocos2d::Rect playerRect(mPlayer->getPosition().x - (mPlayer->getBoundingBox().size.width / 2), mPlayer->getPosition().y - (mPlayer->getBoundingBox().size.height / 2), mPlayer->getBoundingBox().size.width, mPlayer->getBoundingBox().size.height); // Player <-> Enemy missile if (vecMissiles.size() > 0) { for (unsigned int i = 0; i < vecMissiles.size() - 1; ++i) { if (vecMissiles[i]->type != Entities::LASER || vecMissiles[i] == nullptr || vecMissiles[i]->getIsValid() == false) continue; cocos2d::Rect missileRect(vecMissiles[i]->getPosition().x - (vecMissiles[i]->getBoundingBox().size.width / 2), vecMissiles[i]->getPosition().y - (vecMissiles[i]->getBoundingBox().size.height / 2), vecMissiles[i]->getBoundingBox().size.width, vecMissiles[i]->getBoundingBox().size.height); if (missileRect.intersectsRect(playerRect)) { vecMissiles[i]->setInvalid(); mPlayer->damage(Damage::ENEMY_PROJ_DMG); } } } // Player <-> Enemy if (vecEnemies.size() > 0) { for (unsigned int i = 0; i < vecEnemies.size() - 1; ++i) { if (mPlayer->getIsDead()) break; if (vecEnemies[i] == nullptr || vecEnemies[i]->getIsValid() == false) continue; cocos2d::Rect enemyRect(vecEnemies[i]->getPosition().x - (vecEnemies[i]->getBoundingBox().size.width / 2), vecEnemies[i]->getPosition().y - (vecEnemies[i]->getBoundingBox().size.height / 2), vecEnemies[i]->getBoundingBox().size.width, vecEnemies[i]->getBoundingBox().size.height); if (enemyRect.intersectsRect(playerRect)) { vecEnemies[i]->die(); mPlayer->damage(Damage::ENEMY_DMG); mPlayer->rageIncrease(5); points -= 100; } } } // Enemy <-> Player missile if (vecEnemies.size() > 0) { for (unsigned int e = 0; e < vecEnemies.size() - 1; ++e) { if (vecEnemies[e] == nullptr || vecEnemies[e]->getIsValid() == false) continue; if (vecMissiles.size() > 0) { for (unsigned int m = 0; m < vecMissiles.size() - 1; ++m) { if ((vecMissiles[m]->type != Entities::WATERBALL && vecMissiles[m]->type != Entities::FIREBALL) || vecMissiles[m] == nullptr || vecMissiles[m]->getIsValid() == false) continue; cocos2d::Rect missileRect(vecMissiles[m]->getPosition().x - (vecMissiles[m]->getBoundingBox().size.width / 2), vecMissiles[m]->getPosition().y - (vecMissiles[m]->getBoundingBox().size.height / 2), vecMissiles[m]->getBoundingBox().size.width, vecMissiles[m]->getBoundingBox().size.height); cocos2d::Rect enemyRect(vecEnemies[e]->getPosition().x - (vecEnemies[e]->getBoundingBox().size.width / 2), vecEnemies[e]->getPosition().y - (vecEnemies[e]->getBoundingBox().size.height / 2), vecEnemies[e]->getBoundingBox().size.width, vecEnemies[e]->getBoundingBox().size.height); if (missileRect.intersectsRect(enemyRect)) { mPlayer->rageIncrease(1); vecEnemies[e]->damage(vecMissiles[m]->type == Entities::WATERBALL ? Damage::WATERBALL_DMG : Damage::FIREBALL_DMG); vecMissiles[m]->setInvalid(); points += 20; if (vecEnemies[e]->getIsDead()) points += 100; } } } } } }
void FallDown::update( float elapsedTime ) { speed = speed + 0.002f * elapsedTime * 60; float offsetDiff = glm::min(125.0f, glm::pow(speed * 6, 0.6f) * 2) * elapsedTime * 60; offset += offsetDiff; if (offset > 128) { offset -= 128; std::vector<bool> line; for (int ii = 0; ii < levelWidth; ii++) line.push_back(!generateEmptyLine); if (!generateEmptyLine) { line[1 + rand()%(line.size() - 2)] = false; if(blib::math::randomDouble() < 0.5) line[1 + rand()%(line.size() - 2)] = false; } line[0] = true; line[line.size() - 1] = true; level.erase(level.begin()); level.push_back(line); generateEmptyLine = !generateEmptyLine; } scrollBack -= 0.5f*offsetDiff; while (scrollBack < 0) scrollBack += backSprite->originalHeight; for(auto p : players) { if (!p->alive) { p->position.y -= 3 * glm::pow(speed*6, 0.6f); continue; } float fac = 8*glm::pow(speed, 0.6f); fac = glm::sqrt(fac); for (int ii = 0; ii < glm::ceil(fac*fac); ii++) { p->position.y += settings->scale * (float)fac / 4 * elapsedTime * 60; if (p->position.y > 1080 - playerSprite->originalHeight) p->position.y = (float)(1080 - playerSprite->originalHeight); blib::math::Rectangle playerRect(glm::floor(p->position), playerSprite->originalWidth, playerSprite->originalHeight); if (hasCollision(playerRect)) p->position.y = 128 * glm::round((p->position.y + offset - 64) / 128) + 64 - offset; float oldPos = p->position.x; p->position.x += fac * p->joystick.leftStick.x * elapsedTime * 60; playerRect = blib::math::Rectangle(glm::floor(p->position), playerSprite->originalWidth, playerSprite->originalHeight); if (hasCollision(playerRect)) p->position.x = 64 * glm::round(oldPos / 64); oldPos = p->position.x; p->position.x += fac * p->joystick.rightStick.x * 0.5f * elapsedTime * 60; playerRect = blib::math::Rectangle(glm::floor(p->position), playerSprite->originalWidth, playerSprite->originalHeight); if (hasCollision(playerRect)) p->position.x = 64 * glm::round(oldPos / 64); } if (p->position.y < 32 || p->position.x < 32 || p->position.x > 1920-32) { for (int ii = glm::max(0, (int)(p->position.x / 100) - 1); ii <= glm::min(29, (int)(p->position.x / 100) + 1); ii++) touchedBlades[ii] = true; p->alive = false; } } }
void Map::movePlayerWithCollision(Player &player, const sf::Time &frameTime) { //Update playerposition player.setPosition(player.getPosition() + (player.getVelocity() * frameTime.asSeconds())); player.setAlive(true); //Set player to be not on ground (collision detection will set it to true of he is on the ground player.setOnGround(false); for (auto &it : mStaticObjects) { //Check if there is a rect under //Get player floatRect sf::FloatRect playerRect(player.getPosition(), player.getSize()); //Area = the intersection sf::FloatRect area; if (it.getGlobalBounds().intersects(playerRect, area)) { if (area.width > area.height) { if (area.contains({ area.left, player.getPosition().y })) { //Head against the wall player.setPosition({ player.getPosition().x, player.getPosition().y + area.height }); if (player.getVelocity().y < 0) player.setVelocity({ player.getVelocity().x, 0.f }); } else { //Standing on the ground player.setOnGround(true); player.setPosition({ player.getPosition().x, player.getPosition().y - area.height }); if (player.getVelocity().y > 0) player.setVelocity({ player.getVelocity().x, 0.f }); } } else if (area.width < area.height) { if (area.contains({ player.getPosition().x + player.getSize().x - 1.f, area.top + 1.f })) { //Right side crash player.setPosition({ player.getPosition().x - area.width, player.getPosition().y }); if (player.getVelocity().x > 0) player.setVelocity({ 0.f, player.getVelocity().y}); } else { //Left side crash player.setPosition({ player.getPosition().x + area.width, player.getPosition().y }); if (player.getVelocity().x < 0) player.setVelocity({ 0.f, player.getVelocity().y }); } } } } //Check if the player is in a deathzone sf::FloatRect playerRect(player.getPosition(), player.getSize()); for (auto &it : mDeathZones) { if (it.getGlobalBounds().intersects(playerRect)) { player.setAlive(false); } } }