船上移动球员

Moving player on board

本文关键字:移动      更新时间:2023-10-16

我正在使用SFML编写棋盘游戏,我希望我的播放器的数字在该板上移动,但是我希望这是顺利的动画动作,从field X到Field Y. Field Y.不幸的是它没有发生,我的玩家的数字只是改变了位置,它从字段4跳到了场8,而我想从4移至5,然后将其移动到6,然后转移到7,然后Finnaly到8。现在让我们看看一些代码。

首先是字段类。

class Field {
    int m_position_id;
    int m_position_x;
    int m_position_y;
    std::string m_name;
public:
    Field() {}
    Field(int, int, int);
    virtual ~Field() = default;
    int getPosID() { return m_position_id; }
    int getPosX() { return m_position_x; }
    int getPosY() { return m_position_y; }
};

然后,我们得到了基本上只是一系列字段

的董事会
constexpr int BOARD_SIZE = 40;
    class Board {
        std::array<Field, BOARD_SIZE> m_board;
    public:
        Board();
        Field& getBoard(int index) { return m_board[index]; }
};

玩家类

class Player {  
    int m_position_id = 0;  //starting position
    float m_position_x = 600; 
    float m_position_y = 600;   
    sf::CircleShape m_shape;    
public:
    Player(std::string, sf::Color, float);          
    sf::CircleShape& getShape() { return m_shape; }
    int getPositionID() { return m_position_id; }   
    float getPositionX() { return m_position_x; }
    float getPositionY() { return m_position_y; }
    void setPositionID(int p_position_id) { m_position_id = p_position_id; }
    void setPositionX(int p_position_x) { m_position_x = p_position_x; }
    void setPositionY(int p_position_y) { m_position_y = p_position_y; }
};

和finnaly,我期望它不起作用的方法

void GameEngine::movePlayer(Player &p_player, int p_distance) {     
    int l_current_pos_id = p_player.getPositionID();    
    p_player.setPositionID(p_player.getPositionID() + p_distance);
    p_player.setPositionX(m_game_board.getBoard(p_player.getPositionID()).getPosX());
    p_player.setPositionY(m_game_board.getBoard(p_player.getPositionID()).getPosY());
    if (p_player.getPositionID() > 39) {
        p_player.setPositionID(p_player.getPositionID() - 40);
        p_player.setPositionX(m_game_board.getBoard(p_player.getPositionID()).getPosX());
        p_player.setPositionY(m_game_board.getBoard(p_player.getPositionID()).getPosY());
    }       
    //going out of array range here probably
    for (int i = l_current_pos_id; i < p_player.getPositionID(); i++) {
        int x = m_game_board.getBoard(i + 1).getPosX() - m_game_board.getBoard(i).getPosX();
        int y = m_game_board.getBoard(i + 1).getPosY() - m_game_board.getBoard(i).getPosY();
        p_player.getShape().move(x, y); 
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

和Finnaly,可以处理视图

的类
bool m_draw = false;
while (window.isOpen()) {
    if (m_evnt.type == sf::Event::KeyReleased && m_evnt.key.code == sf::Keyboard::R) {
                //Roll dice
                m_game_engine.rollDice(m_game_status); //this just updates some text, result of rollDice is passed as p_distance to movePlayer
                m_draw = true;              
            }
}
window.clear(); 
for (int i = 0; i < m_game_engine.getNumberOfPlayers(); i++) {
    window.draw(m_game_engine.getPlayer(i).getShape());
}       
if (m_draw) {
    for (int i = 0; i < m_game_engine.getNumberOfPlayers(); i++) {
        window.draw(m_game_engine.getPlayer(i).getShape());
}
            window.display();
}

ah,从GameEngine类中

class GameEngine {
    std::vector<Player> m_players;
    Player& getPlayer(int index) { return m_players[index]; }
};

您可以看到,它将其存储在本地变量当前播放器位置,然后分配新的位置,然后通过字段位置ID,它获得了该位置的X和Y坐标。下一步是检查该位置是否在数组内部(必须执行相同的操作以使我的身材围绕木板移动,因为它在第一次电路围绕板上崩溃了。但这不是这里的点。对于循环,应从字段i到(i 1),然后应该等待0.5秒,再次移至下一个字段,等等。它结束了,根本没有动画。

您有一个循环,并且您有等待。那不是游戏的工作方式。您可以在此处阅读基础知识。

您的游戏循环必须运行。那是绘图发生的地方。如果您将令牌移动并在到达之前不要绘制它,它看起来像一个传送。您需要在迷你动物之间绘制。

您的令牌需要目标位置,当前位置和速度。并且您需要将适当的数字添加到当前位置,直到最终到达目标位置为止。但是您不能在封闭的循环中这样做,这需要在游戏循环中进行,这是其中的一部分。您可能还需要一个变量,表明令牌确实是在移动,因此在不完整的时候没有其他事情发生。