0 pygame模块的导入

  • import pygame导入pygame包
  • 使用pygame.init()导入pygame的所有模块。只有导入模块pygame才能使用。
  • 使用pygame.quit()卸载pygame的所有模块。游戏结束后,释放内存。

1 pygame.Rect :用于描述矩形区域的类

创建矩形对象的命令:变量 = Rect(x,y,width,height)

Rect中的size属性:用于封装对象的宽和高。

Rect的对象储存该对象的坐标元组,因此可以直接使用Rect的对象当坐标作其它方法的形参。

2 游戏设计的思路

我们把程序分成两个部分:游戏的初始化部分和游戏循环

在代码中如下表现:

import pygame

pygame.init()
# 游戏的初始化部分
# 绘制游戏窗口
screen =pygame.display.set_mode((480,700))
# 绘制图像
bg = pygame.image.load("./images/background.png")
hero = pygame.image.load("./images/me1.png")
# 加载图像
screen.blit(bg,(0,0))
screen.blit(hero,(0,0))
# 设置游戏时钟
# 更新图像
pygame.display.update() # 游戏循环 -> 意味着游戏的开始
while True:
pass pygame.quit()

  

3 绘制游戏的主窗口:pygame.display模块

set_mode()方法:创建游戏窗口

set_mode(resolution=(0,0),flag=0,depth=0) ->Surface

  参数详解:

  • resolution即分辨率,调用此方法时不用再写resolution=。直接写分辨率元组。
  • flags参数指定屏幕的附加选项,如屏幕是否全屏等。
  • depth参数表示颜色的位数,默认自动匹配。
  • ->表示返回Surface,暂时理解为返回一个屏幕(或画板),需要使用一个变量接收这个方法。

举个例子:

screen = pygame.display.set_mode((550,550))
#创建一个550x550的黑色屏幕
#程序执行结束后,屏幕即关闭,所以,在代码最下方写一个while死循环让程序不停止可以暂时解决问题

  

4 绘制图像

窗口中你能看见的图像,都是绘制上去的,如游戏背景,游戏角色等等。

绘制图像需要三步:

1.使用pygame.image.load()加载图像的数据

2.使用游戏屏幕对象调用blit方法将图像绘制到指定位置

3.调用pygame.display.update()方法更新屏幕的显示

