2012-11-03 38 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