我正在尝试创建经典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 ++的新手,所以请理解。
谢谢:)
答案 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);
}