我在一个速成课程项目中使用SDL和OpenGL的组合来自学这一切是如何工作的。我真的只对OpenGL作为一种在2D游戏中使用加速的方式感兴趣,所以我只需要在2D平面上工作。
我今天遇到了很多问题,当前的问题,我希望在点击鼠标按钮时指向鼠标,然后在鼠标抬起后保持指向该方向。
void Square::handle_input() {
//If a key was pressed
if( event.type == SDL_KEYDOWN ) {
//Adjust the velocity
switch( event.key.keysym.sym ) {
case SDLK_UP: upUp = false; yVel = -1; break;
case SDLK_DOWN: downUp = false; yVel = 1; break;
case SDLK_LEFT: leftUp = false; xVel = -1; break;
case SDLK_RIGHT: rightUp = false; xVel = 1; break;
case SDLK_w: wUp = false; sAng = 1; break;
case SDLK_s: sUp = false; sAng = -1; break;
}
}
//If a key was released
else if( event.type == SDL_KEYUP ) {
//Adjust the velocity
switch( event.key.keysym.sym ) {
case SDLK_UP: upUp = true; yVel = 0; break;
case SDLK_DOWN: downUp = true; yVel = 0; break;
case SDLK_LEFT: leftUp = true; xVel = 0; break;
case SDLK_RIGHT: rightUp = true; xVel = 0; break;
case SDLK_w: wUp = true; sAng = 0; break;
case SDLK_s: sUp = true; sAng = 0; break;
}
}
//If a mouse button was pressed
if( event.type == SDL_MOUSEBUTTONDOWN ) {
switch ( event.type ) {
case SDL_MOUSEBUTTONDOWN: mouseUp = false; mousex == event.button.x; mousey == event.button.y; break;
case SDL_MOUSEBUTTONUP: mouseUp = true; break;
}
}
}
然后在我的Object :: Move调用结束时调用它,它也处理x和y转换
if (!mouseUp) {
xVect = mousex - x;
yVect = mousey - y;
radAng = atan2 ( mousey - y, mousex - x );
sAng = radAng * 180 / 3.1415926l;
}
现在,当我单击对象时,向下转向并向下到左下角但不再改变方向。我真的很感激我能得到的任何帮助。我猜这里可能存在状态与轮询事件的问题,但是从我所经历的所有教程中我很确定我已经解决了这个问题。我刚刚碰壁,我需要一些建议!
答案 0 :(得分:3)
我假设您希望对象在按住鼠标按钮时指向鼠标的位置。要解决此问题,每次移动鼠标时都必须更新鼠标位置。
添加一些类似的代码:
if( event.type == SDL_MOUSEMOVE ) {
// update the mouse position here using event.???.x / y
}
请注意,我这里没有SDL参考,所以我不能给你确切的成员,但这应该会有所帮助。
注意:我还猜测您的按钮处理代码会出现问题。你有一个if语句检查event.type
的一个值,但是在它的主体内你有一个带有两个值的switch语句。只会执行其中一个值 - 您应该考虑为按钮按下/按钮事件使用2个单独的if语句。