使用pygame创建窗口

1.1游戏的初始化和退出
●要使用pygame提供的功能需要先调用init方法
● 游戏结束前调用一下quit方法
方法              说明
pygame.init()          导入并初始化所有pygame模块,使用其他模块之前,必须先调用init方法
pygame.quit()          卸载所有pygame模块,在游戏结束之前调用

1.2理解游戏中的坐标系
● 坐标系
。原点在左上角(0,0)
。x轴水平向右,逐渐增加
。y轴垂直向下,逐渐增加
● 在游戏中,所有课件的元素都是以矩形来描述位置的
●要描述一个矩形有四要素(x,y) (width,height)
pygame专门提供了一个类pygame.Rect用于描述矩形区域
rect(x, y, width, height)
提示
●pygame.Rect 是一个比较特殊的类,内部只是封装了一些数字计算
●不执行pygane, init()方法同样能够直接使用

1.3创建游戏主窗口
●Pygane 专门提供了一个模块pygane,display 用于创建、管理游戏窗口
| 方法 | 说明 |
| pygame.display.set .mode() | 初始化游戏显示窗口 |
| pygame,display,update() | 刷新屏幕内容显示,稍后使用|

set. snode方法
set _ node(resolution=(0,0),flags=0,depth=0) –> SurfaceI
●作用一创建游戏显示窗口
●参数

  • resolution指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
  • flags参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
  • depth 参数表示颜色的位数,默认自动匹配

●返回值

  • 暂时可以理解为游戏的屏幕,游戏的元素都需要被绘制到游戏的屏幕上

  • 注意必须使用变量记录set. node方法的返回结果!因为:后续所有的图像绘制都基于这个返回结果

    #创建游戏主窗口
    screen = pygane,display.set mode((40 700))

1.4简单的游戏循环
●为了做到游戏程序启动后,不会立即退出,通常会在游戏程序中增加个游戏循环
●所请游戏循环就是一个无限循环
●在创建游戏窗口代码下方增加一个无限循环

。注意游戏窗口不需要重复创建

#创建游戏主窗口
screen = pygane,display.set mode((48 700))
#游戏循环
while True:
    pass

02.理解图像并实现图像绘制
●在游戏中,能看到的游戏元素大多都是图像
●图像文件初始是保存在磁盘上的, 如果需要使用,第一歩就需要被加载到内存
●要在屏幕上看到某- -个圏像的内容,需要按照三个歩骤:
1.使用pygame. image. load( ) 加载图像的数据
2.使用游戏屏幕対象,凋用blit方法將圏像绘制到指定位置
3.调用pygane.display. update( ) 方法更新整个屏幕的显示

pygame . image ==> pygame. Surface 
load(file _ path)        blit(图像,位置) ==>pygame.display.updatel)

提示:要想在屏幕上看到绘制的结果,就一定要凋用pygame.display.updatel方法

透明图像
● png格式的图像是支持透明的
●在绘制图像时,透明区域不会显示任何内容
●但是如果下方已经有内容,会透过透明区域显示出来

理解update()方法的作用
可以在screen 对象完成所有blit方法之后,统调用一次display.update方法,同样可以在屏幕上看到最终的绘制结果
●使用display.set _ mode() 创建的screen 对象是个内存中的屏幕数据对象
。可以理解成是油画的画布
●screen.blit 方法可以在画布上绘制很多图像
。例如:英雄、敌机、子弹..
。这些图像有可能会彼此重叠或者覆盖

●display.update() 会将画布的最终结果绘制在屏幕上,这样可以提高屏幕绘制效率,增加游戏的流畅度

案例调整

  #绘制背景图像
  # 1>加载图象         				
  bg=pygane.inage.load("./文件夹名/图片名)
  # 2>给制在屏幕
  screen.blit(bg, (0,0 ))

  #绘制英雄图像
  # 1>加载图像
  hero = pygane. inage.load("./文件夹名/图片名)

  # 2>绘制在屏幕
  screen.blit(hero, (200, 500))
# 3>更新显示- update 方法会把之前所有给制的结果,一次性更新到屏幕窗口上			  pygame. display.update()

03.理解游戏循环和游戏时钟
刷新帧率:可以控制update更新速度

3.1游戏循环

游戏循坏的作用

1.保证游戏不会直接退出
2.变化图像位置—动画效果
·每隔1/60秒移幼一下所有图像的位置
·调用pygame.display.update更新屏幕显示
3.检测用户交互–按键、鼠标等.

3.3游戏吋钟
. pygame 专门提供了一个类pygame.time.Clock 可以非常方便的设置屏幕绘制速度–刷新幀率,要使用吋钟对象需要两步:
1)在游戏初始化创建一个吋钟对象
2)在游戏循环中让时钟对象调用tick(幀率) 方法
· tick 方法会根据上次被调用的吋囘,自动设置游戏循坏中的延吋

3.4简单的动画实现
需求
1.在游戏初始化定义一个pygame.Rect 的变量记录英雄的初始位置
2.在游戏循环中每次让英雄的y- 1–向上移动
3. y <= 0 将位置移动到屏幕的底部
提示:
●每一次调用update()方法之前,需要把所有的游戏图像都重新绘制一遍
●而且应该最先重新绘制背景图像
4.定义英雄的初始位置

  hero _ rect = pygane,Rect(158, 508, 102, 126)
  while True:
  #可以指定循环体内部的代码执行的频率
   clock, tick(60)

