python - 始终以相同的速度将物体移向特定坐标并超出坐标
问题描述
大家好,我正在用 python tkinter 制作一个游戏,你可以控制一个能够在你点击的地方射击的角色。我希望子弹使用 move 和 after 方法始终以相同的速度朝着点击的玩家移动,并且我没有数学知识来考虑计算移动子弹所需的 x 和 y 距离的方程朝向玩家点击的点并越过它,直到它到达画布的末端。有任何想法吗?感谢您的时间和回答
我已经有了播放器和 tkinter 类以及在单击时创建项目符号并将其传递单击坐标的方法。现在我需要在一次刷新后计算 x 和 y 的变化
def fly(self):
self.app.canvsas.move(self.bullet, x and y you calculated)
self.app.canvas.after(some refresh time, self.fly)
解决方案
您可能希望在子弹发射时为其指定 x_speed 和 y_speed,然后通过移动指定的量来更新每一帧。假设您单击(cx,cy)
子弹的起始位置为(sx,sy)
。从这里你会想要得到找到cos(angle)
和的角度sin(angle)
。幸运的是,我们甚至可以在没有角度的情况下获得这些!通过点击点和起点的直接距离,r = ((sx-cx)**2+(sy-cy)**2)**0.5
我们将获得:
cos_angle = (cx-sx)/r
sin_angle = (cy-sy)/r
可以将其保存在您的子弹实例中并乘以子弹的速度,以获得您想要将子弹在x
和y
方向上移动多远:
def updatebulletbycallingthiseveryframe(self):
self.x += self.bullet_speed*self.cos_angle
self.y += self.bullet_speed*self.sin_angle
这将使子弹永远移动,添加检查以查看它是否超出范围,如果发生这种情况则删除子弹。
推荐阅读
- airflow - 使用插件导入 DAG 时出现气流错误 - 只能在 Operator 之间设置关系
- vb.net - vb.net 发送表单到另一台计算机
- wpf - WPF Dispatcher 线程挂起数小时,然后自动恢复
- python - 如何编写一个循环以将多个 txt 表写入 python 中自己的数据帧?
- python - 如何使用 .replace 减少命令以及创建函数中的问题
- big-o - 如何证明哪个渐近符号是有效的
- kotlin - Kotlin:在 when 中使用枚举
- amazon-web-services - 使用 Azure Devops 将 .NET 核心代码部署到 AWS lambda - 找不到项目路径
- android - 传入的通知使我的应用程序 Android 崩溃
- java - 如何向我的 Retry TestNG 方法添加睡眠?