使用多个图像重叠/不工作的Pygame动画

2024-09-27 07:19:35 发布

您现在位置:Python中文网/ 问答频道 /正文

import pygame

pygame.init()

window = pygame.display.set_mode((800,600))

pygame.display.set_caption("TEST2")

black=(0,0,0)
white=(255,255,255)

moveX,moveY=0,0

clock = pygame.time.Clock()

class Sprite:

    def __init__(self,x,y):

        self.x=x

        self.y=y

        self.width=100

        self.height=110

        self.i100 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite0.PNG")

        self.i1 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite1.PNG")

        self.i2 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite2.PNG")

        self.i3 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite3.PNG")

        self.i4 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite4.PNG")

        self.i5 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite5.PNG")

        self.i6 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite6.PNG")

        self.i7 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite7.PNG")

        self.i8 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite8.PNG")

        self.i9 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite9.PNG")

        self.i10 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite10.PNG")

        self.i11 = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite11.PNG")

        self.timeTarget=10

        self.timeNum=0

        self.currentImage=0

    def update(self):

        self.timeNum+=1

        if(self.timeNum==self.timeTarget):

            if (self.currentImage==0):

                self.currentImage+=1

            else:
                self.currentImage=0

            self.timeNum=0

        self.render()

    def render(self):

        if (self.currentImage==0):

            window.blit(self.i100, (self.x,self.y))

        else:

            window.blit(self.i1, (self.x,self.y))

            window.blit(self.i2, (self.x,self.y))

            window.blit(self.i3, (self.x,self.y))

player=Sprite(110,100)
gameLoop = True
while gameLoop:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            gameLoop = False

        if (event.type==pygame.KEYDOWN):

            if (event.key==pygame.K_LEFT):

                moveX = -3

            if (event.key==pygame.K_RIGHT):

                moveX = 3

            if (event.key==pygame.K_UP):

                moveY = -3

            if (event.key==pygame.K_DOWN):

                moveY = 3

        if (event.type==pygame.KEYUP):

            if (event.key==pygame.K_LEFT):

                moveX=0

            if (event.key==pygame.K_RIGHT):

                moveX=0

            if (event.key==pygame.K_UP):

                moveY=0

            if (event.key==pygame.K_DOWN):

                moveY=0

    window.fill(black)

    player.x+=moveX

    player.x+=moveY

    player.update()

    clock.tick(50)

    pygame.display.flip()

pygame.quit()

我正在做的是尝试用pygame将11张照片制作成动画。这段代码可以工作,但当我运行它时,图片似乎几乎重叠了。我为前几张图片做了window.blit,并把它们放在^{下?我觉得我把他们搞错了。此外,我必须补充说,我真的不善于领会人们想说的话,最好从例子中学习。谢谢!在


Tags: keyimageselfeventifpngloadwindow
2条回答

通过将所有这些window.blit(...)调用一个接一个地放在一起,您就将这三个帧相互叠加在一起。即使您的计算机在每次调用之间延迟了一秒钟,您仍然无法单独看到它们,因为在调用pygame.display.flip()之前,它们都不会出现。在

您应该将图像存储在一个列表中,并保留一个类似currentFrame的计数器,该计数器从0循环到{}(或{})。游戏的每一帧你都会这样做:

class Player:
...
def draw(window):
    window.blit(self.frames[self.currentFrame])

顺便说一句:您的代码可以是这样的:

我用我的图片作为例子,但是你的图片还是有线条的。在

我用定时器来改变图像。
您可以按空格键暂停,按escape退出。在

等等

import pygame

#                                   

class Sprite:

    def __init__(self, x, y, curren_time):

        self.rect = pygame.Rect(x, y, 100, 110)

        self.images = []

        #for x in range(12):
        for x in range(1,4):
            img = pygame.image.load("ball" + str(x) +".png")
            #img = pygame.image.load("C:/Users/Trevor/SkyDrive/Documents/TEST2.0/Sprite" + str(x) +".PNG")
            self.images.append( img )

        self.current_image = 0

        self.time_num = 100 # miliseconds
        self.time_target = curren_time + self.time_num

    def update(self, curren_time):

        if curren_time >= self.time_target:

            self.time_target = curren_time + self.time_num

            self.current_image += 1

            if self.current_image == len(self.images):
                self.current_image = 0


    def render(self, window):

        window.blit(self.images[self.current_image], self.rect)

#                                   
# CONSTANS - uppercase

BLACK = (0  ,0  ,0  )
WHITE = (255,255,255)

#                                   
# MAIN

def main():

    pygame.init()

    window = pygame.display.set_mode((800,600))

    pygame.display.set_caption("TEST2")

    move_x, move_y = 0, 0

    clock = pygame.time.Clock()
    curren_time = pygame.time.get_ticks()

    player = Sprite(110,100, curren_time)

    font = pygame.font.SysFont(None, 150)
    pause_text = font.render("PAUSE", 1, WHITE)
    pause_rect = pause_text.get_rect( center = window.get_rect().center ) # center text on screen

    # mainloop

    state_game = True
    state_pause = False

    while state_game:

        curren_time = pygame.time.get_ticks()

        # events

        for event in pygame.event.get():

            if event.type == pygame.QUIT:
                state_game = False

            elif event.type == pygame.KEYDOWN:

                if event.key == pygame.K_ESCAPE:
                    state_game = False

                elif event.key == pygame.K_SPACE:
                    state_pause = not state_pause

                if event.key == pygame.K_LEFT:
                    move_x = -3

                elif event.key == pygame.K_RIGHT:
                    move_x = 3

                elif event.key == pygame.K_UP:
                    move_y = -3

                elif event.key == pygame.K_DOWN:
                    move_y = 3

            elif event.type == pygame.KEYUP:

                if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                    move_x = 0

                elif event.key in (pygame.K_UP, pygame.K_DOWN):
                    move_y = 0

        # moves

        if not state_pause:
            player.rect.x += move_x
            player.rect.y += move_y
            player.update(curren_time)

        # draws

        window.fill(BLACK)

        player.render(window)

        if state_pause:
            window.blit(pause_text, pause_rect)

        pygame.display.flip()

        # FPS

        clock.tick(50)

    # the end

    pygame.quit()

#                                   

if __name__ == '__main__':
    main()

enter image description here

ball1.pngball1.png ball2.pngball2.png ball3.pngball3.png

相关问题 更多 >

    热门问题