利用 Pygame 控制精灵持续移动

80 阅读2分钟

在 Pygame 中,我们需要使特定精灵在用户按下某个键时连续移动。但是,当前存在一个问题:精灵在按下指定键后仅移动一次,然后停止。

2. 解决方案

为了解决上述问题,我们需要在 Pygame 中使用事件处理来监听键盘输入。当用户按下某个键时,我们需要更新精灵的位置,使其持续移动。

代码示例

import pygame
import sys
import os
import random
import time
from pygame.locals import *

pygame.init()

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

screenw = 800
screenh = 600

screen = pygame.display.set_mode( ( screenw, screenh ) )

pygame.display.set_caption( "Game" )

clock = pygame.time.Clock()

class Car(pygame.sprite.Sprite):

    def __init__( self, color = black, width = 100, height = 100 ):

        pygame.sprite.Sprite.__init__( self )

        self.image = pygame.Surface( ( width, height ) )

        self.image.fill( color )

        self.rect = self.image.get_rect()

    def set_pos(self, x, y):
        self.rect.x = x
        self.rect.y = y

    def set_img( self, filename = None):
        if filename != None:

            self.image = pygame.image.load( filename )

            self.rect = self.image.get_rect()

def main():

    x_change = 0
    y_change = 0

    x = 0
    y = 0

    car_group = pygame.sprite.Group()

    player = Car()

    player.set_img( "images.jpg" )

    car_group.add( player )

    exit = False

    FPS = 60

    while not exit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:

                if event.key == pygame.K_LEFT:
                    x_change = -10

                elif event.key == pygame.K_RIGHT:
                    x_change = 10

                elif event.key == pygame.K_UP:
                    y_change = -10

                elif event.key == pygame.K_DOWN:
                    y_change = 10

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.type == pygame.K_DOWN:
                    x_change = 0
                    y_change = 0

            x += x_change
            y += y_change


        screen.fill( white )
        player.set_pos( x, y )
        car_group.draw( screen )
        clock.tick( FPS )
        pygame.display.update()

main()
pygame.quit()
quit()

关键代码说明:

# 不断监听键盘输入
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:

        if event.key == pygame.K_LEFT:
            x_change = -10

        elif event.key == pygame.K_RIGHT:
            x_change = 10

        elif event.key == pygame.K_UP:
            y_change = -10

        elif event.key == pygame.K_DOWN:
            y_change = 10

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.type == pygame.K_DOWN:
            x_change = 0
            y_change = 0

这段代码用于监听键盘输入。当用户按下某个键时,将更新 x_changey_change 变量,以控制精灵的移动方向和速度。当用户松开某个键时,将将 x_changey_change 变量重置为 0,以使精灵停止移动。

# 更新精灵位置
x += x_change
y += y_change

这段代码用于更新精灵的位置。每当 x_changey_change 发生变化时,精灵的位置都会相应更新。

# 将精灵绘制到屏幕上
screen.fill( white )
player.set_pos( x, y )
car_group.draw( screen )

这段代码用于将精灵绘制到屏幕上。首先,将屏幕填充为白色。然后,将精灵的位置更新为 xy 坐标。最后,将精灵绘制到屏幕上。

# 更新游戏画面
clock.tick( FPS )
pygame.display.update()

这段代码用于更新游戏画面。首先,将游戏时钟更新为 FPS(每秒帧数)。然后,调用 pygame.display.update() 更新显示屏。