无法让我的对象指向鼠标

发布于 2024-08-31 11:59:35 字数 1875 浏览 1 评论 0原文

我在一个速成课程项目中结合使用了 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;
}

现在,当我单击对象时,对象会转动并面朝下到左下角,但不再改变方向。我真的很感激能在这里得到的任何帮助。我猜测状态与轮询事件可能存在问题,但从我所经历的所有教程中,我非常确定我已经解决了这个问题。我刚刚碰壁了,我需要一些建议!

I'm using a combination of SDL and OpenGL in a sort of crash course project to teach myself how this all works. I'm really only interested in OpenGL as a way to use acceleration in 2D games so I just need this to work in a 2D plane.

I have been having a lot of problems today with my current issue, I would like an object to point towards the mouse while the mouse button is clicked and then of course stay pointing in that direction after the mouse is lifted.

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;
        }
    }
}

And then this is called at the end of my Object::Move call which also handles x and y translation

if (!mouseUp) {
xVect = mousex - x;
yVect = mousey - y;

radAng = atan2 ( mousey - y, mousex - x );
sAng = radAng * 180 / 3.1415926l;
}

Right now when I click the object turns and faces down to the bottom left but then no longer changes direction. I'd really appreciate any help I could get here. I'm guessing there might be an issue here with state versus polled events but from all the tutorials that I've been through I was pretty sure I had fixed that. I've just hit a wall and I need some advice!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无妨# 2024-09-07 11:59:35

我假设您希望在按住鼠标按钮时对象保持指向鼠标的位置。要解决此问题,您必须在每次移动鼠标时更新鼠标位置。

添加一些与此类似的代码:

if( event.type == SDL_MOUSEMOVE ) {
    // update the mouse position here using event.???.x / y
    }

请注意,我在这里没有 SDL 参考,因此我无法为您提供确切的成员,但这应该有所帮助。

注意:我还猜测您的按钮处理代码会有问题。您有一个 if 语句来检查 event.type 的一个值,但在其主体内您有一个包含两个值的 switch 语句。只会执行这些值之一 - 您可能应该考虑仅对按钮按下/按钮弹起事件使用 2 个单独的 if 语句。

I'm assuming that you want the object to keep pointing at the mouse's position while the mouse button is held. To fix this, you will have to update the mouse position every time the mouse is moved.

Add some code similar to this:

if( event.type == SDL_MOUSEMOVE ) {
    // update the mouse position here using event.???.x / y
    }

Note that I haven't got an SDL reference here, so I can't give you the exact members, but that should help.

NB: I would also guess that there would be problems with your button handling code. You have an if statement that checks for one value of event.type, but then inside its body you have a switch statement with two values. Only one of these values will ever be executed - you should probably think about just using 2 separate if statements for the button down / button up events.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文