1

スプライトをアニメーション化する 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))

さて、エラーは少し奇妙です。出力は、スプライトが画面に表示され、キーとマウスの入力を提供すると移動することですが、問題は軌跡を残していることです。これが、ゲーム ループがループするたびに白で塗りつぶされるはずのスプライトの四角形を追跡する四角形を作成した理由です。しかし、そうではありません。少なくとも、ウィンドウを最小化して再度引き上げるまでは、すべての軌跡が消え、背景が黒ではなく白になります。しかし、画像を移動すると、再び軌跡が形成され始めます。最小化すると、想定どおりに消えます。

4

2 に答える 2

0

レンダリング関数が次の場合:

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

画面全体を白くクリアし、スプライトを一度描画します。跡がなくなる。

  • コードが正しく貼り付けられませんでした。複数ステートメントの場合、if QUIT ステートメントにはインデントがありません。クラスSpriteと同じ
  • クラス/変数名として Surface または Sprite を使用すると、命名の問題が発生する可能性があります。
于 2012-11-03T01:33:00.510 に答える
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))
于 2012-11-03T02:11:52.080 に答える