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;
		}
	}

}
Exemple #4
0
	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);
			}
		}
	}