代码之家  ›  专栏  ›  技术社区  ›  ScalaBoy

为什么在PyGame中我得到的是空白的灰色背景而不是动画?

  •  2
  • ScalaBoy  · 技术社区  · 6 年前

    我正在创建 Environment init 应该建立模拟环境,而函数 run 应该在10秒内在此环境中执行不同的事件。

    下面我分享我的代码的一些主要部分。当我跑的时候 env = Environment("TEST") env.run()

    我到底做错了什么 环境

    当我拥有 环境 main 循环,即何时 环境

    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()
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   skrx    6 年前

    你必须通过 all_sprites 中的参数 Worker.__init__ 方法到 __init__ Sprite 类,以便将精灵添加到此组中。

    pygame.sprite.Sprite.__init__(self, all_sprites, groups)
    

    您还可以重新排列 方法并将这两个组作为最后一个参数传递(它们将被添加到 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)