SDL碰撞处理

时间:2013-07-14 07:43:35

标签: c++ sdl collision

我有一个实例,其中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;

  }
} 

1 个答案:

答案 0 :(得分:1)

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

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

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

考虑到你正在进行棋盘游戏,你甚至不应该进行碰撞检测。将您的电路板表示为您的设备可能的位置图表,将鼠标点击转换为电路板坐标,并计算当前位置和目的地之间的最短路径(使用A* algorithm);无效点击(超出范围)不应转换为移动命令。