飞机大战
pygame的初始化和退出
在使用pygame提供的所有功能之前,需要调用init
方法,在游戏结束之前,需要调用一下quit
方法。
方法 | 说明 |
---|---|
pygame.init() | 导入并初始化所有pygame模块,在使用其他模块之前,必须先调用init方法 |
pygame.quit() | 卸载所有pygame模块,在游戏结束前调用 |
pygame中的坐标系,坐标原点在左上角,x轴水平向右,y轴垂直向下。
在游戏中所有可见元素都是以矩形区域来描述位置的:
(x, y)(width, height)
Rect类
pygame中专门提供了一个子类pygame.Rect
用于描述矩形区域。
Rect(x, y, width, height) -->Rect
pygame.Rect
是一个比较特殊的类,不执行pygame.init()
方法也能使用。
访问size
属性时会返回一个元组,元组的第一个值是矩形的宽度,第二个值是高度
创建主窗口:pygame.display
pygame专门提供了一个模块pygame.display
用于创建、管理游戏窗口。
方法 | 说明 |
---|---|
pygame.display.set_mode() | 初始化游戏窗口 |
pygame.display.update() | 刷新屏幕显示,稍后使用 |
set_mode方法
set_mode
方法用于创建游戏窗口
set_mode(resolution=(0,0),flags=0,depth=0) -->Surface
resolution
指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
flags
参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
depth
参数模式颜色位数,默认自动匹配
返回值:暂时可以理解为游戏屏幕,游戏元素都需要被绘制在游戏屏幕上
必须使用变量记录set_mode
方法的返回结果,因为后续所有图像的绘制都基于这个返回结果
screen = pygame.display.set_mode(400, 700)
实现图像的绘制
1、使用image
模块中的load
方法pygame.image.load()
加载图像数据
2、使用游戏屏幕对象,调用blit
方法将图像绘制到指定位置
3、调用pygame.display.update
方法更新整个屏幕的显示
游戏的动画实现本质上是快速的在屏幕上绘制图像并刷新,一般每秒60次即可达到高品质动画效果,每次绘制的结果被称帧。
游戏循环
游戏循环象征着游戏的正式开始。
游戏时钟
pygame中专门提供了一个pygame.time.Clock
类可以非常方便的设置刷新帧率。
1、在游戏初始化的时候创建一个时钟对象
2、在游戏循环内部让时钟调用tick(帧率)
方法
tick方法会根据上次被调用的时间,自动设置游戏循环中的延时,可以指定循环体内部代码执行的频率。
英雄移动动画的实现:
1、在游戏初始化中定义一个pygame.Rect
的变量记录英雄的位置
2、在循环中每次让英雄的y - 1
实现向上移动
3、y <= 0
时,让英雄移动到屏幕底部
每次调用update()方法之前,都需要把所有图像重新绘制一遍,而且应该最先绘制背景图像。
在循环中监听事件
pygame中通过pygame.event.get()
可以获得用户当前所做动作的事件列表
监听游戏退出事件:
clock = pygame.time.Clock()
while True:
clock.tick(60)
for even in pygame.event.get():
if event.type == pygame.QUIT:
print("退出游戏")
pygame.quit()
exit()
pygame.quit() 可以卸载所有pygame模块
exit()
内置函数可以吧当前正在执行的程序直接退出
break
可以退出当前的循环,如果上面的程序用break
,只会退出for
循环,不会退出while True
循环。
精灵、精灵组
pygame中提供的高级类—精灵、精灵组
pygame.sprite.Sprite
—存储图像数据image和位置rect的对象
pygame.sprite.Group
—包含了多个精灵的对象
精灵包含连个对象,两个方法
因为每个精灵的移动方式不同,所以需要使用派生类,来重写update
方法。
精灵组调用一次update
方法,精灵组中的精灵就会各自调用自己的update
方法。
精灵组调用一次draw
方法,精灵组中所有精灵的image
都会绘制到屏幕上的rect
位置。
因为如果没处理一张图片都需要加载、绘制、更新、那么代码就非常繁琐,所以可以将每张图片作为精灵类的一个派生类来加载和更新位置,然后将每个精灵都添加到精灵组中,在精灵组中统一进行绘制和更新,使代码更简洁。
派生精灵子类
1、新建一个plane_sprites.py文件
2、定义GameSprite
类继承自pygame.sprite.Sprite
精灵类
注意:如果一个类的父类不是object
,在重写初始化方法时,一定要先super()
一下父类的__init__
方法,保证父类中实现的__init__
代码能够被正常执行,因为如果不调用一下父类方法,就会只执行子类的__init__
方法,相当于被覆盖了。
属性:
image
精灵图像,使用image_name加载
rect
精灵大小,默认使用图像大小
speed
精灵移动速度,默认为1
方法
update每次更新屏幕时在游戏循环内调用
self.rect.y += self.speed
提示
image
的get_rect()
方法,可以返回pygame.Rect(0, 0 图像宽, 图像高)
的对象
创建派生精灵类示例:
在新建的plane_sprites.py中编写如下代码:
# *-*coding:utf-8*-*
import pygame
pygame.init()
class GameSprite(pygame.sprite.Sprite):
"""游戏精灵子类"""
def __init__(self, image_name, speed=1):
# 调用父类初始化方法
super().__init__()
self.image = pygame.image.load(image_name)
self.speed = speed
self.rect = self.image.get_rect()
def update(self):
self.rect.y -= self.speed
这样在主程序中就可以通过派生精灵类来创建敌机对象。
在游戏循环上方添加:
enemy = GameSprite("c\images\zed.png")
enemy1 = GameSprite("c\images\zed1.png", 2)
enemy_Group = pygame.sprite.Group(enemy, enemy2)
在游戏循环内部调用精灵组的方法
enemy_group.update()
enemy_group.draw(screen)
screen是用set_mod方法创建的屏幕对象。
这样就大大简化了代码的开发。
以上是《飞机大战》游戏开发需要知道的热身内容。