Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tkinter pymunk+;特金特:如何让皮芒克让球向左或向右移动?_Tkinter_Pymunk - Fatal编程技术网

Tkinter pymunk+;特金特:如何让皮芒克让球向左或向右移动?

Tkinter pymunk+;特金特:如何让皮芒克让球向左或向右移动?,tkinter,pymunk,Tkinter,Pymunk,我已经创建了一个小的示例程序,其中我使用pymunk进行物理操作,tkinter进行GUI操作(因为我已经放弃了在Mac上安装pygame的尝试…) 我让它在一个球被创建、落下并从地板上反弹的地方工作。如果我倾斜地板,它开始正确地向左或向右反弹 我搞不懂的是,如何在球的初始位置施加一个力,使其初始速度向右 我在下面包含我的代码。这可能是非常简单的事情,但我不是物理学家,也不知道任何关于瞬间的事情,等等 谢谢 维克 “一个简单的示例,将一个球反弹到地板上。 BallPhysics类定义了“模型”。

我已经创建了一个小的示例程序,其中我使用pymunk进行物理操作,tkinter进行GUI操作(因为我已经放弃了在Mac上安装pygame的尝试…)

我让它在一个球被创建、落下并从地板上反弹的地方工作。如果我倾斜地板,它开始正确地向左或向右反弹

我搞不懂的是,如何在球的初始位置施加一个力,使其初始速度向右

我在下面包含我的代码。这可能是非常简单的事情,但我不是物理学家,也不知道任何关于瞬间的事情,等等

谢谢

维克

“一个简单的示例,将一个球反弹到地板上。
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()