【问题标题】:Pygame two objects rendering issue [duplicate]Pygame两个对象渲染问题[重复]
【发布时间】:2021-04-15 14:21:23
【问题描述】:

我正在练习我的 pygame 知识,但我在这里遇到了问题。我有两个矩形,但是当我运行程序时,其中一个在闪烁。我尝试交换zombi.appear()player.appear() 并注意到闪烁的矩形总是第二个(因此在下面的情况下它是player.appear())。所以我假设他们以某种方式互相打断。请帮我解决这个问题。

提前致谢!

import pygame
import random

# Variables
inProcess = True
width, height = 500, 500
red = (255, 0, 0)
blue = (0, 0, 255)

# Pygame Settings
pygame.init()
screen = pygame.display.set_mode([width, height])
clock = pygame.time.Clock()


class Mob:
    def __init__(self, x, y, speed, type, color):
        self.x = x
        self.y = y
        self.speed = speed
        self.type = type
        self.color = color

    def render(self):
        pygame.display.flip()

    def appear(self):
        pygame.draw.rect(screen, self.color, (self.x, self.y, 64, 64))
        if self.type == 'player':
            self.move_player()
        if self.type == 'zombi':
            self.move_zombi()

        self.render()

    def move_player(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w] and self.y > 0:
            self.y -= self.speed
        elif keys[pygame.K_s] and self.y < height - 64:
            self.y += self.speed
        elif keys[pygame.K_a] and self.x > 0:
            self.x -= self.speed
        elif keys[pygame.K_d] and self.x < width - 64:
            self.x += self.speed

    def move_zombi(self):
        if self.y < 0 or self.y + 64 > height:
            self.speed *= -1

        self.y += self.speed


def main():
    player = Mob(64, 64, 1, 'player', red)
    zombi = Mob(256, 256, 2, 'zombi', blue)

    while inProcess:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()

        screen.fill((255, 255, 255))

        zombi.appear()
        player.appear()

        clock.tick(60)


main()

【问题讨论】:

    标签: python python-3.x pygame render


    【解决方案1】:

    Mob 类中删除pygame.display.flip()。并在应用程序循环结束时执行一个 pygame.display.flip()。多次调用pygame.display.flip() 会导致闪烁。
    (见Why is the PyGame animation is flickering)。 当您在绘制第一个精灵后更新显示时,只有第一个精灵出现在窗口中。第二次更新显示时,两个精灵都会显示。因此第二个精灵正在“闪烁”。

    class Mob:
       # [...]
    
       # DELETE
       # def render(self):
       #      pygame.display.flip()
    
        def appear(self):
            pygame.draw.rect(screen, self.color, (self.x, self.y, 64, 64))
            if self.type == 'player':
                self.move_player()
            if self.type == 'zombi':
                self.move_zombi()
    
            # self.render() <--- DELETE
    
    def main():
        player = Mob(64, 64, 1, 'player', red)
        zombi = Mob(256, 256, 2, 'zombi', blue)
    
        while inProcess:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit()
    
            screen.fill((255, 255, 255))
    
            zombi.appear()
            player.appear()
    
            pygame.display.flip() # <-- ADD
    
            clock.tick(60)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多