使用事件指令移动精灵

2024-10-03 04:30:51 发布

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

我试图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'

我想我很接近了,但我还是错过了最后一步


Tags: keyeventmoveiftypepygame精灵elif
1条回答
网友
1楼 · 发布于 2024-10-03 04:30:51

之所以不移动精灵,是因为没有随事件更改任何变量

具体地说,位置变量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)

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

相关问题 更多 >