SFML 보드 게임에 문제가 있습니다. 토큰이 보드 주위를 돌아 다니고 있고, 보드는 40 개의 필드를 가지고 있으며, 모든 필드는 positionX와 positionY를 정의했습니다. 그러나 때로는 완벽하게 무작위로 나옵니다. 내 토큰이 목표 위치를 놓치고 보드 주변을 추가 라운드 한 다음 멈 춥니 다.SFML과 움직이는 물체를
class Field {
protected:
int m_positionX;
int m_positionY;
public:
//getters and setters
};
모든 플레이어는 내가 선수에 대한 몇 가지 변수를 설정 setInMotion()
기능을 가지고 내 GameEngine
수업 시간에 문제
class Player {
sf::CircleShape m_token;
int m_positionID = 0;
int m_targetPositionX;
int m_targetPositionY;
public:
//getters and setters
}
원인이 토큰은, 함수의 코드라고 그 좌표 CircleShape PositionID 대상 위치가 여기에 관련이 없습니다. 함수 이름이 모두라고 말합니다.
void GameEngine::setInMotion(int number) {
m_players[m_activePlayer].startMoving();
m_players[m_activePlayer].incrementPositionID(number);
m_players[m_activePlayer].setTargetPositionX(m_gameBoard.getField(m_players[m_activePlayer].getPositionID()).getPositionX());
m_players[m_activePlayer].setTargetPositionY(m_gameBoard.getField(m_players[m_activePlayer].getPositionID()).getPositionY());
}
그리고 실제로 가장 중요한 기능은 보드 주위에 토큰을 이동합니다. #DEFINE는 TOKEN_SPEED 1000
는, 방향이 현재의 위치에 따라 4 개 방향으로토큰 이동 은 (알림, 그 보드 게임, 그것은 내가 여기에 무슨 짓을했는지 이해하기 쉬울 것이다), 끝에 현재 위치가 동일
void Player::moveForward(sf::Time dt) {
if ((int)m_token.getPosition().x >= 240 && (int)m_token.getPosition().y >= 600) {
this->m_token.move(-TOKEN_SPEED * dt.asSeconds(), 0);
}
if ((int)m_token.getPosition().x <= 240 && (int)m_token.getPosition().y >= 40) {
this->m_token.move(0, -TOKEN_SPEED * dt.asSeconds());
}
if ((int)m_token.getPosition().x <= 800) && (int)m_token.getPosition().y <= 40) {
this->m_token.move(TOKEN_SPEED * dt.asSeconds(), 0);
}
if ((int)m_token.getPosition().x >= 800) && (int)m_token.getPosition().y <= 600) {
this->m_token.move(0, TOKEN_SPEED * dt.asSeconds());
}
if ((int)m_token.getPosition().x >= getTargetPositionX() - 1 && (int)m_token.getPosition().x <= getTargetPositionX() + 1 &&
(int)m_token.getPosition().y >= getTargetPositionY() - 1 && (int)m_token.getPosition().y <= getTargetPositionY() + 1) {
this->stopMoving();
}
}
하면 목표 위치, 토큰 이동이 중지됩니다. 이제 여기에 주요한 문제가 있습니다. 제 토큰은 때때로 목표 위치를 놓치고, 보드 주위를 달리다가 놓친 목표 위치에서 멈 춥니 다. 그것은 완전히 무작위로 발생합니다. 때로는 응용 프로그램이 토큰을 중지해야하는 마지막 if 문을 검사 할 시간이 충분하지 않은 경우가 있습니다. 천천히 내려
TOKEN_SPEED
도움이되지만 너무 느리게 이동합니다. 또 다른 이유는 내 마지막 if 문이 이렇게 보이는 이유입니다. 단순히
(int)m_token.getPosition().x == getTargetPositionX()
을 확인하면 거의 항상 실패합니다. float position 값을 int로 변환하지 않으면 더욱 심각해질 것입니다. 마지막에 여기 당신이 그것을 훨씬 더 복잡 필요 이상으로하고 있다고 생각
gameLoop()
void GameState::update(sf::Time dt) {
if (m_gameEngine.getActivePlayer().isMoving()) {
m_gameEngine.getActivePlayer().moveForward(dt);
}
}