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
}
の原因となるトークンですPositionID目標位置座標とCircleShapeを持っていますここでは無関係です。関数名はすべてそれを言うと思います。
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年
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();
}
}
トークンは、現在位置が等しいたら方向が、最後には現在位置(リマインダー、そのボードゲーム、私がここで何をしたかを理解することが容易になります) に依存し、4つの方向に移動します目標位置、トークンの移動が停止します。ここでは主な問題があります。私のトークンは目標位置を逃してしまい、ボードの周りを走り回って、逃した目標位置で停止します。それは完全にランダムに起こります。それは時々アプリケーションがトークンを停止すべき最後のif文をチェックするのに十分な時間がないのが好きです。遅くなるとTOKEN_SPEED
が助けになりますが、遅すぎます。私の最後のif文がこのように見えるもう一つの理由は、単に私が(int)m_token.getPosition().x == getTargetPositionX()
をチェックすると、ほとんどの場合、それは見逃してしまいます。 floatの位置の値をintに変換しないと、さらに悪化します。ここで終わりにgameLoop()
void GameState::update(sf::Time dt) {
if (m_gameEngine.getActivePlayer().isMoving()) {
m_gameEngine.getActivePlayer().moveForward(dt);
}
}