2 回答

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
a 的當(dāng)前位置Body
存儲(chǔ)在position
屬性中(例如space.bodies[0].position
)。
PyGame 使用左上角為 (0, 0) 的坐標(biāo)系。y 軸需要反轉(zhuǎn) (?screen.get_height() - pos[1]
),因?yàn)?y 軸一般指向上,但在 PyGame 坐標(biāo)系中 y 軸指向下。
running = True
while running:
? ? # [...]
? ? # draw a dot in at the center of the bodies
? ? for body in space.bodies:
? ? ? ? pos = body.position
? ? ? ? pygame.draw.circle(screen, (255,0,0), (pos[0], screen.get_height()-pos[1]), 7)
? ? pygame.display.update()
? ? space.step(0.01)
a 的當(dāng)前角度Body
存儲(chǔ)在angle
屬性中(例如body_type.angle
)。
可以通過將旋轉(zhuǎn)的相對(duì)位置與絕對(duì)位置相加來計(jì)算點(diǎn)的當(dāng)前位置。旋轉(zhuǎn)位置可以通過簡(jiǎn)單的三角函數(shù)計(jì)算:
pos?=?abs_pos[0]?+?rel_dist?*?math.cos(angle),?abs_pos[1]?+?rel_dist?*?math.sin(angle)
首先,您必須根據(jù)相對(duì)笛卡爾坐標(biāo)計(jì)算相對(duì)極坐標(biāo):
rel_pos?=?(0,?238.5) rel_dist,?rel_angle?=?math.hypot(*rel_pos),?math.atan2(rel_pos[1],?rel_pos[0])
將當(dāng)前角度添加到極坐標(biāo)角度:
angle?=?rel_angle?+?body_type.angle
例如:
running = True
while running:
? ? # [...]
? ? abs_pos = body_type.position
? ? rel_pos = (0, 238.5)
? ? rel_dist, rel_angle = math.hypot(*rel_pos), math.atan2(rel_pos[1], rel_pos[0])
? ??
? ? angle = rel_angle + body_type.angle
? ? pos = abs_pos[0] + rel_dist * math.cos(angle), abs_pos[1] + rel_dist * math.sin(angle)
? ? pygame.draw.circle(screen, (255, 255, 0), (pos[0], screen.get_height() - pos[1]), 7)
? ? pygame.display.update()
? ? space.step(0.01)
最小的例子:
import pymunk
import pymunk.pygame_util
import pygame
import math
GRAY = (220, 220, 220)
width_mass=50
height_mass=50
pygame.init()
size = 800,600
screen = pygame.display.set_mode(size)
draw_options = pymunk.pygame_util.DrawOptions(screen)
space = pymunk.Space()
space.gravity = (0,-50)
pts = [(-27, -238.5), (27,-238.5), (27,238.5), (-27,238.5)]
body_type=pymunk.Body(body_type=pymunk.Body.KINEMATIC)??
body_type.position = (400, 263.5)??
space.add(body_type)
for i in range(4):
? ? segment = pymunk.Segment(body_type, pts[i], pts[(i+1)%4], 2)
? ? segment.elasticity = 0
? ? segment.friction=0
? ? space.add(segment)
body_type.angular_velocity=0.5
body = pymunk.Body(mass=1, moment=100)
body.position = 400,400
mass = pymunk.Poly.create_box(body, (width_mass, height_mass))
mass.elasticity = 0
space.add(body, mass)
running = True
while running:
? ? for event in pygame.event.get():
? ? ? ? if event.type == pygame.QUIT:
? ? ? ? ? ? running = False
? ? ? ? ? ? #pygame.image.save(screen, 'intro1.png')
? ? screen.fill(GRAY)
? ? space.debug_draw(draw_options)
? ? for body in space.bodies:
? ? ? ? pos = body.position
? ? ? ? pygame.draw.circle(screen, (255, 0, 0), (pos[0], screen.get_height() - pos[1]), 7)
? ? abs_pos = body_type.position
? ? rel_pos = (0, 238.5)
? ? rel_dist, rel_angle = math.hypot(*rel_pos), math.atan2(rel_pos[1], rel_pos[0])
? ? angle = rel_angle + body_type.angle
? ? print( body_type.position.angle)
? ? pos = abs_pos[0] + rel_dist * math.cos(angle), abs_pos[1] + rel_dist * math.sin(angle)
? ? pygame.draw.circle(screen, (255, 255, 0), (pos[0], screen.get_height() - pos[1]), 7)
? ? pygame.display.update()
? ? space.step(0.01)

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
使 Pymunk 模擬的行為類似于本機(jī) PyGame 坐標(biāo)。您只需將以下行添加到您的代碼中即可。
pygame.pygame_util.positive_y_is_up = True
自 PyMunk 6.0 起已默認(rèn)為 True。
添加回答
舉報(bào)