细节:

  • load()方法,括号中写图像的路径:如:./images/1.png。load()方法需要一个变量来接收,通常命名为图片的名称。如:background = pygame.image.load("./images/1.png") (注:点表示当前文件所在的目录,文件路径要用字符串形式
  • blit()方法,括号中的参数为:图像名(即接收load方法的变量),位置(左上角为0,0,右x正,下y正)
  • update()方法必须有,不然不会显示

5 pygame.time模块及设置游戏时钟

time模块能提供一些关于时间的工具,其中Clock类用来作为游戏的时钟对象。

时钟对象包含很多方法,如后续要使用到的刷新频率(绘制频率)方法tick()。

创建一个时钟对象:

clock = pygame.time.Clock()

  

6 刷新频率方法:tick()

此方法为Clock类下的一个方法,用来设置绘制刷新的频率。

用法如:

clock.tick(60) #60表示60帧/s

  

7 简单的图像移动实现及残影问题解决

使图像移动的思路

  • 新建一个矩形框对象(使用pygame.Rect),使它的初始位置等于代表的图片的初始位置,它的宽高为代表的图片的宽高。
  • 在某种条件下(如每循环一次,如用户按下某个键),使得矩形框的坐标发生变化,而矩形框对象代表的图片按照变化后的坐标绘制图像,即实现了图片的移动。

残影的问题及解决方法

  • 如果仅绘制..飞机不绘制背景图的话,飞机就会留下残影,解决方法是,每次绘制都必须绘制背景,且背景优先绘制(代码写前面)。

简单移动示例

  • 随着while循环的不断执行,让飞机的矩形框对象的座标不断发生改变。
  •  while True:
    clock.tick(60) #60表示60帧/s
    # 主角飞机矩形框移动
    hero_rect.y -= 1 #hero_rect对象为飞机的矩形框对象
    if hero_rect.y <= -126:
    hero_rect.y=700
    # 绘制
    screen.blit(bg,(0,0)) #先画背景!
    screen.blit(hero,hero_rect) #再画飞机。here_rect对象储存矩形框的位置元组
    # 更新显示
    pygame.display.update()

      

8 事件的概念及监听的概念

事件

  • 事件即用户对游戏做的操作,如鼠标点击、按下键盘、关闭游戏等。

监听

  • 监听用来精准判断用户做的事件。只有捕捉到用户做的事件,才能对其作出响应。

监听代码(捕获事件)

  • 可以通过以下代码获得当前用户所做的所有操作的事件列表(用户可以同时做很多事件)
event_list = pygame.event.get()

  使用print方法输出事件列表查看事件

event_list = pygame.event.get()
if len(event_list) > 0:#没有事件时不输出
print(event_list)

  获取一段事件列表如下

[<Event(5-MouseButtonDown {'pos': (391, 607), 'window': None, 'button': 1})>]
[<Event(6-MouseButtonUp {'pos': (391, 607), 'window': None, 'button': 1})>]
[<Event(4-MouseMotion {'rel': (0, 2), 'pos': (391, 609), 'buttons': (0, 0, 0), 'window': None})>]

  

9 处理捕获到的事件(响应)

思路

  • 捕获的是一个事件列表,我们使用for遍历,当遍历到的内容有我们想要的内容时,做出我们想要指定的操作。
  • 如:遍历到Quit事件(点击红叉关闭窗口),我们就要写一个关闭游戏的代码(不写关不了)。

事件类型

示例:Quit事件的处理

  • 使用循环遍历事件列表
  • 当列表中有Quit事件时
  • 执行exit()方法退出程序
  •     for event in event_list:
    if event.type == pygame.QUIT:
    exit() #退出程序

10 精灵及精灵组

传统游戏设计思路的局限性

  • 使用传统的游戏设计思路,需要程序要对每张图像针对很多事件作不同的操作,代码量大,不美观。

精灵及精灵组横空出世

  • pygame下的模块sprite及它的两个类Sprite、Group
  • pygame.sprite.Sprite 精灵类,我们可以把精灵看做角色
  • pygame.sprite.Group  而精灵组就是角色组

 

11 新的游戏思路

planeGame为游戏的入口,它要设置一系列的属性和方法。

12 精灵详解

我们可以把精灵看做角色,而精灵组看作角色组。

使用精灵来统一定义某个角色类如:己方飞机类,敌方飞机类,boss类等。

为了规范,python精灵要专门占据一个python文件

精灵类需要派生子类,也就是说精灵类并不是一个具体的角色类,它派生的子类才是。

示例,派生英雄子类:

思路:

  • 使用init方法传入两个变量,图片地址和初始速度,初始速度默认值为1。
  • 使用load方法加载图像
  • 使用get_rect方法获得图像对象的矩形框,如:self.rect = self.image.get_rect() 其中image为加载后的image变量。
  • 通过update方法调整矩形的位置

13 滚动背景的方法

思路

  • 使用两张背景图,在两张背景向下移动的过程中,当第1张图完全移出屏幕后,立即将第一张图的坐标改为初始位置1。当第二张图完全移出屏幕时,立即将第二张图的坐标位置改为位置1。如此循环即可。

14 添加敌机与定时器set_timer()

定时器

  • set_timer(eventid, milliseconds) -> None

  参数说明:第一个参数eventid通常基于常量pygame.USEREVENT来指定

  • USEREVENT是一个整数,再增加的事件可以使用USEREVENT+ 1来指定,以此类推

定义并监听创建敌机的定时器事件

  • pygame的定时器使用套路非常固定
  • 1.定义定时器变量 eventid
  • 2.在初始化方法中,调用set_timer方法设置定时器事件
  • 3.在游戏循环中,监听定时器事件

15 Rect类bottom属性、

bottom=y + height

当把bottom设置为0时,飞机的y就为负的height,飞机就会从屏幕外一个飞机height的距离飞进来。

16 销毁精灵 kill()方法

即使消除不需要的对象可以释放内存。

kill()方法可以将精灵从所有组中销毁

17 我方飞机(英雄)及

初始化方法

  • 指定英雄图片
  • 初始速度=0
  • 指定英雄初始位置
  • 定义bullets子弹精灵组保存子弹

重写update方法

  • 英雄需要水平移动
  • 保证不能移出屏幕

增加bullets属性,记录所有子弹精灵

增加fire方法,用于发射子弹

18 获取键盘事件方法pygame.key.get_pressed()及英雄移动

此方法返回键盘的元组,每个键盘都有一个值,当键盘没有被触发时,值为0,当键盘被按下时,值为1

       # 方法一:此方法按下键盘只触发一次操作
if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:#KEYDDOWN表示事件类型为按下键盘,K_RIGHT表示右键
print("按下右键")
# 方法二:使用键盘元组来判断是否按键,解决按下只被执行一次的问题
keys_pressed = pygame.key.get_pressed()
# 判断元组中对应的按键索引值是否为1(1为按下)
if keys_pressed[pygame.K_RIGHT]:
print("向右移动..")

 

19 子弹事件

先写一个英雄开火的方法

    def fire(self):
print("发射子弹")#先不用具体写

  

子弹每隔500ms就会从英雄发出,所以需要用到事件,同创造敌机事件类似,首先:创造子弹事件。

创造子弹事件常量:

HERO_FIRE_EVENT = pygame.USEREVENT + 1 #我也不知道为啥具体,总之因为创造敌机事件使用了USEREVENT
所以这里要+1

  

设置定时器-子弹事件

 pygame.time.set_timer(HERO_FIRE_EVENT,500)

  

在监听器中监听事件

            elif event.type == HERO_FIRE_EVENT:
self.hero.fire()#监听到则执行英雄的fire方法

  

20 定义子弹类

因为子弹也是对象,对于物体,要写一个独立的类。

  • 子弹从英雄的正上方向上发射
  • 子弹超出屏幕则销毁

20 绘制子弹

和背景、英雄、敌机一样,要显示在屏幕,就要绘制出来。

创建子弹精灵组

在监听器中监听子弹事件,如果监听到,则在fire方法中新建子弹对象,并加入子弹精灵组。

子弹精灵组update、draw

21 精灵组碰撞销毁方法groupcollide

pygame的精灵模块提供了一个精灵组碰撞方法,非常好用。

groupcollide(group1,group2,dokill1,dokill2,collided = None)-->Sprite_dict

  第一个及第二个参数为:要检测碰撞的两个精灵组,第三个第四个参数时布尔型,True就表示碰撞后代表的精灵组被销毁,第五个我不知道。

碰撞检测方法卸载主程序的__check_collide中

22 精灵与精灵组的碰撞销毁方法spritecollide

精灵与精灵组的碰撞销毁

pygame.sprite.spritecollide(sprite,group,dokill,collided=None)->Sprite_list

  第一个参数为精灵

  第二个参数为精灵组

  当dokill为True时,精灵与精灵组发生碰撞,死掉的是精灵组的成员。当False,谁都不会死

  方法的返回值Sprite_list为精灵组,如果发生碰撞返回精灵组。

  要想精灵死,需要利用这个方法的返回值:

 enemys = pygame.sprite.spritecollide(self.hero,self.enemy_group,False)
#让英雄死
if len(enemys) > 0:
self.hero.kill()

  

  

15 飞机大战:pygame入门、python基础串连的更多相关文章

  1. 1--Python 入门--Python基础数据类型

    一.Python基础语法 初次使用Python,首先要明确三点: Python的标识符(例如变量名.函数名等),可用字母.数字和下划线构成,不能以数字开头,且区分大小写. Python对于缩进敏感.在 ...

  2. pyinstaller相关问题 & pygame文件打包成exe文件 & 武装飞船 & 飞机大战

    自己照书写了一个飞机大战游戏的python程序,想把它打包成一个exe文件,在查阅相关教程并经过数次尝试后终于成功. 安装打包应用 pyinstaller 在cmd命令窗口下pip install p ...

  3. 猜数字和飞机大战(Python零基础入门)

    前言 最近有很多零基础初学者问我,有没有适合零基础学习案例,毕竟零基础入门的知识点是非常的枯燥乏味的,如果没有实现效果展示出来,感觉学习起来特别的累,今天就给大家介绍两个零基础入门的基础案例:猜数字游 ...

  4. Python飞机大战实例有感——pygame如何实现“切歌”以及多曲重奏?

    目录 pygame如何实现"切歌"以及多曲重奏? 一.pygame实现切歌 初始化路径 尝试一 尝试二 尝试三 成功 总结 二.如何在python多线程顺序执行的情况下实现音乐和音 ...

  5. python之基础总结(飞机大战)

    一.学习python有一段时间了,总体上手还是挺好的,但是有些东西还是和Java存在着一定的区别,这里主要是通过学习,然后自己去编写一个案例.从中学习到的一些东西,这里分享出来,如果存在不正确的地方还 ...

  6. 小甲鱼python基础教程飞机大战源码及素材

    百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取. 下载

  7. 小甲鱼零基础入门PYTHON

     000.愉快的开始 00:17:37 ☆  001.我和Python的第一次亲密接触 00:13:26 ★  002.用Python设计第一个游戏 00:24:00 ★  003.小插曲之变量和字符 ...

  8. Python基础入门教程,Python学习路线图

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

  9. Python怎么样入门?Python基础入门教程

    给大家整理的这套python学习路线图,按照此教程一步步的学习来,肯定会对python有更深刻的认识.或许可以喜欢上python这个易学,精简,开源的语言.此套教程,不但有视频教程,还有源码分享,让大 ...

随机推荐

  1. python技巧获取26个英语字母

    import string string.ascii_uppercase # 获取26个大写字母 string.ascii_lowercase # 获取26个小写字母 string.ascii_let ...

  2. C语言--二维数组

    一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 定义变量n表示输入整数个数,count表示每个数出现次数,i.j表示循环变量,k表示次数最多 ...

  3. JAVA基础之访问控制权限

    包:库单元 1.当编写一个Java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元). 2.每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类名称必须 ...

  4. Java字节码增强探秘

    Java字节码增强探秘 https://mp.weixin.qq.com/s/CH9D-E7fxuu462Q2S3t0AA

  5. restful swagger api java go

    rest框架使用swagger api,接口越来越多后性能会很差,如何优化? - 知乎https://www.zhihu.com/question/59349319 golang restful 框架 ...

  6. naxsi-waf-with-ui :dockerfile

    scollazo/naxsi-waf-with-ui Dockerfile - Docker Hubhttps://hub.docker.com/r/scollazo/naxsi-waf-with-u ...

  7. 磁盘I/O高居不下,通过什么来查看占用I/O的进程?

    iotop命令是一个用来监视磁盘I/O使用状况的top类工具.iotop具有与top相似的UI,其中包括PID.用户.I/O.进程等相关信息.Linux下的IO统计工具如iostat,nmon等大多数 ...

  8. SpringBoot启动嵌入式tomcat源码解读

    一.SpringBoot自动拉起Tomcat SpringBoot框架是当前比较流行的java后端开发框架,与maven结合大大简化了开发人员项目搭建的步骤,我们知道SpringBoot的启动类启动后 ...

  9. 深入学习c++--lambda函数

    1. 简单使用 #include <iostream> #include <functional> using namespace std; struct Print { vo ...

  10. Linux记录-SVN+Jenkins+jdk+maven自动化集成部署

    1.svn部署 yum -y install subversion svnserve --version 查看版本 mkdir -p /usr/app/svn svnadmin create /usr ...