2012-11-03 19 views
0

我正在做一个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_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)) 

,错误是有点怪。输出结果是精灵确实出现在屏幕上,当我提供键盘和鼠标输入时,精灵会移动,但问题在于它离开了踪迹。这就是为什么我创建了一个矩形来跟踪精灵矩形,每当游戏循环循环时应该用白色填充。但事实并非如此。至少,直到我最小化窗口并再次拉起它,所有路径消失,背景变成白色而不是黑色。但是当我移动图像时,轨迹又开始形成了。我最小化,他们消失了应该。

回答

0

如果你的渲染功能的作用:

screen.fill(white) 
# blit or sprite group drawing 
pygame.display.flip() 

它会清除整个画面以白色为主,一旦绘制精灵。不会有踪迹。

  • 您的代码没有正确粘贴。如果您的QUIT语句没有缩写,那么您可以使用多语句。与类Sprite相同
  • 如果使用Surface或Sprite作为类/变量名称,可能会遇到命名问题。
+0

你可以把传递RECT序列插入pygame.display.flip脏矩形动画? – user1792990

+0

翻转强制整个屏幕更新,保证没有跟踪。但是您可以使用rect列表来替代,只需使用rect列表调用http://www.pygame.org/docs/ref/display.html#pygame.display.update即可进行更新。不带参数调用'display.update'几乎与调用'pygame.display.flip'相同。 – ninMonkey

0
  1. 您没有正确初始化和更新盲区。这就是为什么屏幕的正确部分没有被更新,并且你的精灵正在离开踪迹。
  2. 在您的更新循环中,由于您只是更新显示中发生更改的部分,所以在进入更新循环之前,您需要更新整个屏幕以初始化它。这就是为什么屏幕最初不是白色的原因。

请参见下面的更新源(仅Sprite类,后来被修改):

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)) 
+0

等待,但当动画函数在游戏循环中被调用时,盲值的位置被定义为精灵矩形的位置。盲目的目的是跟踪精灵矩形,用背景图像填充轨迹,或者在这种情况下是白色,以便轨迹不会出现。不过谢谢你的提示,先把屏幕更新为白色。 – user1792990

+0

尝试运行我粘贴的代码并观察我添加的print()的输出。它会跟随精灵并擦除踪迹。 – junkimu