gpt4 book ai didi

python - 如何在 PyGame 中模拟逼真的速度?

转载 作者:太空宇宙 更新时间:2023-11-04 02:19:47 25 4
gpt4 key购买 nike

我想为所有 worker 对象定义一个真实的步行速度(米/秒)。我该怎么做?

目前我在代码中有参数speed。此参数初始化为 randint(2, 4) - 2 到 4 之间的随机整数。但此值未映射到实际比例。

在我的例子中,已知 1 像素指的是 0.038 米。另外,我们知道步行和运行的人类速度:

METERS_PER_PIXEL = 0.038370147
AVG_WALK_SPEED = 1.4 # meters per second
MIN_RUN_SPEED = 2.0 # meters per second
MAX_RUN_SPEED = 5.0 # meters per second

有了这些常量,我想再引入一个名为 human_speed 的参数。例如,我想将 workerhuman_speed 初始化为 1.4。如何将 1.4 转换为 speed 以便 pygame 可以实现正确的动画?我需要 human_speed 进行一些后端计算。

import pygame, random
import sys

WHITE = (255, 255, 255)
GREEN = (20, 255, 140)
GREY = (210, 210 ,210)

SCREENWIDTH=1000
SCREENHEIGHT=578


class Background(pygame.sprite.Sprite):
def __init__(self, image_file, location, *groups):
self._layer = -1
pygame.sprite.Sprite.__init__(self, groups)

self.image = pygame.transform.scale(pygame.image.load(image_file).convert(), (SCREENWIDTH, SCREENHEIGHT))
self.rect = self.image.get_rect(topleft=location)


class Worker(pygame.sprite.Sprite):
def __init__(self, image_file, location, *groups):

self._layer = 1
pygame.sprite.Sprite.__init__(self, groups)
self.image = pygame.transform.scale(pygame.image.load(image_file).convert_alpha(), (40, 40))
self.rect = self.image.get_rect(topleft=location)
self.change_direction()
self.speed = random.randint(2, 4)


def change_direction(self):

self.direction = pygame.math.Vector2(random.randint(-100, 100), random.randint(-100, 100))

while self.direction.length() == 0:
self.direction = pygame.math.Vector2(random.randint(-100, 100), random.randint(-100, 100))

self.direction = self.direction.normalize()


def update(self, screen):

if random.uniform(0,1)<0.005:
self.change_direction()

vec = [int(v) for v in self.direction * self.speed]
self.rect.move_ip(*vec)

if not screen.get_rect().contains(self.rect):
self.change_direction()
self.rect.clamp_ip(screen.get_rect())

pygame.init()

all_sprites = pygame.sprite.LayeredUpdates()
workers = pygame.sprite.Group()

screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))
pygame.display.set_caption("TEST")

# create multiple workers
for pos in ((0,0), (100, 100), (200, 100)):
Worker("worker.png", pos, all_sprites, workers)

Background("background.jpg", [0,0], all_sprites)

carryOn = True
clock = pygame.time.Clock()

while carryOn:
for event in pygame.event.get():
if event.type==pygame.QUIT:
carryOn = False

all_sprites.update(screen)
all_sprites.draw(screen)

pygame.display.flip()

clock.tick(20)

最佳答案

如果每秒 1.4 米,0.038 米是 1 像素,则 1.4/0.038 = 36.8 像素每秒。

如果您的帧率为 20,这意味着您的平均工作人员应该移动那些 36.8 像素中的 1/20,结果是 1.84每帧像素。

这是比较容易的部分,因为有一些问题,比如:

  • 如果将 Sprite 的位置存储在 Rect 中,则会出现舍入错误,因为 Rect 只能处理整数,而不是 float 。但是您可以创建一个 Vector2 来存储精确位置,并在每次移动时将坐标四舍五入并将它们存储在 Rect 中。

  • 如果您仅依靠固定的目标帧率来计算您要移动的距离,则可能会出现不一致的移动。通常您使用称为增量时间的东西,这基本上意味着您跟踪每帧运行所花费的时间,并将该值传递给您的 update 函数并使用它来计算距离。

关于python - 如何在 PyGame 中模拟逼真的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com