如何将pyglet精灵绑定到pymunk体上,这样如果体旋转,精灵也会旋转?
我有一个圆圈,上面有一个盒子:
圆圈是一个简单的电机。我希望盒子直接位于圆圈上方。我尝试过不同的约束,但大多数尝试都会导致盒子翻到一边。
我最成功的尝试是将盒子的 body.moment 设置为 pymunk.inf,并将盒子固定到圆圈上。这已经很接近了,但是当我希望它直接位于圆的中心上方时,盒子仍然会从一侧移动到另一侧。我可以在那里手动设置它,但似乎我应该能够在某种限制下这样做。
有任何想法吗?下面是一些使用 Pymunk 和 Arcade 库的示例代码。
import arcade
import pymunk
import math
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 800
BOX_SIZE = 45
class MyApplication(arcade.Window):
""" Main application class. """
def __init__(self, width, height):
super().__init__(width, height)
arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
# -- Pymunk space
self.space = pymunk.Space()
self.space.gravity = (0.0, -900.0)
# Create the floor
body = pymunk.Body(body_type=pymunk.Body.STATIC)
self.floor = pymunk.Segment(body, [0, 10], [SCREEN_WIDTH, 10], 0.0)
self.floor.friction = 10
self.space.add(self.floor)
# Create the circle
player_x = 300
player_y = 300 …Run Code Online (Sandbox Code Playgroud) 首先,我必须说我是法国人(这样你就明白为什么我会犯所有这些错误,哈哈)
\n\n我正在使用 python、pygame 和 pymunk 开发一个物理游戏:一个球(我称之为 X)必须到达 Y 点。这是一款 2d 平台游戏。为了帮助球到达 Y 点,用户必须添加球(右键单击)并制作形状来帮助 X 移动。
\n\n但是......当我发现(最近,在我开始编码之后)pygame 中类和方法以及精灵的存在时,我很惊讶地发现我的代码“丑陋”,而且太混乱了。但我不想重写代码,我的目标是在“空间”(窗口)中添加一个区域,当 X 与其碰撞时,会发生一个事件(例如;下一个级别,出现一张图片) , ETC)。
\n\n谁能帮我 ?我一直在法国论坛上询问,但找不到解决方案。我希望堆栈溢出社区能够解决这个问题^^
\n\n谢谢大家 :)
\n\n(代码:)
\n\n import pygame\nfrom pygame.locals import *\nfrom pygame.color import *\n\nimport random\nimport math\nimport pymunk\nfrom pymunk import Vec2d\nimport pymunk as pm\n\nX,Y = 0,1\n### Physics collision types\nCOLLTYPE_DEFAULT = 0\nCOLLTYPE_MOUSE = 1\nCOLLTYPE_BALL = 2\n\n\ndef flipy(y):\n """Small hack to convert chipmunk physics to pygame coordinates"""\n return -y+600\n\n\ndef mouse_coll_func(space,arbiter):\n s1,s2 = arbiter.shapes\n s2.unsafe_set_radius(s2.radius + 0.15)\n return …Run Code Online (Sandbox Code Playgroud) 我在 Stack Overflow 上发表的第一篇文章,请耐心等待。我使用 pymunk 物理库在 python 中构建了一个混沌双摆模型,该库又使用了chipmunk C 库。钟摆是混沌的,对初始条件表现出极大的敏感性。然而,我意识到,即使我使用完全相同的初始条件(无论如何更改零代码)运行模拟,这两个模拟也会很快出现分歧。
我的代码中有一些东西每次运行时都有可能产生不同的结果。因为模拟是混乱的,所以运行之间任何不恒定的微小错误都可能导致巨大的变化。
可能是什么原因造成的?我不确定这是否是花栗鼠、pymunk、甚至 python 或我的操作系统/PC 中的小缺陷造成的。
编辑:
这是我的代码:
import pyglet
import pymunk
import pymunk.pyglet_util
def add_pendulum(space):
static_body = pymunk.Body()
static_body.position = 400, 400
mass = 10
inertia = pymunk.moment_for_box(mass, 5, 100)
body1 = pymunk.Body(mass, inertia)
body1.position = 350, 400
l1 = pymunk.Poly(body1, [(50, 0), (-50, 0), (-50, 5), (50, 5)])
l1.friction = 0.1
l1.collision_type = 2
pivot_joint = pymunk.PivotJoint(static_body, body1, (400, 400))
space.add(body1, l1, pivot_joint)
mass = 10
inertia = pymunk.moment_for_box(mass, …Run Code Online (Sandbox Code Playgroud) 我希望能够锁定车轮相对于汽车底盘的角度。在车轮之间,有弹簧,应该允许汽车暂停,但现在,角度没有锁定。我正在使用 pymunk 的函数“RotaryLimitJoint”
这样的行为就是目标 (gif)
现在它看起来像这样:
我的代码:
car_pos = Vec2d(100,500)
mass = 30
radius = 10
moment = pymunk.moment_for_circle(mass, 20, radius)
wheel1_b = pymunk.Body(mass, moment)
wheel1_s = pymunk.Circle(wheel1_b, radius)
wheel1_s.friction = 1.5
wheel1_s.color = wheel_color
space.add(wheel1_b, wheel1_s)
mass = 30
radius = 10
moment = pymunk.moment_for_circle(mass, 20, radius)
wheel2_b = pymunk.Body(mass, moment)
wheel2_s = pymunk.Circle(wheel2_b, radius)
wheel2_s.friction = 1.5
wheel2_s.color = wheel_color
space.add(wheel2_b, wheel2_s)
mass = 100
size = (80,25)
moment = pymunk.moment_for_box(mass, size)
chassi_b = pymunk.Body(mass, moment)
chassi_s = …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习 PyMunk,我使用了网站上的基本示例:
import pymunk
space = pymunk.Space()
space.gravity = 0,-1000
body = pymunk.Body(1,1666)
body.position = 50,100
poly = pymunk.Poly.create_box(body)
space.add(body, poly)
while True:
space.step(0.02)
Run Code Online (Sandbox Code Playgroud)
但它不创建窗口,也不显示任何内容。如何使用PyGame创建图形窗口?
从pymunk示例中,我已经看到pymunk坐标和pygame坐标之间存在差异。此外,该pymunk仅用于2D物理,而pygame用于在屏幕上渲染对象/精灵。
因此,在寻找如何建立摄像机跟随玩家的环境时,人们(包括我在内)最终会感到困惑。我已经在这里,这里,这里和这里看到了示例(甚至很惊讶没有人回答这个问题),但是鉴于与同一主题相关的问题反复被问到,我诚实地认为答案并不能充分解释概念和要求将最简单的示例展示给社区,在社区中用注释解释所有代码。
我曾在OGRE和OSG等3D环境中工作,在这些环境中,相机是可以用视锥浏览器定义的正确概念,但令我惊讶的是2D世界没有为其提供预定义功能。所以:
如果不是在Pymunk或pygame的官方教程中,至少可以提供一个简单的示例(玩家拥有一个Pymunk身体,世界上只有几个Pymunk身体)作为答案,玩家可以在2D Pymunk +中移动pygame世界和相机跟随玩家?
我试图在子进程中运行 PyMunk 模拟并从管道中获取浮点返回值,但是每次运行模拟时,我也会遇到一条Loading chipmunk for Linux (64bit) [/home/user/.local/lib/python3.7/site-packages/pymunk/libchipmunk.so消息。
我已经用 禁用了 PyGame 加载消息os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1',但是我在 PyMunk 中找不到类似变量的文档。
我想避免使用我需要的输出写入文件,因为它只需要一个浮点数。
此代码assassin1.png在黑色屏幕上显示图像,静止在位置(50,80).
目标是在该图像上诱导花栗鼠引力,使其落下.我按照pymunk教程使用pygame编写,并试图适应它.我不知道为什么我的代码没有将重力应用于我的图像.有人能告诉我我做错了什么以及我应该改变什么以使其正常工作?
import pyglet
import pymunk
class PymunkSpace(object):
def assassin_space(self, space):
self.space = space
self.mass = 91
self.radius = 14
self.inertia = pymunk.moment_for_circle(self.mass, 0, self.radius)
self.body = pymunk.Body(self.mass, self.inertia)
self.body.position = 50, 80
self.shape = pymunk.Circle(self.body, self.radius)
self.space.add(self.body, self.shape)
return self.shape
class Assassin(pyglet.sprite.Sprite):
def __init__(self, batch, img, x, y):
pyglet.sprite.Sprite.__init__(self, img, x , y )
class Game(pyglet.window.Window):
def __init__(self):
pyglet.window.Window.__init__(self, width = 315, height = 220)
self.batch_draw = pyglet.graphics.Batch()
self.a_space = PymunkSpace().assassin_space(space)
self.player1 = Assassin(batch = …Run Code Online (Sandbox Code Playgroud) 我真的没有发现任何可以帮助的谷歌搜索。即使对于 py2exe,但我想使用 pyinstaller。
我的问题是模块 (pymunk[aka Chipmunk]) 没有完全包含在 exe 版本中。它可能缺少某种dll。基本上它缺少一个我不知道如何解决的依赖项。
Failed to load pymunk library.
This error usually means that you don't have a compiled version of chipmunk in
the correct spot where pymunk can find it. pymunk does not include precompiled
chipmunk library files for all platforms.
The good news is that it is usually enough (at least on *nix and OS X) to
simply run the compile command first before installing and then retry again:
You compile chipmunk with …Run Code Online (Sandbox Code Playgroud) pymunk ×10
python ×10
pygame ×4
chipmunk ×3
pyglet ×2
arcade ×1
chaos ×1
game-physics ×1
physics ×1
pyinstaller ×1
python-3.x ×1