我有一个实例,其中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;
}
}
答案 0 :(得分:1)
您的SDLK_DOWN
和其他输入中存在不一致 - 如果没有碰撞,则不会发生速度变化。
您的输入代码正在改变坐标,它应该不是那样的。使输入代码管理“意图”,并让游戏循环将速度应用于对象和碰撞检测。
此外,您的碰撞检查应该检查我是否在position
并且我移动了delta
,我会碰撞吗?如果我发生碰撞,碰撞反应是什么?您希望实体在碰撞中“滑动”还是只要在检测到碰撞时立即停止?
考虑到你正在进行棋盘游戏,你甚至不应该进行碰撞检测。将您的电路板表示为您的设备可能的位置图表,将鼠标点击转换为电路板坐标,并计算当前位置和目的地之间的最短路径(使用A*
algorithm);无效点击(超出范围)不应转换为移动命令。