这也太强了吧!原来这样的飞机游戏才是python基础的精华,网友直呼:好项目

当初想到要用Python的pygame模块开发飞机大战游戏的时候,顿时就兴奋了,毕竟学以致用是最好的学习方式,何况是做一个游戏,但是当我真正上手的时候发现并没有想象中的那么轻松。当然万事开头难,有了一定的经验之后,后面的路就会轻松许多了。

前言

pygame模块安装

开发这个游戏的第一步是安装pygame模块

pygame入门

在完成好pygame模块安装之后,就要正式开始我们的游戏开发了!在这之前,我们先来认识一下Python中的pygame模块,pygame是Python中的一个2D游戏开发库,支持声音和图像的编辑,当然在现在的3D游戏的普及下,pygame逐渐没落了,但是这不妨碍我们从中学到一些东西。pygame程序的大体结构就是下面这个样子,init()函数开始,quit()函数退出,中间就是具体的游戏代码。

import pygame
pygame.init()
# 编写游戏的代码
print("游戏的代码...")
pygame.quit()

使用Rect来描述矩形区域

Python游戏中以坐标系来描述游戏中各个组件的位置,原点在左上角,x轴水平向右、y轴水平向下。描述一个矩形区域还要有宽度和高度,因为一个坐标只能表示其左上角的位置,加上宽度和高度之后位置就定死了。

import pygame
hero_rect = pygame.Rect(100, 500, 120, 125)
print("英雄的原点%d %d" % (hero_rect.x, hero_rect.y))
print("英雄的尺寸%d %d" % (hero_rect.width, hero_rect.height))
print("%d %d" % hero_rect.size)

创建游戏窗口

pygame中专门提供了一个模块pygame.display用于创建、管理游戏窗口。其中有两个方法:

  • pygame.display.set_moudle():用于初始化游戏窗口。里面有四个参数,窗口的宽和高,是否全屏,窗口的颜色。
  • pygame.display.update():用于刷新屏幕内容显示,稍后使用。
import pygame
pygame.init()
# 创建游戏的窗口
pygame.display.set_mode((480, 700))
while True:
    pass
pygame.quit()

游戏窗口宽480,高700,单位是像素,这个设定是我们后面的背景图片一致。while循环是主游戏循环,只要没有命令退出游戏,就要一直执行下去。

绘制图像

游戏窗口创建完成之后,就要来放东西了,不然你就盯着一个黑麻麻的窗口看啥呢!pygame中的load()函数加载图像数据,blit()函数绘制图像,update()函数更新屏幕显示,每绘制一次图像就要调用一次update方法,当然也可以放在最后只调用一次update方法。

import pygame
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
# 1.加载图像数据
bg = pygame.image.load("./images/background.png")
# 2.blit绘制图像
screen.blit(bg, (0, 0))
# 3.update更新屏幕显示
pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (180,500))
pygame.display.update()
while True:
    pass
pygame.quit()

这些弄完之后就是下面这个样子:

在这里插入图片描述

游戏循环

游戏循环意味着游戏的开始,游戏循环的作用是保证游戏不会直接退出,变换图像位置来实现动画效果并检测与用户的交互内容。具体包括设置刷新帧率,检测用户交互,更新图像位置,更新屏幕显示等等。

while True:
	pass

游戏时钟

pygame中专门提供了一个类pygame.time.Clock可以非常方便的设置屏幕绘制速度——刷新帧率。在游戏初始化创建一个时钟对象,并在游戏循环中让时钟对象调用tick()方法,tick()方法会根据上次被调用的时间,自动设置游戏循环中的延时。

......
# 创建时钟对象
clock = pygame.time.Clock()
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
......

监听事件

事件就是游戏启动后,用户针对游戏所做的操作。例如:用户点击鼠标,按动键盘等等。
监听则是判断用户的具体操作,只有捕获用户具体的操作,才能针对性的做出响应。
pygame中通过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))
#  pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
# screen.blit(hero, (180,500))
# 可以在所有绘制工作完成之后统一调用update方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1.定义rect记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 游戏循环->意味着游戏的正式开始
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
    # 监听事件
    event_list = pygame.event.get()
    if len(event_list) > 0:
        print(event_list)
        # 判断飞机的位置
    if hero_rect.y <= 0:
        hero_rect.y = 700
        # 2.修改飞机的位置
    hero_rect.y -= 1
    # 3.调用blit方法绘制图像
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 4.调用update方法更新显示
    pygame.display.update()
pygame.quit()

在这里插入图片描述
MouseMotion就是鼠标移动,KeyDown就是按下键盘,KeyUp就是松开键盘。

精灵和精灵组

这可不是在讲数码宝贝哈!精灵和精灵组是pygame中提供的两个类,是为了简化图像加载、位置变化、绘制图像等功能的开发步骤。
pygame.sprite.Sprite——用于存储图像image和位置rect的对象。
pygame.sprite.Group——包含多个精灵的对象。
精灵类中有两个属性image记录图像数据和rect位置信息,update()方法更新位置信息。
精灵组类add()方法向组中增加精灵;sprites()方法返回所用精灵列表;update()方法让组中的所有精灵调用update方法;draw()将组中所用精灵的image绘制到Surface的rect位置。

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

框架搭建

借用一下黑马的图片。以下就是这个游戏的大体框架:首先是游戏初始化,设置游戏窗口,创建游戏时钟,创建精灵和精灵组。再就是在游戏循环中设置刷新帧率,进行事件监听、碰撞检测、更新绘制精灵组、更新屏幕显示等等。在这里插入图片描述
存储各种精灵的文件:在这里插入图片描述
主程序:


在这里插入图片描述

最后的游戏窗口就是这个样子,感觉我能玩一年。

在这里插入图片描述

这些都是比较简单的操作!我们一起加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值