IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Python学习第二十一章 飞机大战(项目实战) -> 正文阅读

[游戏开发]Python学习第二十一章 飞机大战(项目实战)

飞机大战(项目实战)

左右移动飞机,子弹可以消灭飞机

目的: 综合复习 面向对象

  1. 需要模块: pygame
    安装(在终端输入)
    sudo pip3 install pygame
    验证安装
    python3 -m pygame.examples.aliens

  2. 需要游戏素材照片

  3. 设计思路
    将静止的图片,放到游戏窗口中取
    通过用户交互,移动图片,产生动画效果

使用pygame创建游戏初始化窗口

pygame.init() 导入初始化 的pygame模块
pygame.quit() 卸载pygame模块

在这里插入图片描述

游戏窗口中的坐标系

在这里插入图片描述
x和y确定矩形的左上角出发点,width和height确定矩形的大小

pygame.React 用于描述矩阵区域

在这里插入图片描述

案例:
定义hero_act 描述英雄的位置和大小

import pygame

pygame.init()

hero_act = pygame.Rect(100, 500, 120, 125)
print("英雄原点 %d %d" % (hero_act.x, hero_act.y))
print("英雄尺寸 %d %d" % (hero_act.width, hero_act.height))
print('%d %d' % (hero_act.width, hero_act.height))
pygame.quit()

pygame 2.0.1 (SDL 2.0.14, Python 3.8.8)
Hello from the pygame community. https://www.pygame.org/contribute.html
英雄原点 100 500
英雄尺寸 120 125
120 125

创建游戏主窗口

pygame.display 用于创建,管理游戏窗口
在这里插入图片描述
在这里插入图片描述
setmodel创建游戏窗口,需要三个参数。
第一个参数:窗口大小
flags 附加选项
depth 颜色的位数,默认自动匹配
在这里插入图片描述

使用pygame绘制图像

第一步 加载图片
第二步 将 图片 blit到指定位置
第三步 调用pygame.display.update()更新屏幕

在这里插入图片描述

import pygame

pygame.init()

screen = pygame.display.set_mode((480, 700))

# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
pygame.display.update()

while True:
    pass
pygame.quit()

绘制英雄飞机图像

import pygame

pygame.init()

screen = pygame.display.set_mode((480, 700))

# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
pygame.display.update()

# 绘制英雄的图像
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (200, 500))
pygame.display.update()

while True:
    pass
pygame.quit()

update的作用

可以在所有绘制完成之后,统一调用update方法

screen 好比一个画布
screen.blit 在画布上 画图
display.update 展示最终画的情况

动起来

游戏动画实现原理: 跟电影类似,将多张图像连续快速播放。
在频幕上 快速绘制多张图像。

帧: 每个静止的画面
对应调用的 update方法
每秒60帧就可以产生连续高品质的动画效果。

在这里插入图片描述

游戏时钟

用于控制游戏内部循环的帧率

  1. 游戏初始化 创建 时钟对象
  2. 时钟对象调用tick(帧率)方法
# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (200, 500))

pygame.display.update()

# 创建时钟对象
clock = pygame.time.Clock()
i = 0
while True:
    # 指定循环体 内部的代码执行的频率
    clock.tick(1)
    print(i)
    i += 1
    pass
pygame.quit()

英雄的简单动画实现

在这里插入图片描述

import pygame

# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 500))

pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()

# 定义rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 500, 102, 126)

i = 0
while True:
    # 指定循环体 内部的代码执行的频率,60表示每秒执行60次
    clock.tick(60)
    # 修改飞机的位置
    hero_rect.y -= 1
    # 调用blit方法
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 调用update方法更新显示
    pygame.display.update()
pygame.quit()

升级版

import pygame

# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 500))

pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()

# 定义rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 500, 102, 126)

i = 0
while True:
    # 指定循环体 内部的代码执行的频率,60表示每秒执行60次
    clock.tick(60)
    # 修改飞机的位置
    hero_rect.y -= 1
    # 判断飞机的位置 hero_rect.bottom是表示图片的底部
    if hero_rect.bottom <= 0:
        hero_rect.y = 700
    # 调用blit方法
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 调用update方法更新显示
    pygame.display.update()
pygame.quit()

监听事件

事件(event): 用户针对游戏的操作
eg: 点击关闭按键,点击鼠标 按下键盘

