示例#1
0
void PlayerObject::move(const Ogre::FrameEvent &evt) {
    Ogre::Vector3 initialPosition = objectNode->getPosition();
    Ogre::Vector3 destination = walkTo;
    Ogre::Real distance;
    Ogre::Real move;

    if (initialPosition != destination) {
        mDirection = destination - initialPosition;
        distance = mDirection.normalise();
        move = mWalkSpeed * evt.timeSinceLastFrame;
        distance -= move;
        rotatePlayer();

        if (distance <= 0.0f) {
            objectNode->setPosition(destination);
            setIdleAnimation();
        } // if
        else {
            objectNode->translate(mDirection * move);
            if (!withinWorld()) {
                objectNode->setPosition(initialPosition);
                walkTo = initialPosition;
                setIdleAnimation();
            } // if
            else {
                setWalkAnimation();
                SoundManager::getInstance().PLAYER_FOOTSTEP_SOUND->stop();
                SoundManager::getInstance().PLAYER_FOOTSTEP_SOUND->play();
            } // else
        } // else
    } // if
} // move
示例#2
0
void Player::updateWalkPath(Game& game, LevelMap& map)
{
	currentWalkTime += game.getElapsedTime();

	while (currentWalkTime >= speed.walk)
	{
		currentWalkTime -= speed.walk;

		auto newDrawPos = drawPosA;
		if (drawPosA == drawPosB)
		{
			if (walkPath.empty() == true &&
				hasWalkingAnimation() == true)
			{
				setStandAnimation();
				resetAnimationTime();
				playerStatus = PlayerStatus::Stand;
			}
			while (walkPath.empty() == false)
			{
				const auto& nextMapPos = walkPath.back();
				if (walkPath.size() == 1)
				{
					const auto levelObj = map[nextMapPos].front();
					if (levelObj != nullptr)
					{
						levelObj->executeAction(game);
						walkPath.pop_back();

						setStandAnimation();
						resetAnimationTime();
						playerStatus = PlayerStatus::Stand;
						return;
					}
				}
				if (nextMapPos == mapPosition)
				{
					walkPath.pop_back();
					continue;
				}
				playSound(walkSound);
				setWalkAnimation();
				setDirection(getPlayerDirection(mapPosition, nextMapPos));
				MapPosition(map, nextMapPos);
				currPositionStep = 0.025f;
				updateWalkPathStep(newDrawPos);
				break;
			}
		}
		else
		{
			updateWalkPathStep(newDrawPos);
		}
		LevelObject::updateDrawPosition(map, newDrawPos);
	}
}
示例#3
0
void Player::setRestStatus(uint16_t restStatus_) noexcept
{
	restStatus = std::min(restStatus_, (uint16_t)1);
	switch (playerStatus)
	{
	case PlayerStatus::Stand:
		setStandAnimation();
		break;
	case PlayerStatus::Walk:
		setWalkAnimation();
		break;
	default:
		break;
	}
}