Что заставляет эти объекты лететь влево с пимунком? - PullRequest
0 голосов
/ 01 сентября 2018

Недавно я пытался сделать простую игру с пимунком. Моя цель (на данный момент) состоит в том, чтобы на ящики воздействовала сила тяжести, и чтобы они «прыгали», когда им вызывается их функция 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)

Извиняюсь за неформальное комментирование. Я пытался использовать простые имена переменных, чтобы за кодом было не сложно следовать. Я считаю, что проблема в классе игрока, так как он контролирует поведение квадратов. Мои физические знания плохие, и я не совсем понимаю концепцию инерции, поэтому, если я допустил ошибку Относительно фундаментальной концепции, связанной с физикой, я был бы очень признателен за любые объяснения, которые могли бы помочь прояснить мое недоразумение. Вот как это ведет себя в настоящее время.

This is how it currently behaves

PS. Я пытаюсь научить себя pymunk / python, и у меня очень мало формального образования по любому из двух, поэтому я прошу прощения за любой «неортодоксальный» код, надеюсь, за ним не так уж трудно следовать.

Спасибо:)

1 Ответ

0 голосов
/ 02 сентября 2018

Проблема в том, что поле игрока не отцентрировано. Центр тяжести бокса находится в точке (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)))

Затем установите положение тела на x, y сразу после

    self.body.position = x,y
...