C和Allegro - 如何在顶视2D射击游戏中探测镜头?

时间:2013-03-30 20:10:56

标签: c allegro

al_draw_rotated_bitmap(playerTux, defaultPlayer1.size / 2, defaultPlayer1.size / 2, 
        defaultPlayer1.pos[0], defaultPlayer1.pos[1], mousePos / mouseSensitivity, 0);
        al_draw_rotated_bitmap(playerTux, defaultPlayer2.size / 2, defaultPlayer2.size / 2, 
        defaultPlayer2.pos[0], defaultPlayer2.pos[1], 0, 0);

此函数在while循环的每个循环处绘制播放器在给定位置和给定角度的位图。由于鼠标在x轴上的移动,键盘中的事件和播放器的角度会改变运动。忽略mouseSensitivity的除法(这是一个内部方面)。考虑到可以通过移动鼠标将播放器完美地旋转到自己的轴上。 (OBS:武器的图像已经在玩家的图像上,因此武器与玩家一起旋转)。

if (state.buttons & 1) {
            al_draw_rotated_bitmap(pistolFire, defaultPlayer1.size / 8, defaultPlayer1.size / 2, 
            defaultPlayer1.pos[0], defaultPlayer1.pos[1], mousePos / mouseSensitivity, 0); }

现在,按下鼠标左键时,武器末端会出现“火图像”。

考虑到这一切,我们让我们的玩家在地图上移动(在W,A,S,D的每个事件中增加和减少它自己的xPos和yPos),并且我们在地图上有另一个玩家拥有相同的玩家容量。当我们发射武器时(当我们按下鼠标的左键时),如果他在武器的角度范围内,我们必须击中另一个玩家。

问题是:我该怎么办?

if (state.buttons & 1) {
    detectShotColision(); }

我怎么能写出这样一个功能,只考虑武器的角度和两个球员的x和y位置?

1 个答案:

答案 0 :(得分:1)

您可以使用atan2()来计算玩家之间的角度。如果它等于(在一些可接受的三角形内)枪面对的角度,则玩家被击中。

如果玩家之间可能存在吸收命中的东西,那么你需要沿着射击方向走一条线。您可以将两者结合起来以获得优化的解决方案。