📜  Pygame – 控制精灵

📅  最后修改于: 2022-05-13 01:55:17.410000             🧑  作者: Mango

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()

输出: