python - PyGame,让坦克炮跟随你的光标,也是很好的碰撞实现实践
问题描述
我是 pygame 的新手,我正在尝试制作一个平台游戏。我还计划使用套接字在其中添加多人游戏功能。玩家就像可以跳跃的坦克,您可以移动鼠标将坦克的枪对准光标的方向并在单击时射击。
我所做的是我画了一个矩形,它是坦克的身体,以及从矩形的中心到光标位置的一条线,应该是坦克的枪。现在,绘制的线不是固定的,如果我将鼠标从水箱移开,线的长度将跟随鼠标光标。这是它的样子:
我不知道如何使它成为固定长度,我对这个问题做了一些数学说明,可能会有所帮助: 其中 A 是坦克的中心,B 是鼠标的位置,R 是坦克的火炮,C 是坦克的火炮的终点。目标是在给定 A、B 和 r 的情况下得到 C,同时还要考虑到 A 和 B 的距离可以小于半径(因为鼠标可以去任何它想去的地方)。虽然我不确定插图是否正确,因为鼠标可能会进入圆圈并且老实说我对此感到困惑..
最后一件事,是否有实现碰撞的最佳方法?因为我的解决方案是只保存每个平台的坐标,然后像这样执行 if 语句:
如果 playerY > platform1Y:停止下降
如果 playerX > platform2X:停止向左移动
如果 playerY < platform3Y:停止向上移动
如果 playerX < platform4Y:停止向右移动
解决方案
您必须计算从A到B的方向向量。计算唯一向量(长度为 1 的向量)并将其缩放到半径r。将向量添加到点A。结果是点C。
在 pygame 中,这个计算非常简单。使用pygame.math.Vector2
和 运算scale_to_length()
得到从A到C的向量 ( 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
推荐阅读
- amazon-web-services - Cloudwatch 事件可靠性
- python - 如何在不创建本地文件的情况下将 .xlsx 文件上传到 FTP?
- node.js - 如何在 NodeJS 中发送错误并通过 async/await 在前端接收它?
- r - 从 R 中的 readxl 包中的 Excel 文件导入特定的工作表和特定的行和特定的列
- python - 在预训练模型中列出 spaCy 中最相似的单词
- docker - 当 exec docker 使用“-v /path:/path”参数运行时,Dockerfile 中的文件丢失
- vuetify.js - 如何使带有图像的 v-card 变成圆形?
- scala - 我们可以从一个 spark 会话连接到 Bigtable 和 Hive 吗?
- javascript - 如何在 Windows 中使用命令行发送 curl 请求
- flutter - NoSuchMethodError:在 null 上调用了 getter 'languageCode'。Receiver:null 尝试调用:languageCode