专栏首页Crossin的编程教室【Pygame 第11课】 GAME OVER

【Pygame 第11课】 GAME OVER

昨天得知《MacTalk·人生元编程》在多看书城上线之后,一咬牙,花了2.99元入手了。本书是微信公众账号“MacTalk”中的文章经重新审阅、校订、整理、排版后的合集。不管你是一个mac用户、一个程序员、还是一个对技术感兴趣的人,这本书都是物超所值的。

继续我们的打飞机游戏。完成了子弹和敌机之间的碰撞检测之后,自然还要来处理敌机与本体之间的碰撞检测,这决定了游戏是否结束。

之前我们没有把plane作为一个对象来处理,现在为了能更方便地做碰撞检测,我们还是要把它封装一下。这和我们之前对bullet和enemy所做的操作类似。

class Plane:

def restart(self):

self.x = 200

self.y = 600

def __init__(self):

self.restart()

self.image = pygame.image.load('plane.png').convert_alpha()

def move(self):

x, y = pygame.mouse.get_pos()

x-= self.image.get_width() / 2

y-= self.image.get_height() / 2

self.x = x

self.y = y

plane = Plane()

在move方法中,依旧根据鼠标的位置改变飞机的位置。

然后我们增加一个checkCrash的函数,和checkHit类似,它用来处理敌机和本体之间的碰撞。

def checkCrash(enemy, plane):

if (plane.x + 0.7*plane.image.get_width() > enemy.x) and (plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and (plane.y + 0.7*plane.image.get_height() > enemy.y) and (plane.y + 0.3*plane.image.get_width() < enemy.y + enemy.image.get_height()):

return True

return False

这里的判断比之前要复杂一些,因为敌机和本体都有一定的面积,不能像子弹一样忽略长宽。但如果两张图片一旦有重合就算是碰撞,会让游戏看上去有些奇怪:有时候你觉得并没有撞上,而实际已经有了重合,游戏就失败了。所以为了避免这一现象,我们要给plane的长宽打上一点折扣。这也就是代码中判断条件里“0.3”“0.7”的意义所在。

checkCrash把碰撞检测的结果用True或False返回。在游戏主循环里,我们增加一个记录游戏是否结束的变量gameover。把之前的游戏逻辑放在gameover为False的情况下。而当checkCrash为True时,就把gameover设为True。

gameover = False

while True:

###

if not gameover:

###省略部分游戏逻辑

for e in enemies:

#如果撞上敌机,设gameover为True

if checkCrash(e, plane):

gameover = True

e.move()

screen.blit(e.image, (e.x, e.y))

#检测本体的运动

plane.move()

screen.blit(plane.image, (plane.x, plane.y))

else:

#待处理

pass

运行代码,当你不幸被敌机撞上后,游戏陷入一片空白。然后,你只好关闭程序。下一课,我们来处理被撞后的善后工作。

随着我们功能的不断增加,代码量已经越来越多,在微信上不太好显示。需要代码源文件的,可以去论坛crossin.me上下载。

面向零基础初学者的编程课

每天5分钟,轻松学编程

回复『 p 』查看python课程

回复『 g 』查看pygame课程

回复『 t 』查看习题

本文分享自微信公众号 - Crossin的编程教室(crossincode)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2013-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【每周一坑】蜥蜴流感与贝叶斯定理

    春季是流感的高发季节。不要觉得只是小小的“感冒”,严重起来甚至也会危及生命,而且还没有特效药。因此,身体不适请及时到医院检查。

    Crossin先生
  • Python情感分析:鹿晗的粉丝们究竟原谅他了吗?

    国庆长假的最后一天,鹿晗在微博上公开宣布和关晓彤的恋情。消息来得太突然,不仅粉丝圈里炸了,顺带连微博服务器也给炸了。在此心疼新浪运维工程师一秒,放个假都不能省心...

    Crossin先生
  • #PY小贴士# 函数的默认参数不会每次都新建?

    这里的原因在于,函数的参数默认值,是在一开始定义(也就是 def)的时候所决定的,并不是到执行时才创建。我换一个例子,就看得更明白了:

    Crossin先生
  • Pandas雅虎金融数据获取与分析

    利用Pandas模块直接获取雅虎财经数据,方便之极。注意把官方提示把from pandas.io import data, wb替换为from pandas_d...

    用户2183996
  • Creating a Filter, Edge Detection

    Below, you've been given one common type of edge detection filter: a Sobel opera...

    小飞侠xp
  • python3.基础爬取网易云音乐【超详细版】

    简单学习了python爬虫之后,我们就可以嘿咻嘿咻了...因为平时就是用网易云听的歌,也喜欢看歌里的评论,所以就爬网易云音乐评论吧!

    一墨编程学习
  • Kotlin 1.3 即将带来什么

    一个会写诗的程序员
  • 想尝试 Linux? 教你如何在虚拟机中安装 Linux

    可能许多小伙伴都对 Linux 有一定的兴趣,但是又不想在实体机上安装,所以想在虚拟机上安装试试水。这篇文章则会教你如何在虚拟机上安装自己 Linux 系统(以...

    村雨遥
  • 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

    第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键-》点击插入ACTIVAE控件-》选择MicrosoftCommunication...

    徐飞机
  • 互联网黑话指南

    grain先森

扫码关注云+社区

领取腾讯云代金券