3.5在游戏循环中监听事件
事件event
●就是游戏启动后,用户针对游戏所做的操作
●例如:点击关闭按钮,点击鼠标,按下键盘…

监听
●在游戏循环中判断用户具体的操作
只有捕获到用户具体的操作,才能有针对性的做出响应
代码实现
●pygane 中通过pyame.event.get() 可以获得用户当前所做动作的事件列表
。用户可以同一时间做很多事情
提示:这段代码非常的固定,几乎所有的pygane 游戏都大同小异!

   # 捕获事件
    event_list = pygame.event.get()
    if len(event_list) > 0:
        print(event_list)
while True:

    # 每秒刷新的次数(循环体内的频率 )
    clock.tick(30)    
    # 监听事件
    for event in pygame.event.get():

         if event.type == pygame.QUIT:
             print("游戏退出")

            # quit卸载所有模块
             pygame.quit()

            # exit()终结程序
             exit()

04.理解精灵和精灵组
4.1精灵和精灵组
●在完成的案例中,图像加载、位置变化、绘制图像都需要程序员编写代码分别处理
●为了简化开发步骤,pygane 提供了两个类
。pygane.sprite.Sprite –存健图像数据image和位置rect的对象
。pygane.sprite.Group

精灵(需要派生子类)
image记录图像数据
rect记录在屏幕上的位置
update( * args);更新精灵位置
kill( ):从所有组中除

精灵组
_ init _ (self, * 精灵);
add( * sprites):向组中增加精灵
sprites():返回所有精灵列表
update( * args):让组中所有精灵调用update方法
draw(Surface): 将组中所有精灵的inage, 绘制到Surface的rect位置

游戏
             游戏循环
游戏初始化        精灵组,update()
创建精灵组        精灵组.draw(screen)
创建精灵         pygame,display,update()

4.2派生精灵子类
1.新建plane. sprites.py文件
2.定义GameSprite类承自pygane. spriteSprite

注意
·如果一个类的父类不是object
·在重写初始化方法肘,一定要先super()一下父类的 _ init _ 方法, 保征父类中实现的 _ init _ 代码能被正常执行

GameSprite
image
rect
speed
_ init _ (self, image _ name,speed=1):updatelself):

属性
● image精灵图像,使用image _ nane加载
●rect 精灵大小,默认使用图像大小
●speed精昃移劫速度,默认为1
方法
● update毎次更新屏幕吋在游戎循坏内洞用
● i让精灵的self.rect.y += self.seed
提示
●image的get _ rectl 方法,可以返回pygame _ Rec()图像宽,图像高)的对象

4.3使用游戏精灵和精灵组创建敌机
需求
●使用刚刚派生的游戏精灵和精灵组创建敌机并且实现敌机动画步骤
1使用fron导入plane sprited模块
. from导入的模块可以直接使用
●import导入的模块需要通过模块名来使用
2.在游戏初始化创建精灵对象和精灵组对象
3.在游戏循环中让精灵组分别调用update() 和draw(screen) 方法实现
.精灵
。封装图像image,位置rect和速度speed
。提供update()方法,根据游戏需求更新位置rect
●精灵组
。包含多个精灵对象
。update方法,让精灵组中的所有精灵调用update 方法更新位置
。draw(screen)方法在screen上绘制精灵组中的所有精灵

游戏窗口的创建

1.3创建游戏主窗口
●pygame 专门提供了一一个模块pygame.display 用于创建、管理游戏窗口
方法 说明
pygame . display.set _ mode( ) 初始化游戏显示窗口
pygame.display . update() 刷新屏幕内容显示

set_ mode(resolution={0,0}. tlags=0, depth=0) -> Surface

●作用一创建游戏显示窗口
●参数
。 resolution 指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致
。flags 参数指定屏幕的附加选项,例如是否全屏等等,默认不需要传递
。depth 参数表示颜色的位数,默认自动匹配
●返回值
。暂时可以理解为游戏的屏幕,游戏的元素都需要被绘制到游戏的屏幕上
●注意:必须使用变量记录set__mode 方法的返回结果!因为:后续所有的图像绘制都基于这个返回结果

#创建游戏主面口
screen = pygame. display.set mode((480, 700) )

注:游戏循环不需要无限循环

02.理解图像并实现图像绘制
●在游戏中,能够看到的游戏元素大多都是图像
。图像文件切始是保存在磁盘上的,如果需要使用,第一步就需要被加载到内存
●要在屏幕上看到某一个图像的内容,需要按照三个步骤:
1.使用pygame. image. load()加载图像的数据
2.使用游戏屏幕对象,调用blit 方法将图像绘制到指定位置
3.调用( pygame. display. update()方法更新整个屏幕的显示
pygame . image —-> pygame . Surface pygame.display. update
Load(file path) ——> blit(图像, 位置)
提示: 要想在屏幕上看到绘制的结果,就一定要 调用pygame.display. update()方法
绘制背景图像
需求
1.加载 background. png创建背景
2.将背景绘制在屏幕的(0, 0)位置
3.调用屏幕更新显示背景图像

pygame.display. update()