【问题标题】:What's causing these objects to fly to the left with pymunk?是什么导致这些物体与 pymunk 一起向左飞?
【发布时间】:2018-09-01 11:44:10
【问题描述】:

最近我一直在尝试用 pymunk 制作一个简单的游戏。我的目标(目前)是让盒子受到重力的影响,并在它们调用 up() 函数时“跳跃”。

这是我的代码。

import pygame
from pygame.locals import *
from pygame.color import *
import pymunk
import pymunk.pygame_util

#constants
WALL_BOUNCINESS = 0
FLOOR_FRICTION = 1
accuracy=1
WALL_PADDING=5


#pygame initiation stuff
pygame.init()
width,height=1500,750
screen = pygame.display.set_mode((width, height))

#main loop initialisations
clock = pygame.time.Clock()
running = True

#physics things
space=pymunk.Space()
space.gravity=(0,-900)

#where the magic happens
draw_options = pymunk.pygame_util.DrawOptions(screen)

#boundaries
wall_body = space.static_body
walls = [pymunk.Segment(wall_body, (WALL_PADDING,height-WALL_PADDING), (width-WALL_PADDING,height-WALL_PADDING),1),
    pymunk.Segment(wall_body, (WALL_PADDING,height-WALL_PADDING), (WALL_PADDING,WALL_PADDING), 1),
    pymunk.Segment(wall_body, (WALL_PADDING,WALL_PADDING), (width-WALL_PADDING,WALL_PADDING), 1),
    pymunk.Segment(wall_body, (width-WALL_PADDING,WALL_PADDING), (width-WALL_PADDING,height-WALL_PADDING),1)]
for wall in walls:
    wall.elasticity = WALL_BOUNCINESS
    wall.friction = FLOOR_FRICTION
space.add(walls)

#keybindings
keybindings={}

#adding objects

class player(): #using a class for neatness, not instantiation purposes
    def __init__(self, starting_coords, keyset_LUR=None):

        x,y=starting_coords[0], starting_coords[1]

        mass=10
        inertia = pymunk.moment_for_box(mass, (100,100))

        self.body = pymunk.Body(mass, inertia)

        self.shape = pymunk.Poly(self.body,((x,y),(x+100,y),(x+100,y+100),(x,y+100)))
        self.shape.elasticity = 0
        self.shape.friction = 0.5

        space.add(self.body, self.shape)

        if keyset_LUR:
            funcs=iter((self.left, self.up, self.right))
            for key in keyset_LUR:
                keybindings[key]=next(funcs)

    def left(self):...
    def right(self):...
    def up(self):
        self.body.apply_impulse_at_local_point((0,100))


p1=player((100,100),(K_a,K_w,K_d))
p2=player((1300,100),(K_LEFT,K_UP,K_RIGHT))

#main løóp
while running:
    for event in pygame.event.get():
        if event.type == QUIT: running = False
        elif event.type == KEYDOWN:
            if event.key in keybindings: keybindings[event.key]()

    screen.fill(THECOLORS["white"])

    space.debug_draw(draw_options) #so happy this exists

    dt=1/(60*accuracy)
    for _ in range(accuracy):
        space.step(dt)

    pygame.display.flip()
    clock.tick(60)

对我的非正式评论表示歉意。我尝试使用简单的变量名,这样代码就不难理解了。 我认为问题出在玩家类上,因为它控制着方块的行为。我的物理知识很差,而且我不太了解惯性的概念,所以如果我做了一个与物理学相关的基本概念有关的错误,我非常感谢任何有助于消除我误解的解释。这就是它当前的行为方式。

PS。我正在尝试自学 pymunk/python,并且在两者中的任何一个方面都没有接受过正规教育,所以我为任何“非正统”代码道歉,希望它不会太难遵循。

谢谢:)

【问题讨论】:

    标签: python python-3.x game-physics physics-engine pymunk


    【解决方案1】:

    问题是播放器框未居中。盒子的重心在世界坐标中的 (0,0) 处。

    因此,您要做的是将多边形形状设置为 (-50,-50) 到 (50,50) 的盒子。然后把它放在你想要的地方,你移动形状所附着的身体。

    所以,先替换

        self.shape = pymunk.Poly(self.body,((x,y),(x+100,y),(x+100,y+100),(x,y+100)))
    

        self.shape = pymunk.Poly(self.body,((-50,-50),(50,-50),(50,50),(-50,50)))
    

    然后将 body 位置设置为 x,y 之后

        self.body.position = x,y
    

    【讨论】:

    • 不幸的是,这些盒子的行为仍然相同。从好的方面来说,这可能解决了我将来一定会遇到的问题。
    • 好的。您在此处粘贴的代码是否给您带来了问题,还是需要更多的东西?因为我试过了,但它似乎工作正常。你用的是哪个版本的pymunk和python?
    • 不,它还是坏了。我正在使用 python 3.6.0,并尝试了几个版本的花栗鼠。
    • 更新了我的答案。我完全错过了包含 x 和 y 的内容。请使用更新后的答案重试,希望它会更好。
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    相关资源
    最近更新 更多