我正在创建Environment
类。函数init
应该构建模拟环境,而函数run
应该在10秒内在此环境中执行不同的事件。
下面,我分享了代码的一些主要部分。当我运行env = Environment("TEST") env.run()
(见下文)时,出现带有灰屏的窗口。然后在10秒内关闭。在此屏幕上看不到任何内容。它只是一个灰色背景。但是,我没有收到任何错误消息。
在Environment
类中我在做什么错了?
仅需提及的是,当我将整个Environment
的完整代码直接放在main
循环中时,即当Environment
类不存在时,相同的代码可以很好地工作。
import numpy as np
import pygame
import random
WHITE = (255, 255, 255)
GREEN = (20, 255, 140)
GREY = (210, 210, 210)
SCREENWIDTH = 1000
SCREENHEIGHT = 578
IMG_WORKER_RUNNING = "images/workers/worker_1.png"
IMG_WORKER_IDLE = "images/workers/worker_2.png"
IMG_WORKER_ACCIDENT = "images/workers/accident.png"
class Worker(pygame.sprite.Sprite):
RUNNING = 0
IDLE = 1
ACCIDENT = 2
NUMBER_OF_ACCIDENTS = 0
IMAGE_CACHE = {}
def __init__(self, idw, image_running, image_idle, image_accident,
all_sprites, location, *groups):
# Each state has it's own image
self.images = {
Worker.RUNNING: pygame.transform.scale(
self.get_image(image_running),
(45, 45)
),
Worker.IDLE: pygame.transform.scale(
self.get_image(image_idle),
(20, 45)
),
Worker.ACCIDENT: pygame.transform.scale(
self.get_image(image_accident),
(40, 40)
)
}
self._layer = 2
pygame.sprite.Sprite.__init__(self, groups)
self.idw = idw
self.reset(location)
def reset(self, location):
self.state = Worker.IDLE
self.ticks_in_state = 0
self.location = location
self.image = self.images[self.state]
self.rect = self.image.get_rect(topleft=location)
self.direction = pygame.math.Vector2(0, 0)
self.speed = random.randint(1, 3)
def get_image(self, key):
if not key in Worker.IMAGE_CACHE:
Worker.IMAGE_CACHE[key] = pygame.image.load(key)
return Worker.IMAGE_CACHE[key]
class Environment:
def __init__(self, title):
pygame.init()
self.screen = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))
pygame.display.set_caption(title)
self.all_sprites = pygame.sprite.LayeredUpdates()
self.workers = pygame.sprite.Group()
self.fences = pygame.sprite.Group()
# create a worker
idw = 1
Worker(idw, IMG_WORKER_RUNNING, IMG_WORKER_IDLE,
IMG_WORKER_ACCIDENT, self.all_sprites, (50, 50),
self.workers)
def run(self):
carry_on = True
clock = pygame.time.Clock()
simulation_time = 10 # time in seconds
while carry_on:
for event in pygame.event.get():
if (event.type == pygame.QUIT) or (simulation_time == 0):
carry_on = False
pygame.display.quit()
pygame.quit()
quit()
simulation_time -= 1
agent_action = 0
send_alert = np.random.normal(0, 0.1, 1)
if send_alert > 0.2:
agent_action = 1
self.all_sprites.update(self.screen, agent_action)
self.all_sprites.draw(self.screen)
pygame.display.flip()
clock.tick(20)
if __name__ == "__main__":
env = Environment("TEST")
env.run()
答案 0 :(得分:2)
您必须将all_sprites
方法中的Worker.__init__
参数传递给__init__
类的Sprite
方法,以便将精灵添加到该组中。
pygame.sprite.Sprite.__init__(self, all_sprites, groups)
您还可以重新排列__init__
方法的参数,并将这两个组作为最后一个参数传递(它们将被添加到groups
列表中)。
# In the Worker class.
def __init__(self, idw, image_running, image_idle, image_accident,
location, *groups):
# Pass the two groups as the `groups` argument.
Worker(idw, IMG_WORKER_RUNNING, IMG_WORKER_IDLE,
IMG_WORKER_ACCIDENT, (50, 50), self.all_sprites,
self.workers)
在while循环中,您需要使背景变暗或每帧填满屏幕以清除它,然后绘制精灵并最终使用pygame.display.flip()
更新屏幕(您需要在示例中进行缩进) )。
while carry_on:
for event in pygame.event.get():
if (event.type == pygame.QUIT) or (simulation_time == 0):
carry_on = False
# You probably don't want to decrement the
# simulation_time once per event. Dedent
# this line to decrement it once per frame.
simulation_time -= 1
agent_action = 0
send_alert = np.random.normal(0, 0.1, 1)
if send_alert > 0.2:
agent_action = 1
self.all_sprites.update(self.screen, agent_action)
# Blit a background surface or fill the screen.
self.screen.fill((0, 40, 0)) # Fill with dark green.
# Blit all sprites.
self.all_sprites.draw(self.screen)
# Update the screen.
pygame.display.flip()
clock.tick(20)