Pygame 两个对象渲染问题
Pygame two objects rendering issue
我正在练习我的 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()
从 class Mob
中删除 pygame.display.flip()
。并在应用程序循环结束时执行单个 pygame.display.flip()
。多次调用 pygame.display.flip()
会导致闪烁。
(参见 )。
当您在绘制第一个精灵后更新显示时,只有第一个精灵出现在 window 中。第二次更新显示时,会显示两个精灵。因此第二个精灵是“闪烁”。
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)
我正在练习我的 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()
从 class Mob
中删除 pygame.display.flip()
。并在应用程序循环结束时执行单个 pygame.display.flip()
。多次调用 pygame.display.flip()
会导致闪烁。
(参见
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)