init方法pygame.init()
:初始化pygame所有模块,使用其他模块时必须先调用,游戏时开始调用;
quit方法pygame.quit()
:卸载pygame所有模块,在游戏结束前调用
游戏代码框架:
import pygame
pygame.init()
# 游戏代码...
pygame.quit()
坐标计算:Rect类pygame.Rect(x,y,width,height)
:
注:以屏幕左上角为原点创造坐标轴来定义x和y
创建游戏主窗口
Display模块pygame.display
:用于创建、管理窗口
方法 | 说明 |
---|---|
pygame.display.set_mode() | 初始化游戏显示窗口 |
pygame.display.update() | 刷新屏幕内容显示,稍后使用 |
注:set_mode(resolution=(0,0), flags=0, depth=0)
• resolution 指定屏幕的 宽 和 高,默认创建的窗口大小和屏幕大小一致
• flags 参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
• depth 参数表示颜色的位数,默认自动匹配
注:set_mode方法返回的是一个游戏界面窗口,但由于程序会马上运行完直接终止,所以返回的界面会马上消失,这时可以添加一个死循环(游戏循环)让游戏界面不要马上消失
代码演示:
Screen(窗口名) = pygame.display.set_mode((480, 700)) # 创建游戏主窗口
while True: # 游戏循环
pass
给窗口添加图像
图像名=pygame.image.load("图像存储位置")
screen.blit(图像名, (x, y))
pygame.display.update()
注:可以在添加所有以后做统一的更新操作游戏时钟clock类pygame.time.Clock
:设置屏幕绘制速度,刷新屏幕变化图像位置
1) 创建时钟对象
2) 在游戏循环中让时钟对象调用tick(帧率)方法
代码演示:
clock = pygame.time.Clock()
# 游戏循环
while True:
clock.tick(60) # 设置屏幕刷新帧率
可以获取用户当前的事件列表
通过对获取到的事件列表做一个遍历,判断遍历到的事件则对事件做出相应的事件处理
实现英雄飞行代码:
hero_rect = pygame.Rect(150, 500, 102, 126) #英雄的初始位置
clock = pygame.time.Clock() #创建游戏时钟对象
# 游戏循环
while True:
clock.tick(60) # 可以指定循环体内部的代码执行的频率
hero_rect.y -= 1 # 更新英雄位置
if hero_rect.y <= 0: # 如果移出屏幕,则将英雄的顶部移动到屏幕底部
hero_rect.y = 700
screen.blit(bg, (0, 0)) # 绘制背景图片(目的是不保留原先位置的英雄图片,清空背景图)
screen.blit(hero, hero_rect) # 绘制英雄图像
pygame.display.update() # 更新显示
实现监听鼠标点击关闭执行退出事件代码:注:几乎所有的 pygame 游戏都 大同小异!
# 事件监听
for event in pygame.event.get():
# 判断用户是否点击了关闭按钮
if event.type == pygame.QUIT:
print("退出游戏...")
pygame.quit()
# 直接退出系统
exit()
(5)理解pygame提供的两个类精灵和精灵组:
精灵pygame.sprite.Sprite(类.模块.方法)
:存储图像数据image和位置rect的对象
注:通常把显示图像的对象叫做精灵Sprite
image(要显示的图像)和rect(图像显示位置)这两个属性不是精灵类里面就存在的,因此开发时需要派生一个pygame.sprite.Sprite的子类,并在子类初始化方法中设置image和rect属性,通常update方法被重写自定义刷新屏幕更新精灵位置
例:派生精灵子类GameSprite
import pygame
class GameSprite(pygame.sprite.Sprite):
"""游戏精灵基类"""
def __init__(self, image_name, speed=1):
super().__init__() # 所有不是继承基类object的类,都应该调用父类的初始化方法
self.image = pygame.image.load(image_name) # 加载图像
self.rect = self.image.get_rect() # 设置尺寸
self.speed = speed # 记录速度
def update(self, *args):
self.rect.y += self.speed # 默认在垂直方向移动
案例实战:使用精灵和精灵组创建敌机
将刚刚派生的精灵子类导入,用from(from plane_sprites import *
)导入可以快速调用模块
在初始化处创建敌机精灵和精灵组:
enemy1 = GameSprite("./images/enemy1.png") #将图像位置传入,加载了敌机1图像
enemy2 = GameSprite("./images/enemy1.png", 2)
enemy2.rect.x = 200 #对敌机2赋初始x位置
enemy_group = pygame.sprite.Group(enemy1, enemy2) #创建精灵组传入敌机1和敌机2
在游戏循环处添加敌机精灵组调用刷新(update)方法和重新显示(draw)方法
enemy_group.update() #默认在所有敌机精灵垂直方向移动
enemy_group.draw(screen) #将移动后的敌机精灵绘制到屏幕
pygame.display.update() # 更新显示