c++ - 特定方向的二维运动

标签 c++ 2d sdl 2d-games

我正在学习如何在 2D map 上移动,需要有关使用三角函数的帮助。

这是我当前的代码。

const Uint8 * key = SDL_GetKeyboardState(NULL);
    if(key[SDL_SCANCODE_D]){
        if(render_arrow){
            arrow.Angle(1);
        }
    }
    if(key[SDL_SCANCODE_A]){
        if(render_arrow){
            arrow.Angle(-1);
        }
    }
    if(key[SDL_SCANCODE_LEFT]){
        if(render_arrow){
            arrow.set_location(arrow.X_Co() - 1, arrow.Y_Co());
        }
    }
    if(key[SDL_SCANCODE_RIGHT]){
        if(render_arrow){
            arrow.set_location(arrow.X_Co() + 1, arrow.Y_Co());
        }
    }
    if(key[SDL_SCANCODE_UP]){
        if(render_arrow){
            arrow.set_location(arrow.X_Co(), arrow.Y_Co() - 1);
        }
    }
    if(key[SDL_SCANCODE_DOWN]){
        if(render_arrow){
            arrow.set_location(arrow.X_Co(), arrow.Y_Co() + 1);
        }
    }

但这有明显的局限性,方向和角度之间没有联系。

我所知道的是,有一个函数以某种方式使用正切比来计算你面对的象限,并给你一些数字来调整位置。但是我不知道这个功能,也不知道如何正确使用它。

我希望能够做的是,当我按下向上键时,让箭头朝它指向的方向移动,而当我按下向下键时,它会向后移动。并左右扫射。 A 和 D 键用于转动角度。

如果您知道任何有用的算法,我们将不胜感激。

编辑:Angle(0) 返回当前角度。

最佳答案

if(key[SDL_SCANCODE_UP]){
    if(render_arrow){
        deltaX = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle());
        deltaY = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle());

        arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY);
    }
}
if(key[SDL_SCANCODE_DOWN]){
    if(render_arrow){
                                                                 //Note the -'s
        deltaX = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle()); 
        deltaY = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle());
        arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY);
    }
}

有关从角度转换为 x y 坐标的更多信息,请参阅此页面 http://www.mathsisfun.com/polar-cartesian-coordinates.html (向下滚动到“从极坐标转换为笛卡尔”),或谷歌“转换极坐标笛卡尔”。

关于c++ - 特定方向的二维运动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581652/

相关文章:

c++ - 需要有关二维数组的建议

c++ - 在 C/C++ 中使用 SDL2_gfx 绘制实心圆

sdl - 使用 SDL 2.0 获取 8 位调色板输出时遇到问题

c++ - Call by pointer 变成 call by reference to pointer

c++ - 在 C++ 中组合来自多个容器的输出

c++ - 为什么 (0+0i)^{0} == (nan, nan) 在 C++ 中

java - 找不到符号: implements Drawable

c++ - 在共享对象/DLL 中使用模板化类和函数

c++ - 为什么我的花车坚持保持整数?

c - 连续二维数组的重新分配