Python 项目飞机大战 - 01 项目准备以及理论知识

2019-03-08  本文已影响0人  flowerflower
😝😝

目录
一、项目准备
1.1 新建项目,导入图片素材
1.2 安装第三方模块
二、使用 pygame 创建图形窗口
2.1 游戏的初始化和退出
2.2 理解游戏中的坐标系
2.3 创建游戏主窗口
2.4 简单的游戏循环
三、理解图像并实现图像绘制
3.1 绘制背景以及英雄飞机图像
3.2 理解update() 方法的作用
四、 理解游戏循环和游戏时钟
4.1 游戏中的动画实现原理
4.2 游戏循环
4.3 游戏时钟
4.4 英雄的简单动画实现
4.5 在游戏循环中监听事件
五、理解精灵和精灵组
5.1 精灵和精灵组
5.2 派生精灵子类
5.3 使用游戏精灵和精灵组创建敌机

秀一张美美的效果图先

效果图.gif

一、项目准备:

1.1 新建项目,导入图片素材

图片.png

1.2 安装第三方模块

sudo pip3 install pygame
图片.png 图片.png
python3 -m pygame.examples.aliens

二、使用 pygame 创建图形窗口

2.1 游戏的初始化和退出

方法 说明
pygame.init() 导入并初始化所有 pygame 模块,使用其他模块之前,必须先调用 init 方法
pygame.quit() 卸载所有 pygame 模块,在游戏结束之前调用!
图片.png

2.2 理解游戏中的坐标系

提示

2.3 创建游戏主窗口

方法 说明
pygame.display.set_mode() 初始化游戏显示窗口
pygame.display.update() 刷新屏幕内容显示,稍后使用

set_mode 方法

set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
# 创建游戏主窗口
screen = pygame.display.set_mode((400, 700))

2.4 简单的游戏循环

# 创建游戏主窗口
screen = pygame.display.set_mode((400, 700))

# 在mac系统下运行会导致卡死
# while True:
#     pass
# 使用这个方式不会导致卡死
while True:
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        pygame.quit()
        exit()

三、理解图像并实现图像绘制

3.1 绘制背景以及英雄飞机图像

 # 2.1.1 加载背景图片
bg = pygame.image.load("./images/background.png")

 # 2.1.2 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")

# 2.2> 绘制在屏幕
screen.blit(bg, (0, 0))
screen.blit(hero,(150,500))

# 2.3> 更新显示
pygame.display.update()

3.2 理解update() 方法的作用

可以在 screen 对象完成 所有 blit 方法之后,统一调用一次 display.update 方法,同样可以在屏幕上 看到最终的绘制结果

现在一起来看下代码以及效果图


图片.png

四、 理解游戏循环和游戏时钟

现在 英雄飞机 已经被绘制到屏幕上了,怎么能够让飞机移动呢

4.1 游戏中的动画实现原理

4.2 游戏循环

图片.png

游戏循环的作用

  1. 保证游戏 不会直接退出
  2. 变化图像位置 —— 动画效果
    • 每隔 1 / 60 秒 移动一下所有图像的位置
    • 调用 pygame.display.update() 更新屏幕显示
  3. 检测用户交互 —— 按键、鼠标等...

4.3 游戏时钟

# 3.1 创建游戏时钟对象
clock = pygame.time.Clock()
i = 0

# 游戏循环
while True:

    # 3.2 设置屏幕刷新帧率
    clock.tick(60)
    print(i)
    i += 1

4.4 英雄的简单动画实现

需求

  1. 游戏初始化 定义一个 pygame.Rect 的变量记录英雄的初始位置
  2. 游戏循环 中每次让 英雄y - 1 —— 向上移动
  3. y <= -120 将英雄移动到屏幕的底部
# 3.1 创建游戏时钟对象
clock = pygame.time.Clock()

# 4.1定义英雄的初始位置
hero_rect = pygame.Rect(150,500,120,126)
while True:

    # 3.2 设置屏幕刷新帧率
    clock.tick(60)
   # 4.2 更新英雄的位置
    hero_rect.y -= 1
    # 4.3 如果移出屏幕,则将英雄的顶部移动到屏幕底部
    if hero_rect.bottom <= 0:
        hero_rect.y = 700
    # 4.4 绘制
    screen.blit(bg,(0,0))
    screen.blit(hero,hero_rect)
    # 4.5 更新显示
    pygame.display.update()

4.5 在游戏循环中监听事件

事件 event

监听

只有 捕获 到用户具体的操作,才能有针对性的做出响应

代码实现

while True:
    event_list = pygame.event.get()
    if len(event_list) > 0 :
        print(event_list)
    event = pygame.event.poll()
    if event.type == pygame.QUIT:
        print("退出游戏")
        pygame.quit()
        exit()

五、理解精灵和精灵组

5.1 精灵和精灵组

精灵

精灵组

Group(*sprites) -> Group

注意:仍然需要调用 pygame.display.update() 才能在屏幕看到最终结果

5.2 派生精灵子类

  1. 新建 plane_sprites.py 文件
  2. 定义 GameSprite 继承自 pygame.sprite.Sprite

注意

图片.png

属性

方法

import pygame
# pygame.sprite.Sprite sprite:模块的名称   Sprite:类的名称
class GameSprite(pygame.sprite.Sprite):
    """游戏精灵基类"""
    def __init__(self,image_name,speed = 1):
         # 调用父类的初始化方法
         super().__init__()
         # 加载图像
         self.image = pygame.image.load(image_name)
         # 记录速度
         self.speed = speed
         # 设置尺寸 可以返回 pygame.Rect(0, 0, 图像宽, 图像高) 的对象
         self.rect = self.image.get_rect()
    def update(self, *args):
         # 默认在垂直方向移动
        self.rect.y += self.speed

5.3 使用游戏精灵和精灵组创建敌机

需求

步骤

  1. 使用 from 导入 plane_sprites 模块
    • from 导入的模块可以 直接使用
    • import 导入的模块需要通过 模块名. 来使用
  2. 游戏初始化 创建 精灵对象精灵组对象
  3. 游戏循环中精灵组 分别调用 update()draw(screen) 方法

职责

实现步骤

from plane_sprites import *
# 创建敌机精灵和精灵组
enemy = GameSprite("./images/enemy1.png")
enemy1 = GameSprite("./images/enemy1.png")
enemy1.rect.x = 200
enemy_group = pygame.sprite.Group(enemy1, enemy2)
# 让敌机组调用 update 和 draw 方法
enemy_group.update()
enemy_group.draw(screen)

# 更新屏幕显示
pygame.display.update()
上一篇 下一篇

猜你喜欢

热点阅读