Pygame – 控制精灵
在本文中,我们将讨论如何控制精灵,如前进、后退、减速或加速,以及精灵应具备的一些属性。我们将在我们的程序中添加事件处理程序来响应击键事件,当玩家使用键盘上的箭头键时,我们将调用我们的纯方法来移动屏幕上的对象。
使用的功能
- moveRight():这个方法接受参数pixels,这意味着一个对象应该在正确的方向移动多少像素。它基本上是将像素添加到对象的当前 x 坐标。
- moveLeft():这个方法接受参数pixels,这意味着一个对象应该向左移动多少像素。它基本上是将像素减去对象的当前 x 坐标。
- moveForward():这个方法接受一个参数速度,这意味着速度会增加多少个因素。它基本上是在物体的 y 方向上以 n 倍的系数增加速度。
- moveBackward():这个方法接受一个参数 speed,这意味着速度会降低多少个因素。它基本上是在物体的 y 方向上以系数 n 降低速度。
让我们首先看看 Sprite 类的实现,它帮助我们在 PyGame 表面上创建一个对象,并添加了 4 个帮助我们向前、向后、向右和向左移动的方法。
示例:精灵类
Python3
import pygame
# GLOBAL VARIABLES
COLOR = (255, 100, 98)
SURFACE_COLOR = (167, 255, 100)
WIDTH = 500
HEIGHT = 500
# Object class
class Sprite(pygame.sprite.Sprite):
def __init__(self, color, height, width):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(SURFACE_COLOR)
self.image.set_colorkey(COLOR)
pygame.draw.rect(self.image,
color,
pygame.Rect(0, 0, width, height))
self.rect = self.image.get_rect()
def moveRight(self, pixels):
self.rect.x += pixels
def moveLeft(self, pixels):
self.rect.x -= pixels
def moveForward(self, speed):
self.rect.y += speed * speed/10
def moveBack(self, speed):
self.rect.y -= speed * speed/10
Python3
import random
import pygame
# Global Variables
COLOR = (255, 100, 98)
SURFACE_COLOR = (167, 255, 100)
WIDTH = 500
HEIGHT = 500
# Object class
class Sprite(pygame.sprite.Sprite):
def __init__(self, color, height, width):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(SURFACE_COLOR)
self.image.set_colorkey(COLOR)
pygame.draw.rect(self.image,
color,
pygame.Rect(0, 0, width, height))
self.rect = self.image.get_rect()
def moveRight(self, pixels):
self.rect.x += pixels
def moveLeft(self, pixels):
self.rect.x -= pixels
def moveForward(self, speed):
self.rect.y += speed * speed/10
def moveBack(self, speed):
self.rect.y -= speed * speed/10
pygame.init()
RED = (255, 0, 0)
size = (WIDTH, HEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Creating Sprite")
all_sprites_list = pygame.sprite.Group()
playerCar = Sprite(RED, 20, 30)
playerCar.rect.x = 200
playerCar.rect.y = 300
all_sprites_list.add(playerCar)
exit = True
clock = pygame.time.Clock()
while exit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_x:
exit = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerCar.moveLeft(10)
if keys[pygame.K_RIGHT]:
playerCar.moveRight(10)
if keys[pygame.K_DOWN]:
playerCar.moveForward(10)
if keys[pygame.K_UP]:
playerCar.moveBack(10)
all_sprites_list.update()
screen.fill(SURFACE_COLOR)
all_sprites_list.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
现在我们将看到我们如何控制主程序循环来处理精灵。循环的第一部分将响应用户使用鼠标或键盘时的交互等事件。稍后,将处理我们对象上的上述事件处理方法。每个事件处理程序都会从 Sprite 类调用相关的方法。
在这段代码中,我们可以控制我们的对象,即我们的对象是按照我们给定方向的对象,如果我们按下右箭头键,它将沿该方向移动,所有箭头键都一样。在这里,我们使用pygame.KEYDOWN方法来初始化使用方向键控制对象的方法,稍后我们要控制相应的方法来触发特定的键来执行特定的动作。
例如,如果我们有一个向右的箭头键,我们必须调用pygame.K_RIGHT方法在对象的方向上向右移动,与pyagme.K_DOWN方法类似,用于在对象的方向上向上移动.
示例:控制精灵
蟒蛇3
import random
import pygame
# Global Variables
COLOR = (255, 100, 98)
SURFACE_COLOR = (167, 255, 100)
WIDTH = 500
HEIGHT = 500
# Object class
class Sprite(pygame.sprite.Sprite):
def __init__(self, color, height, width):
super().__init__()
self.image = pygame.Surface([width, height])
self.image.fill(SURFACE_COLOR)
self.image.set_colorkey(COLOR)
pygame.draw.rect(self.image,
color,
pygame.Rect(0, 0, width, height))
self.rect = self.image.get_rect()
def moveRight(self, pixels):
self.rect.x += pixels
def moveLeft(self, pixels):
self.rect.x -= pixels
def moveForward(self, speed):
self.rect.y += speed * speed/10
def moveBack(self, speed):
self.rect.y -= speed * speed/10
pygame.init()
RED = (255, 0, 0)
size = (WIDTH, HEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Creating Sprite")
all_sprites_list = pygame.sprite.Group()
playerCar = Sprite(RED, 20, 30)
playerCar.rect.x = 200
playerCar.rect.y = 300
all_sprites_list.add(playerCar)
exit = True
clock = pygame.time.Clock()
while exit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_x:
exit = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
playerCar.moveLeft(10)
if keys[pygame.K_RIGHT]:
playerCar.moveRight(10)
if keys[pygame.K_DOWN]:
playerCar.moveForward(10)
if keys[pygame.K_UP]:
playerCar.moveBack(10)
all_sprites_list.update()
screen.fill(SURFACE_COLOR)
all_sprites_list.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
输出: