Python Pygame程序执行错误
我正在制作一个pygame程序来制作一个精灵的动画,但问题不是一个特殊的错误:Python Pygame程序执行错误,python,pygame,Python,Pygame,我正在制作一个pygame程序来制作一个精灵的动画,但问题不是一个特殊的错误: import sys import os import pygame from pygame.locals import * pygame.init () WHITE = ( 255, 255, 255 ) BLACK = ( 0, 0, 0 ) Surface = pygame.display.set_mode ((400, 400), 0, 32) pygame.display.set_capt
import sys
import os
import pygame
from pygame.locals import *
pygame.init ()
WHITE = ( 255, 255, 255 )
BLACK = ( 0, 0, 0 )
Surface = pygame.display.set_mode ((400, 400), 0, 32)
pygame.display.set_caption ('Animation Test')
class Processes (object):
@staticmethod
def load_image (imagefile):
image = pygame.image.load (imagefile) #Remember to call imagefile as a string statement
return image, image.get_rect ()
class Sprite (pygame.sprite.Sprite):
def __init__ (self):
pygame.sprite.Sprite.__init__ (self)
self.image, self.rect = Processes.load_image ('frame1.jpg')
self.blindrect = pygame.Rect ((self.rect.top - 289, self.rect.left - 289), (self.rect.width, self.rect.height))
def animation (self, key_event = None, mouse_event = None):
blindpass = 0
if key_event == K_LEFT:
self.rect.centerx = self.rect.centerx - 10
if key_event == K_RIGHT:
self.rect.centerx = self.rect.centerx + 10
if key_event == K_UP:
self.rect.centery = self.rect.centery - 10
if key_event == K_DOWN:
self.rect.centery = self.rect.centery + 10
if mouse_event == MOUSEBUTTONDOWN:
self.rect.centerx, self.rect.centery = pygame.mouse.get_pos ()
if blindpass > 0:
if key_event == K_LEFT:
self.blindrect.centerx = self.blindrect.centerx - 10
if key_event == K_RIGHT:
self.blindrect.centerx = self.blindrect.centerx + 10
if key_event == K_UP:
self.blindrect.centery = self.blindrect.centery - 10
if key_event == K_DOWN:
self.blindrect.centery = self.blindrect.centery + 10
if mouse_event == MOUSEBUTTONDOWN:
self.rect.centerx, self.rect.centery = pygame.mouse.get_pos ()
mecha = Sprite ()
allsprites = pygame.sprite.RenderPlain ((mecha, ))
while True:
Surface.fill (WHITE)
for event in pygame.event.get ():
if event.type == KEYDOWN:
mecha.animation (key_event = event.key)
if event.type == MOUSEBUTTONDOWN:
mecha.animation (mouse_event = event.type)
if event.type == QUIT:
pygame.quit ()
sys.exit (0)
allsprites.draw (Surface)
pygame.display.update ((mecha.rect, mecha.blindrect))
现在,这个错误有点奇怪。输出结果是精灵确实出现在屏幕上,当我提供键和鼠标输入时,它会移动,但问题是它会留下痕迹。这就是为什么我创建了一个矩形来跟踪精灵矩形,这个矩形应该在每次游戏循环时填充白色。但事实并非如此。至少,直到我最小化窗口并再次拉起它,所有的痕迹都消失了,背景变成白色而不是黑色。但当我移动图像时,轨迹又开始形成。如果渲染函数执行以下操作,它们将按预期方式消失。:
screen.fill(white)
# blit or sprite group drawing
pygame.display.flip()
它将清除整个屏幕的白色,绘制精灵一次。不会有痕迹的
- 您的代码粘贴不正确。对于多语句,fLike您的if QUIT语句没有缩进。雪碧也一样
- 如果使用Surface或Sprite作为类/变量名,可能会遇到命名问题
能否将pass rect序列放入pygame.display.flip中以制作脏rect动画?flip强制整个屏幕进行更新,以确保无跟踪。但您可以使用rect列表,只需使用rect列表调用即可进行更新。在没有参数的情况下调用
display.update
与调用pygame.display.flip
Wait非常相似,但是当动画函数在游戏循环中被调用时,blindrect的位置被定义为sprite rect的位置。blindrect的目的是跟踪sprite rect,用背景图像填充轨迹,或者在本例中为白色,这样轨迹就不会出现。但是感谢您提供的关于首先将屏幕更新为白色的提示。请尝试运行我粘贴的代码,并查看我添加的print()的输出。它将跟随精灵并擦除轨迹。
class Sprite (pygame.sprite.Sprite):
def __init__ (self):
pygame.sprite.Sprite.__init__ (self)
self.image, self.rect = Processes.load_image ('frame1.jpg')
#initialize blindrect to be the same rectangle as rect
self.blindrect = pygame.Rect ((self.rect.top, self.rect.left), (self.rect.width, self.rect.height))
def animation (self, key_event = None, mouse_event = None):
print(self.rect)
print(self.blindrect)
#save the current sprite position before moving the sprite
self.blindrect.centerx = self.rect.centerx
self.blindrect.centery = self.rect.centery
if key_event == K_LEFT:
self.rect.centerx = self.rect.centerx - 10
if key_event == K_RIGHT:
self.rect.centerx = self.rect.centerx + 10
if key_event == K_UP:
self.rect.centery = self.rect.centery - 10
if key_event == K_DOWN:
self.rect.centery = self.rect.centery + 10
if mouse_event == MOUSEBUTTONDOWN:
self.rect.centerx, self.rect.centery = pygame.mouse.get_pos ()
print(self.rect)
print(self.blindrect)
mecha = Sprite ()
allsprites = pygame.sprite.RenderPlain ((mecha, ))
#need to initially fill the entire surface with white
Surface.fill (WHITE)
pygame.display.update ((pygame.Rect((0,0),(400,400))))
while True:
Surface.fill (WHITE)
for event in pygame.event.get ():
if event.type == KEYDOWN:
mecha.animation (key_event = event.key)
if event.type == MOUSEBUTTONDOWN:
mecha.animation (mouse_event = event.type)
if event.type == QUIT:
pygame.quit ()
sys.exit (0)
allsprites.draw (Surface)
#update only the previous sprite position and new sprite position
pygame.display.update ((mecha.rect, mecha.blindrect))