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