我正在尝试使用 pygame 在简单的 2D 窗口中模拟重力。这是非常简单的东西(一个点再次上升和下降)并且我理解机制,即作为向量的速度和 y 部分在每次运行通过主循环和随后的位置更新期间始终减少一个代表重力的值 g点。
一切正常,但我无法选择要插入的正确值。目前这一切都是反复试验。关于如何确定要使用哪些数字以实现半真实的轨迹,是否有一个很好的经验法则?
我在下面插入了一个最小示例,以下值对我的问题很重要:
window = (640, 480) # pixels
initial_speed = 20 # pixels per update along the y axis
gravity = 0.4 # deduction on initial_speed per update
现在,为什么这些数字恰好使幻觉起作用?我首先尝试使用多年前在物理课上学到的公式,但是无论有没有单位转换,模拟都是不正确的。大多数时候,我什至没有看到球,但上述值是通过反复试验发现的。
感谢您提前提供的所有帮助。如果您需要更多信息,请发表评论,我会尽力提供。
这是最小的示例。请注意,vector2D 库是从 pygame 网站方便地借用的(点击此链接)
#!/usr/bin/env python
import pygame
from pygame.locals import *
from vector2D import Vec2d
pygame.init()
GRAVITY = 0.4
class Dot(pygame.sprite.Sprite):
def __init__(self, screen, img_file, init_position, init_direction, speed):
pygame.sprite.Sprite.__init__(self)
self.screen = screen
self.speed = Vec2d(speed)
self.base_image = pygame.image.load(img_file).convert_alpha()
self.image = self.base_image
# A vector specifying the Dot's position on the screen
self.pos = Vec2d(init_position)
# The direction is a normalized vector
self.direction = Vec2d(init_direction).normalized()
def blitme(self):
""" Blit the Dot onto the screen that was provided in
the constructor.
"""
self.screen.blit(self.image, self.pos)
def update(self):
self.speed.y -= GRAVITY
displacement = Vec2d(
self.direction.x * self.speed.x,
self.direction.y * self.speed.y
)
self.pos += displacement
def main():
DIMENSION = SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
BG_COLOUR = 0,0,0
# Creating the screen
window = screen = pygame.display.set_mode(
(SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
screen = pygame.display.get_surface()
clock = pygame.time.Clock()
dot = Dot(screen, "my/path/to/dot.jpg", (180, SCREEN_HEIGHT),
(0, -1), (0, 20))
mainloop = True
while mainloop:
# Limit frame speed to 50 FPS
time_passed = clock.tick(50)
for event in pygame.event.get():
if event.type == pygame.QUIT:
mainloop = False
# Redraw the background
screen.fill(BG_COLOUR)
dot.update()
dot.blitme()
pygame.display.flip()
if __name__ == '__main__':
main()