使用事件命令移动精灵

时间:2015-03-14 05:00:10

标签: python events pygame

我试图将图像作为背景进行blit,然后让精灵在所有方向上移动并旋转。到目前为止,我有以下内容:

import pygame, sys
from pygame.locals import *

BGimageName = 'joker.jpg'
FGimageName = 'bmanicon.tga'

pygame.init()

DisWidth  = 900
DisHeight = 600

x = -500
y = -300

spriteROT = 1.0
SPHpos = (DisWidth//2, DisHeight//2)
DISPLAYSURF = pygame.display.set_mode((DisWidth, DisHeight), 0, 32)
BGimage = pygame.image.load(BGimageName).convert()
FGimage = pygame.image.load(FGimageName).convert_alpha()

def main():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_LEFT:
                    move_x = -1
                elif event.key == K_RIGHT:
                    move_x = +1
                elif event.key == K_UP:
                    move_y = -1
                elif event.key == K_DOWN:
                    move_y = +1
                elif event.key == K_r:
                    rotationDIR = + 1.0
                elif event.key == K_w:
                    rotationDIR = - 1.0
            elif event.type == KEYUP:
                if event.key == K_LEFT:
                    move_x = 0
                elif event.key == K_RIGHT:
                    move_x = 0
                elif event.key == K_UP:
                    move_y = 0
                elif event.key == K_DOWN:
                    move_y = 0
                elif event.key == K_r:
                    rotationDIR = 0
                elif event.key == K_w:
                    rotationDIR = 0

        DISPLAYSURF.blit(BGimage, (x, y))

        RotSPH = pygame.transform.rotate(FGimage, spriteROT)
        w, h = RotSPH.get_size()
        spriteDrawPos = (SPHpos[0] - w // 2, SPHpos[1] - h // 2)
        DISPLAYSURF.blit(RotSPH, spriteDrawPos)

        pygame.display.update()

main()

这对我来说都很新鲜。其中大部分是由我们的教授提供的,然后我们必须弄清楚其余部分并对其进行个性化。不幸的是,我没有在课堂上讨论活动,所以我不太了解它们。我认为我目前所有东西都在工作,因为背景和精灵都会显示,但是当按下任何按钮时,精灵都不会移动。我怎样才能让Python认识到我希望精灵移动?

我试图把FGimage.move_x等等放在事件键中,即

if event.key == K_LEFT:
    FGimage.move_x = -1

但这不起作用,给我错误

Attribute Error: 'pygame.Surface' object has no attribute 'move_x'

我想我已经接近了,但我还是错过了最后一步。

1 个答案:

答案 0 :(得分:1)

你没有移动精灵的原因是因为你没有用事件改变任何变量。

具体而言,位置变量spriteDrawPos没有变化,因为修改它的行spriteDrawPos = (SPHpos[0] - w // 2, SPHpos[1] - h // 2)没有变化,因为SPHpos永远不会改变,因为spriteROT永远不会改变。

要解决此问题,请修改代码以使用您在事件中更改的变量。

spriteROT += rotationDIR
RotSPH = pygame.transform.rotate(FGimage, spriteROT)
w, h = RotSPH.get_size()
spriteDrawPos = (SPHpos[0] - w // 2 + move_x, SPHpos[1] - h // 2 + move_y)
DISPLAYSURF.blit(RotSPH, spriteDrawPos)

这有望让你的精灵移动,但可能太快了。