2D阵列/网格中的对象移动

时间:2015-04-13 18:58:46

标签: c++

我正在尝试创建经典Snake游戏的变体。

基本上我坚持的是如何将蛇的运动限制在2D阵列中,从而有一个20x20的网格。

此刻,我的蛇头只是一个用中点绘制的形状,在游戏板内一次可以自由移动一个像素。我要求蛇一次移动一个网格空间。

这是我的蛇码:

void Snake::move()
{
    switch(direction_){
    case Direction::North:
        position_.y += 1;
        break;
    case Direction::East:
        position_.x += 1;
        break;
    case Direction::South:
        position_.y -= 1;
        break;
    case Direction::West:
        position_.x -= 1;
    }

    if (position_.x < 6.4) position_.x = 44.8; else if (position_.x > 44.8) position_.x = 6.4;
    if (position_.y < 0) position_.y = 38.4; else if (position_.y > 38.4) position_.y = 0;

}

void Snake::render(prg::Canvas& canvas) const
{

    canvas.drawCircle(getPosition().x * 20, getPosition().y * 20,19.2,prg::Colour::GREEN);
}

void Snake::changeDirection(Direction new_direction)
{
    direction_ = new_direction;
}

这是处理键盘输入/移动的代码

PlayerSnake::PlayerSnake()
{
    prg::application.addKeyListener(*this);
}

PlayerSnake::~PlayerSnake()
{
    prg::application.removeKeyListener(*this);
}

bool PlayerSnake::onKey(const prg::IKeyEvent::KeyEvent& key_event)
{
    if(key_event.key_state == KeyEvent::KB_DOWN) {
        switch(key_event.key) {

        case KeyEvent::KB_LEFT_KEY:
            changeDirection(Direction::West);
            break;
        case KeyEvent::KB_RIGHT_KEY:
            changeDirection(Direction::East);
            break;
        case KeyEvent::KB_UP_KEY:
            changeDirection(Direction::North);
            break;
        case KeyEvent::KB_DOWN_KEY:
            changeDirection(Direction::South);
            break;
        }
    }
    return true;
}

我迫切需要任何建议,一直绞尽脑汁试图让蛇沿着网格移动。我也是C ++的新手,所以请理解。

谢谢:)

1 个答案:

答案 0 :(得分:0)

不要将屏幕视为数据。屏幕是数据的表示。这意味着您必须找到一种方法将数据映射到它的视觉等效物。

如果网格为20x20,但屏幕渲染为200x200,则意味着像素与单元格的比率为1:10。因此,一种可能的绘图方法可能如下所示。 (抱歉,使用处理语法。)

在处理中,一种绘制矩形的方法是使用命令rect(int left,int top,int right,int bottom);

因此,一个实现可能如下所示:

void draw_square(int cellx, int celly)
{
   rect(cellx*10, celly*10, cellx*10+10, celly*10+10);
}