python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门

1. pygame入门

(1) 游戏的初始化和退出

init方法pygame.init():初始化pygame所有模块,使用其他模块时必须先调用,游戏时开始调用;
quit方法pygame.quit():卸载pygame所有模块,在游戏结束前调用
游戏代码框架:

import pygame
pygame.init()
# 游戏代码...
pygame.quit()

(2) 游戏界面的创建

坐标计算:Rect类pygame.Rect(x,y,width,height)
python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门_第1张图片

注:以屏幕左上角为原点创造坐标轴来定义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

 给窗口添加图像

  1. 加载图像:图像名=pygame.image.load("图像存储位置")
  2. 绘制在窗口:screen.blit(图像名, (x, y))
  3. 更新显示:pygame.display.update() 注:可以在添加所有以后做统一的更新操作

(3) 游戏循环:保证游戏不会直接退出,变化图像位置,检测用户的交互事件

游戏时钟clock类pygame.time.Clock:设置屏幕绘制速度,刷新屏幕变化图像位置
1) 创建时钟对象
2) 在游戏循环中让时钟对象调用tick(帧率)方法
代码演示:

clock = pygame.time.Clock()
# 游戏循环
while True:
    clock.tick(60)              # 设置屏幕刷新帧率

(4)监听事件pygame.event.get():

可以获取用户当前的事件列表
通过对获取到的事件列表做一个遍历,判断遍历到的事件则对事件做出相应的事件处理

简单实现英雄飞机的飞行以及鼠标点击关闭执行退出事件:

实现英雄飞行代码:

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的对象
python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门_第2张图片
注:通常把显示图像的对象叫做精灵Sprite
image(要显示的图像)和rect(图像显示位置)这两个属性不是精灵类里面就存在的,因此开发时需要派生一个pygame.sprite.Sprite的子类,并在子类初始化方法中设置image和rect属性,通常update方法被重写自定义刷新屏幕更新精灵位置
例:派生精灵子类GameSprite
python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门_第3张图片

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                       # 默认在垂直方向移动

精灵组pygame.sprite.Group:
python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门_第4张图片

案例实战:使用精灵和精灵组创建敌机
将刚刚派生的精灵子类导入,用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)方法

让敌机组调用 update 和 draw 方法

enemy_group.update()                                #默认在所有敌机精灵垂直方向移动
enemy_group.draw(screen)                            #将移动后的敌机精灵绘制到屏幕
pygame.display.update()                             # 更新显示

初始调试游戏界面
python学习笔记1-黑马项目实战飞机大战第一篇---pygame入门_第5张图片

你可能感兴趣的:(python学习)