0

我有一个实例,其中 SDL_Rect 在一个大 SDL_Rect 内部,我需要它来制作它,这样它就不能离开那个矩形,但仍然可以移动。小矩形的运动需要像棋盘游戏运动一样,您单击一次按钮,它会移动某些绳索,这是我的代码:

if( event.type == SDL_KEYDOWN) { 
switch( event.key.keysym.sym ) { 
case SDLK_UP:
    yVel -= 10;
    if (!check_collision(box,Cont))
    {
      std::cout<<"in the water"<<std::endl;
      box.y -= yVel - 10;
    }
    break;
case SDLK_DOWN:

       if (!check_collision(box,Cont))
    {
      std::cout<<"in the water"<<std::endl;
      box.y -= yVel + 20;
    }
    else
    {
      yVel += 10;
    }
    break; 
case SDLK_LEFT:
    xVel -= 10;
       if (!check_collision(box,Cont))
    {
      std::cout<<"in the water"<<std::endl;
    }
    break; 
case SDLK_RIGHT:
    xVel += 10;
       if (!check_collision(box,Cont))
    {
      std::cout<<"in the water"<<std::endl;
    }
    break; 
case SDLK_1:
    return 2;
    break;

  }
} 
4

1 回答 1

1

SDLK_DOWN的输入和其他输入不一致 - 如果没有碰撞,则不会发生速度变化。

您的输入代码正在更改坐标,它不应该是这样的。让您的输入代码管理“意图”,并让游戏循环将速度应用于对象和碰撞检测。

此外,您的碰撞检查应该检查我是否在position并且我移动delta,我会碰撞吗?如果我确实发生了碰撞,碰撞反应是什么?您希望实体在碰撞时“滑动”还是在检测到碰撞后立即停止?

考虑到您正在玩棋盘游戏,您甚至不必进行碰撞检测。将您的棋盘表示为您的单位可能的位置图,将鼠标点击转换为棋盘坐标并计算您当前位置和目的地之间的最短路径(使用A* 算法);无效点击(越界)不应转化为移动命令。

于 2013-07-15T02:13:04.953 回答