Tkinter pymunk+;特金特:如何让皮芒克让球向左或向右移动?
我已经创建了一个小的示例程序,其中我使用pymunk进行物理操作,tkinter进行GUI操作(因为我已经放弃了在Mac上安装pygame的尝试…) 我让它在一个球被创建、落下并从地板上反弹的地方工作。如果我倾斜地板,它开始正确地向左或向右反弹 我搞不懂的是,如何在球的初始位置施加一个力,使其初始速度向右 我在下面包含我的代码。这可能是非常简单的事情,但我不是物理学家,也不知道任何关于瞬间的事情,等等 谢谢 维克Tkinter pymunk+;特金特:如何让皮芒克让球向左或向右移动?,tkinter,pymunk,Tkinter,Pymunk,我已经创建了一个小的示例程序,其中我使用pymunk进行物理操作,tkinter进行GUI操作(因为我已经放弃了在Mac上安装pygame的尝试…) 我让它在一个球被创建、落下并从地板上反弹的地方工作。如果我倾斜地板,它开始正确地向左或向右反弹 我搞不懂的是,如何在球的初始位置施加一个力,使其初始速度向右 我在下面包含我的代码。这可能是非常简单的事情,但我不是物理学家,也不知道任何关于瞬间的事情,等等 谢谢 维克 “一个简单的示例,将一个球反弹到地板上。 BallPhysics类定义了“模型”。
“一个简单的示例,将一个球反弹到地板上。
BallPhysics类定义了“模型”。Ball类是“视图”。
@作者:维克多·诺曼
"""
从tkinter进口*
进口皮芒克
导入pymunk.util
从pymunk导入Vec2d
导入数学、系统、随机
班级舞会:
半径=10
定义初始化(自,窗口):
self.\u window=window
self._window.title(“pymunk物理弹跳球”)
self.\u model=BallPhysics()
自身宽度=400
self.\u canvas=canvas(self.\u窗口,bg='black',
宽度=自身。\宽度,高度=自身。\宽度)
self.\u canvas.pack()
self._render()
def_渲染(自):
self.\u model.next\u step()
x、 y=self.\u model.get\u xy\u for\u ball()
#从自身宽度中减去y值。\u因为y从0向下增加。
自我画布。创建椭圆(x-自我半径,自我宽度-(y-自我半径),
x+自半径,自宽度-(y+自半径),
填充=‘白色’)
self.\u画布后(20,self.\u渲染)
课堂物理:
定义初始化(自):
self.\u space=pymunk.space()
自引力=(0.0,-900.0)
自我。_balls=[]
质量=10
惯性=圆的pymunk力矩(质量,0,球半径,(0,0))
本体=pymunk.本体(质量、惯性)
x=random.randint(50350)
body.position=x400
形状=pymunk.圆(体,球半径,向量2D(0,0))
形状.弹性=0.9
自我空间添加(身体、形状)
self.\u balls.append(形状)
#地板
地板=pymunk.段(自空间静态体,(0.0,10.0),(400.0,10.0),1.0)
地面摩擦力=1.0
地板弹性=0.9
自我空间添加(楼层)
def下一步(自我):
#拆下底部下方的球。
球到球移除=[]
对于球本身。\u球:
如果球体位置y<0:
球到球移除。附加(球)
对于球中球_至_移除:
自我空间。移除(球、球体)
自球。移除(球)
如果透镜(自球)>=1:
v=self.\u balls[0]。body.position
打印(“点=%.2f,%.2f”%(v.x,v.y))
自空间步长(1/50)
def获取球的球(自身):
球数=0
返回(self.\u balls[ball\u num].body.position.x,
self.\u balls[ball\u num].body.position.y)
main=Tk()
app=球(主)
main.mainloop()
您可以使用车身。在您想要推动的车身上,在本地点
(或*在世界点
)施加脉冲。API描述如下:
因此,在代码中,您可以执行body。在将body位置设置为x,400
后,立即在\u local\u点((10000,0))应用\u pulse\u
。请注意,您需要修改冲动的强度以获得所需的效果。通常我在我想要推动的方向上创建一个长度为1的向量,然后乘以我想要的冲量。如下所示:body。在局部点(10000*Vec2d(1,0))应用脉冲。
。然后,它变得容易,而不是目标稍微向上,例如
这个例子包括一个使用apply Pulse:的射击球,当我运行代码时,x/y坐标永远不会改变。我建议第一步是删除tkinter代码,并尝试创建一个循环,精确计算新坐标并将其打印到屏幕上。一旦你这样做了,在画布上画一个对象将很容易(你不应该在每个记号上画一个新的对象,你应该把现有的对象移动到新的坐标)不知道如何回答你。。。我的副本有效。为了确保粘贴在消息中的内容正确无误,我将-n-pasted复制到一个新文件中,然后它就可以工作了。我用的是python3,不是python2。控制台上的输出如下:加载Darwin的花栗鼠(64位)[/usr/local/lib/python3.5/site packages/pymunk/libchipmunk.dylib]point=127.00,400.00 point=127.00,400.00 point=127.00,399.64 point=127.00,398.92 point=127.00,397.84 point=127.00,396.40 point=127.00,394.60 point=127.00,392.44
"""Simple example that bounces one ball against a floor.
The BallPhysics class defines the "model". The Ball class is the "view".
@author: Victor Norman
"""
from tkinter import *
import pymunk
import pymunk.util
from pymunk import Vec2d
import math, sys, random
class Ball:
RADIUS = 10
def __init__(self, window):
self._window = window
self._window.title("Bouncing Ball with pymunk physics")
self._model = BallPhysics()
self._width = 400
self._canvas = Canvas(self._window, bg='black',
width=self._width, height=self._width)
self._canvas.pack()
self._render()
def _render(self):
self._model.next_step()
x, y = self._model.get_xy_for_ball()
# subtract y values from self._width because y increases from 0 downward.
self._canvas.create_oval(x - self.RADIUS, self._width - (y - self.RADIUS),
x + self.RADIUS, self._width - (y + self.RADIUS),
fill = 'white')
self._canvas.after(20, self._render)
class BallPhysics:
def __init__(self):
self._space = pymunk.Space()
self._space.gravity = (0.0, -900.0)
self._balls = []
mass = 10
inertia = pymunk.moment_for_circle(mass, 0, Ball.RADIUS, (0, 0))
body = pymunk.Body(mass, inertia)
x = random.randint(50, 350)
body.position = x, 400
shape = pymunk.Circle(body, Ball.RADIUS, Vec2d(0,0))
shape.elasticity = 0.9
self._space.add(body, shape)
self._balls.append(shape)
# floor
floor = pymunk.Segment(self._space.static_body, (0.0, 10.0), (400.0, 10.0), 1.0)
floor.friction = 1.0
floor.elasticity = 0.9
self._space.add(floor)
def next_step(self):
# Remove balls that are below the bottom.
balls_to_remove = []
for ball in self._balls:
if ball.body.position.y < 0:
balls_to_remove.append(ball)
for ball in balls_to_remove:
self._space.remove(ball, ball.body)
self._balls.remove(ball)
if len(self._balls) >= 1:
v = self._balls[0].body.position
print("point = %.2f, %.2f" % (v.x, v.y))
self._space.step(1 / 50)
def get_xy_for_ball(self):
ball_num = 0
return (self._balls[ball_num].body.position.x,
self._balls[ball_num].body.position.y)
main = Tk()
app = Ball(main)
main.mainloop()