首页 > 解决方案 > PyGame,让坦克炮跟随你的光标,也是很好的碰撞实现实践

问题描述

我是 pygame 的新手,我正在尝试制作一个平台游戏。我还计划使用套接字在其中添加多人游戏功能。玩家就像可以跳跃的坦克,您可以移动鼠标将坦克的枪对准光标的方向并在单击时射击。

我所做的是我画了一个矩形,它是坦克的身体,以及从矩形的中心到光标位置的一条线,应该是坦克的枪。现在,绘制的线不是固定的,如果我将鼠标从水箱移开,线的长度将跟随鼠标光标。这是它的样子: 在此处输入图像描述

我不知道如何使它成为固定长度,我对这个问题做了一些数学说明,可能会有所帮助: 在此处输入图像描述 其中 A 是坦克的中心,B 是鼠标的位置,R 是坦克的火炮,C 是坦克的火炮的终点。目标是在给定 A、B 和 r 的情况下得到 C,同时还要考虑到 A 和 B 的距离可以小于半径(因为鼠标可以去任何它想去的地方)。虽然我不确定插图是否正确,因为鼠标可能会进入圆圈并且老实说我对此感到困惑..

最后一件事,是否有实现碰撞的最佳方法?因为我的解决方案是只保存每个平台的坐标,然后像这样执行 if 语句:

如果 playerY > platform1Y:停止下降

如果 playerX > platform2X:停止向左移动

如果 playerY < platform3Y:停止向上移动

如果 playerX < platform4Y:停止向右移动

标签: pythonpygame

解决方案


您必须计算从AB的方向向量。计算唯一向量(长度为 1 的向量)并将其缩放到半径r。将向量添加到点A。结果是点C
在 pygame 中,这个计算非常简单。使用pygame.math.Vector2和 运算scale_to_length()得到从AC的向量 ( V ) 。最后将V添加到C

def point_on_circle(ax, ay, bx, by, radius):
    if ax == bx and ay == by:
        return ax, ay

    A = pygame.math.Vector2(ax, ay)
    B = pygame.math.Vector2(bx, by)

    V = B - A
    V.scale_to_length(radius)

    C = A + V
    return C.x, C.y  

您已将对象的中心传递给参数 ( ax, ay)。您可以使用pygame.Rect来计算矩形的中心。例如:

player_rect = pygame.Rect(playerX, playerY, playerWidth, playerHeight)
ax, ay = player_rect.center 

推荐阅读