2015-12-12 6 views
1

Пробуждение следующего кода с помощью python 2.7. В основном это круг, который висит от бара и яблока, что вы можете поразить импульсом, нажав пробел. Существует также площадь.Pymunk Pygame Позиции позиций не обновляются

import time 
import pygame 
import pymunk 
import pymunk.pygame_util 
import sys 

pygame.init() 
screen = pygame.display.set_mode((800, 600)) 
clock = pygame.time.Clock() 

space = pymunk.Space() 
space.gravity = 0, -1000 

ball_body = pymunk.Body(100, 100) 
ball_body.position = 400.0, 300.0 
ball_body.angular_velocity = 10.0 
ball_shape = pymunk.Circle(ball_body, 15) 
ball_shape.friction = 0.5 
ball_shape.elasticity = 0.9 
ball_shape.color = (0,0,0,0) 
space.add(ball_body, ball_shape) 


static_lines = [pymunk.Segment(space.static_body, (20,20), (780,20), 2), 
       pymunk.Segment(space.static_body, (20,580), (780,580), 2), 
       pymunk.Segment(space.static_body, (20,20), (20,580), 2), 
       pymunk.Segment(space.static_body, (780,20), (780,580), 2)] 

for static_line in static_lines: 
    static_line.color = (255,255,255) 
    static_line.elasticity = 0.9 
    static_line.friction = 1 

space.add(static_lines) 


i = 0 
prev_body = pymunk.Body(10, 10000) 
prev_body.position = (300, 580) 
chain_fix_point = pymunk.Body() 
chain_fix_point.position = (300, prev_body.position[1]) 

# Another 

i = 0 
prev_body = pymunk.Body(10, 10000) 
prev_body.position = (600, 580) 
chain_fix_point = pymunk.Body() 
chain_fix_point.position = (600, prev_body.position[1]) 

while i < 20: 
    # rotation_center_body = pymunk.Body() 
    # rotation_center_body.position = (400, prev_body.position[1] - 20) 

    body = pymunk.Body(1, 1) 
    body.position = (600, prev_body.position[1] - 10) 

    line = pymunk.Circle(body, 5) 
    line.elasticity = 0 
    line.friction = 1 
    if i == 0: 
     rotation_center_joint = pymunk.PinJoint(body, chain_fix_point) 
    else: 
     rotation_center_joint = pymunk.PinJoint(body, prev_body) 

    space.add(line, body, rotation_center_joint) 

    prev_body = body 

    i += 1 

blob_body = pymunk.Body(5, 1) 
blob_body.position = prev_body.position[0], prev_body.position[1] - 40 
blob_shape = pymunk.Circle(blob_body, 20) 
rotation_center_joint = pymunk.SlideJoint(blob_body, prev_body,(0,0),(0,0),0,40) 
space.add(blob_body, blob_shape, rotation_center_joint) 

appleimg = pygame.image.load('apple.png') 


box_body = pymunk.Body(10,10000) 
box_body.position = 600, 300 
box_vertices = [(570, 270),(570, 330),(630,330),(630,270)] 
box_shape = pymunk.Poly(box_body, box_vertices, offset=(0, 0), radius=1).create_box(box_body, size = (60,60)) 
box_shape.friction = 0.5 
box_shape.elasticity = 0.9 
box_shape.color = (255,0,0) 
space.add(box_body, box_shape) 


def main(): 
    running = True 
    angle = 0; 
    while running == True: 
     print "game loop" 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       running = False 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_SPACE: 
        ball_body.apply_impulse(j = (100000, 100000)) 

     screen.fill((0,0,0)) 
     pymunk.pygame_util.draw(screen, space) 
     if ball_body.angle != 0: 
      angle += ball_body.angular_velocity 
     img = pygame.transform.rotate(appleimg, angle) 
     screen.blit(img, (ball_body.position[0] - 20, 580 - ball_body.position[1])) 
     pygame.display.flip() 
     clock.tick(60) 
     space.step(1/60) 


    pygame.quit() 
    quit() 

main() 

Игра gameloop работает, но позиция не обновляется.

Этот код работал довольно хорошо для python 3.5. Но когда я переключился на 2.7, его провал.

ответ

1

Проблема в том, что в python 2.x вы получаете 0, когда вы делите 1 на 60 при вызове функции шага, так как/выполняет целочисленное деление в 2.x.

Вы можете решить эту проблему, либо путем импорта разделение Python 3 с from __future__ import division

Или вы можете разделить поплавком вместо 1/60.0

Проверить этот вопрос мор информация: In Python 2, what is the difference between '/' and '//' when used for division?

+0

большое спасибо @viblo ... – Saptarshi

+0

Просто для ответа на вопросы от новичка до питона 1) Является ли pymunk багги? Иногда при тяжелых импульсах два тела сливаются, и тело, созданное, сначала исчезает за вторым. 2) В утилите pyxlet 3.x pymunks, похоже, много ошибок с ints и плавает операторов? Вы столкнулись с этим? Можете ли вы предложить средство? – Saptarshi

+0

1) Это является следствием того, как pymunk (и Бурундук, который он строит) работает внутри. Это натурально. Один из способов уменьшить эффект - с меньшего шага. – viblo

Смежные вопросы