python飞机大战01

python飞机大战01-控制飞机

1 入门

在这个系列中,将制作一个星际争霸游戏。

shmup.py

首先,让将游戏设置修改一下:

WIDTH = 480  # width of our game window
HEIGHT = 600  # height of our game window
FPS = 60  # 60 frames per second

2 玩家精灵

要添加的第一件事是代表玩家的精灵。最终,这将是一艘宇宙飞船。但是当你第一次开始时,忽略图形会更简单,只需对所有精灵使用普通矩形。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50,40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0

为Player选择了50x40像素的大小,将其定位矩形 rect 放在屏幕的底部中心。还定义了一个 speedx 属性,可以跟踪玩家在x方向上移动的速度(从一侧到另一侧)。
对于 update() 方法,这是将在游戏的每一次循环调用的函数,x坐标向右移动speedx个像素:

def update(self):
    self.rect.x += self.speedx

创建精灵,加入精灵组:

all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

3 运动/控制

这是一个键盘控制的游戏,所以希望玩家在按下 Left 或 Right 箭头键时移动精灵。

    def update(self):
        # any code here will happen every time the game loop updates
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -8
        if keystate[pygame.K_RIGHT]:
            self.speedx = 8
        self.rect.x += self.speedx

上面代码会将 speedx 每帧设置为0,然后检查键是否已被按下。在pygame.key.get_pressed() 返
回一个字典keystate,如果某个键被按下,那么字典中该键对应的值是True。

4 边界检查

最后,需要确保精灵不会离开屏幕。将向Player类的 update() 方法添加以下内容:

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

   现在,如果Player试图移动到超过屏幕左边缘或右边缘的位置,它将停止。
   整合到一起,以下是此步骤的完整代码:

# Shmup game - part 1
# shmup.py
# Play sprite and movement
import pygame
import random


WIDTH = 480  # width of our game window
HEIGHT = 600  # height of our game window
FPS = 60  # 60 frames per second


# Colors(R,G,B),define color
BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)


# initialize pygame and create windw
pygame.init()  # 启动pygame并初始化
pygame.mixer.init()  # 声音初始化
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # 游戏屏幕,按照在配置常量中设置的大小创建
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()  # 创建一个时钟以便于确保游戏能以指定的FPS运行


class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH/2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0

    def update(self):
        # any code here will happen every time the game loop updates
        self.speedx = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -8
        if keystate[pygame.K_RIGHT]:
            self.speedx = 8
        self.rect.x += self.speedx
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0


all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)


# Game Loop
running = True


while running:
    # keep loop running at the right speed
    clock.tick(FPS)

    # Process input(events)    # 这是游戏主循环,通过变量running控制,如果需要
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False


    # Update                   # 游戏结束的话直接将running设为False即可
    all_sprites.update()


    # Render(draw)             # 现在还没有确定具体的代码,先用一些基本代码填充,后续再补充
    screen.fill(BLACK)
    all_sprites.draw(screen)
    # *after* drawing everything,flip the display
    pygame.display.flip()



pygame.quit()

项目代码可以查看我的github,网址为
alien-invasion

你可能感兴趣的:(python飞机大战01)