我有一个 SDL_Rect 位于大 SDL_Rect 内部的实例,我需要它来制作它,这样它就不能离开那个矩形,但仍然可以移动。小 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;
}
}
最佳答案
您的 SDLK_DOWN
和其余输入不一致 - 如果没有碰撞,则不会发生速度变化。
您输入的代码正在改变坐标,不应该是这样的。让您的输入代码管理“意图”,并让游戏循环将速度应用于对象和碰撞检测。
另外,你的碰撞检查应该检查我是否在 position
并且我移动 delta
,我会碰撞吗?如果发生碰撞,碰撞 react 是什么?您希望实体在碰撞时“滑动”还是在检测到碰撞时立即停止?
考虑到您正在玩棋盘游戏,您甚至不必进行碰撞检测。将您的棋盘表示为您的单位可能位于的位置图,将鼠标点击转换为棋盘坐标并计算当前位置和目的地之间的最短路径(使用 A*
algorithm );无效点击(越界)不应转化为移动命令。
关于c++ - SDL 冲突处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17637485/