监听: 判断用户 的具体操作

pygame.event.get() 可以获得用户当前所做动作 的 事件列表

import pygame

# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 500))

pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()

# 定义rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 500, 102, 126)

i = 0
while True:
    # 指定循环体 内部的代码执行的频率,60表示每秒执行60次
    clock.tick(60)

    # 捕获事件
    event_list = pygame.event.get()
    if event_list:
        print(event_list)
    # 修改飞机的位置
    hero_rect.y -= 1
    # 判断飞机的位置 hero_rect.bottom是表示图片的底部
    if hero_rect.bottom <= 0:
        hero_rect.y = 700
    # 调用blit方法
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 调用update方法更新显示
    pygame.display.update()
pygame.quit()

增加 退出事件 的捕获

在这里插入图片描述

import pygame

# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 500))

pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()

# 定义rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 500, 102, 126)

i = 0
while True:
    # 指定循环体 内部的代码执行的频率,60表示每秒执行60次
    clock.tick(60)

    # 捕获事件
    event_list = pygame.event.get()
    for event in event_list:
        # 判断事件类型是否满足退出事件
        if event.type == pygame.QUIT:
            print("游戏退出...")
            # 卸载所有模块 退出
            pygame.quit()
            exit()
    # 修改飞机的位置
    hero_rect.y -= 1
    # 判断飞机的位置 hero_rect.bottom是表示图片的底部
    if hero_rect.bottom <= 0:
        hero_rect.y = 700
    # 调用blit方法
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 调用update方法更新显示
    pygame.display.update()
pygame.quit()

精灵 和 精灵组

精灵: 包含了图像位置 和 显示的对象
在这里插入图片描述
精灵组: 包含多个精灵

在这里插入图片描述
在这里插入图片描述
精灵组 update 一下子更新所有精灵的位置
精灵组 draw 一下子 绘制所有精灵组的图片
精灵组display.update() 将图片展示出来

import pygame


class GameSprite(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""

    def __init__(self, image_name, speed=1):
        # 调用父类初始化方法
        super().__init__()
        # 定义对象的属性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed

    def update(self):
        # 在屏幕的垂直方向上移动
        self.rect.y += self.speed

派生精灵子类

封装三个属性:
图像 位置 和 速度
重写一个方法: 垂直方向的运动

在这里插入图片描述

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

在这里插入图片描述

#!/usr/bin/python3
# coding=utf-8
# Author by Zhenzhou Zhou
import pygame
from plane_sprites import *

pygame.init()

# 游戏初始化
pygame.init()

screen = pygame.display.set_mode((480, 700))

bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (150, 500))

pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()

# 定义rect 记录飞机的初始位置
hero_rect = pygame.Rect(150, 500, 102, 126)

i = 0

# 创建敌机的精灵
enemy = GameSprite("./images/enemy1.png")
enemy1 = GameSprite("./images/enemy1.png", 2)

# 创建敌机的精灵组
enemy_group = pygame.sprite.Group(enemy, enemy1)

while True:
    # 指定循环体 内部的代码执行的频率,60表示每秒执行60次
    clock.tick(60)

    # 捕获事件
    event_list = pygame.event.get()
    for event in event_list:
        # 判断事件类型是否满足退出事件
        if event.type == pygame.QUIT:
            print("游戏退出...")
            # 卸载所有模块 退出
            pygame.quit()
            exit()
    # 修改飞机的位置
    hero_rect.y -= 1
    # 判断飞机的位置 hero_rect.bottom是表示图片的底部
    if hero_rect.bottom <= 0:
        hero_rect.y = 700
    # 调用blit方法
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 调用update方法更新显示
    # 让精灵组调用两个方法
    # update - 让组中的所有精灵更新位置
    enemy_group.update()
    # draw  - 在screen上绘制所有的精灵
    enemy_group.draw(screen)
    pygame.display.update()
pygame.quit()

游戏框架的搭建

两个部分: 游戏初始化 和 游戏循环
在这里插入图片描述
属性:
封装 屏幕 用于 精灵绘制
封装 时间 用于 设置刷新帧率
封装 精灵

方法:
初始化方法 完成 游戏初期制作
startgame 完成 游戏循环

开发两个文件

主游戏类: 负责启动游戏
飞机精灵: 负责提供攻击

在这里插入图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:36:13  更:2021-10-09 16:36:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:42:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码