这个练习项目来自《Python基础教程(第2版)》,案例原名为“DIY街机游戏”。


练习项目19:使用python制作游戏(上) - 魔力Pythonwww.opython.com


python plot定义画布大小 python画布尺寸怎么设置_python游戏设计案例实战pdf


原文中做的是一个天上掉秤砣的游戏,玩家需要控制屏幕底部的香蕉左右移动,躲避掉下来的秤砣。

在这篇教程中,我们使用的素材是两个飞机。

也就是说,玩家要控制屏幕底部的飞机,躲避其他从屏幕上方飞来的敌机。


python plot定义画布大小 python画布尺寸怎么设置_python游戏设计案例实战pdf_02


这个练习项目,我们需要使用到pygame模块。

安装命令:py -m pip install pygame –user

安装完成之后,可以运行下方命令进行测试,测试程序是一个带有图像与声音小游戏。

测试命令:py -m pygame.examples.aliens

在完成模块的安装之后,我们就可以开始进行项目练习了。

在这篇教程中,我们的练习目标是完成一个敌机在屏幕中向下移动,并且当敌机从屏幕下方消失时,再次让敌机从顶部随机位置出现。

一、导入模块

  • sys:用于退出游戏程序
  • pygame:用于游戏的功能
  • pygame.locals:游戏中需要用到的一些常量
  • random:用于敌机水平方向随机出现的位置

这里特别说明以下pygame.locals这个模块,它的里面包含所有定义好的常量,例如:FULLSCREEN(全屏)和KEYDOWN(按键按下)。

常量和变量一样,用于保存某些值,区别在于变量的值会发生改变,而常量的值是固定的。

在Python中一般表示常量的名称是全部大写字母的单词。

示例代码:


import sys, pygame, time  # 导入需要的模块
from pygame.locals import *  # 导入所有常量
from random import randrange  # 导入随机范围的方法


二、创建游戏对象

在游戏中的每一个飞机都是一个游戏对象(子图形),要通过素材图片进行创建。

在游戏对象中要包含对图片的处理以及重置和更新的方法。

在这个游戏中,重置方法负责将游戏对象移动回初始位置,更新方法则控制游戏对象的移动方向。

一个游戏对象类的创建,需要继承pygame.sprite模块中的Sprite类。

通过图片创建游戏对象时,需要用载入的图片(Surface对象)调用get_rect()方法,这个方法会返回一个Rect对象(rectangle:矩形,理解为一个默认与图片尺寸相同的不可见矩形。),这个对象包含很多特性,例如:left、top、width和height属性,也就是位置与宽高。


python plot定义画布大小 python画布尺寸怎么设置_重置_03


每个游戏对象的类都要包含image和rect两个特性,image(Surface对象)决定游戏对象显示的内容,rect(Rect对象)决定游戏对象的位置、尺寸。

所以,我们可以通过设置rect对象的特性改变游戏对象的位置。

示例代码:


'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class Enemy(pygame.sprite.Sprite):  # 通过图片创建游戏对象类
    def __init__(self):
        self.image = enemy_image
        pygame.sprite.Sprite.__init__(self)  # 重载超类的构造方法
        self.rect = self.image.get_rect()  # 从图片创建游戏对象的rect特性
        self.reset()  # 游戏对象重置位置

    def reset(self):  # 定义游戏对象重置位置的方法
        self.rect.top = -self.rect.height  # 设置游戏对象y轴初始随机位置
        self.rect.centerx = randrange(screen_size[0])  # 设置游戏对象x轴的随机位置

    def update(self):  # 重写超类中更新游戏对象位置的方法
        self.rect.top += 1  # 每次位置向下移动1像素
        if self.rect.top > screen_size[1]:  # 如果超出屏幕下边界
            self.reset()  # 重置位置


注意:在上方代码中的变量enemy_image和screen_size会在之后的主程序代码中定义。

二、主程序

主程序包含以下功能:

  • 初始化:包括屏幕尺寸、显示模式以及鼠标指针的设定;
  • 载入图像:读取本地的图像文件
  • 游戏对象集:创建游戏对象集将所有游戏对象添加(当前就1个)
  • 屏幕初始化:定义屏幕的颜色,创建屏幕外观并填充颜色后,弹出显示屏幕。
  • 清除游戏对象的方法:对游戏对象经过的区域进行清理;因为游戏运行时是在不停的绘图,要将之前的图擦除,再绘制新图。
  • 循环:监控退出事件以及进行游戏对象的处理

大家可以通过代码中的注释,仔细理解整个实现过程。

示例代码:


# 初始化
pygame.init()
screen_size = 360, 640  # 设置游戏屏幕尺寸
pygame.display.set_mode(screen_size, FULLSCREEN)  # 设置显示模式(FULLSCREEN:全屏)
pygame.mouse.set_visible(0)  # 隐藏鼠标指针

# 载入游戏对象的图像
enemy_image = pygame.image.load('enemy.png').convert_alpha()  # 载入图片

# 创建游戏对象集并添加游戏对象
sprites = pygame.sprite.RenderUpdates()  # 创建游戏对象集
sprites.add(Enemy())  # 添加游戏对象

# 设置屏幕外观
bgcolor = (255, 255, 255)  # 游戏屏幕背景颜色
screen = pygame.display.get_surface()  # 创建屏幕外观
screen.fill(bgcolor)  # 屏幕填充背景颜色
pygame.display.flip()  # 弹出屏幕


# 清除游戏对象
def clear_callback(surf, rect):  # 定义清除游戏对象的方法
    surf.fill(bgcolor, rect)  # 屏幕外观中的游戏对象区域填充背景颜色


# 监控退出事件
while True:
    for event in pygame.event.get():  # 获取事件
        if event.type == QUIT:  # 如果事件类型是退出
            sys.exit()  # 退出程序
        if event.type == KEYDOWN and event.key == K_ESCAPE:  # 如果事件类型为按键并且按键为ESC
            sys.exit()  # 退出程序
    # 实现游戏对象的不停移动
    pygame.time.Clock().tick(100)  # 设置每秒帧数
    sprites.clear(screen, clear_callback)  # 清除游戏对象经过的区域
    sprites.update()  # 更新所有游戏对象
    updates = sprites.draw(screen)  # 屏幕中绘制所有游戏对象
    pygame.display.update(updates)  # 更新所有游戏对象的显示


完成以上代码之后,我们运行程序,就能够看到一个由上至下移动的敌机。