设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 32515|回复: 19
打印 上一主题 下一主题

【Pygame 第11课】 GAME OVER

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2013-9-5 19:18:19 |只看该作者 |倒序浏览
继续我们的打飞机游戏。完成了子弹和敌机之间的碰撞检测之后,自然还要来处理敌机与本体之间的碰撞检测,这决定了游戏是否结束。

之前我们没有把plane作为一个对象来处理,现在为了能更方便地做碰撞检测,我们还是要把它封装一下。这和我们之前对bullet和enemy所做的操作类似。
  1. class Plane:
  2.     def restart(self):
  3.         self.x = 200
  4.         self.y = 600
  5.         
  6.     def __init__(self):
  7.         self.restart()
  8.         self.image = pygame.image.load('plane.png').convert_alpha()

  9.     def move(self):
  10.         x, y = pygame.mouse.get_pos()
  11.         x-= self.image.get_width() / 2
  12.         y-= self.image.get_height() / 2
  13.         self.x = x
  14.         self.y = y

  15. plane = Plane()
复制代码
在move方法中,依旧根据鼠标的位置改变飞机的位置。

然后我们增加一个checkCrash的函数,和checkHit类似,它用来处理敌机和本体之间的碰撞。
  1. def checkCrash(enemy, plane):
  2.     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_height() < enemy.y + enemy.image.get_height()):
  3.         return True
  4.     return False
复制代码
这里的判断比之前要复杂一些,因为敌机和本体都有一定的面积,不能像子弹一样忽略长宽。但如果两张图片一旦有重合就算是碰撞,会让游戏看上去有些奇怪:有时候你觉得并没有撞上,而实际已经有了重合,游戏就失败了。所以为了避免这一现象,我们要给plane的长宽打上一点折扣。这也就是代码中判断条件里“0.3”“0.7”的意义所在。

checkCrash把碰撞检测的结果用True或False返回。在游戏主循环里,我们增加一个记录游戏是否结束的变量gameover。把之前的游戏逻辑放在gameover为False的情况下。而当checkCrash为True时,就把gameover设为True。
  1. gameover = False
  2. while True:
  3.     ###
  4.     if not gameover:
  5.         ###省略部分游戏逻辑
  6.         for e in enemies:
  7.             #如果撞上敌机,设gameover为True
  8.             if checkCrash(e, plane):
  9.                 gameover = True
  10.             e.move()
  11.             screen.blit(e.image, (e.x, e.y))
  12.         #检测本体的运动
  13.         plane.move()
  14.         screen.blit(plane.image, (plane.x, plane.y))
  15.     else:
  16.         #待处理
  17.         pass
复制代码
运行代码,当你不幸被敌机撞上后,游戏陷入一片空白。然后,你只好关闭程序。下一课,我们来处理被撞后的善后工作。

#==== Crossin的编程教室 ====#
微信ID:crossincode
论坛:http://crossin.me
QQ群:156630350

面向零基础初学者的编程课
每天5分钟,轻松学编程



11.py

3.38 KB, 下载次数: 612

源码

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

0

好友

161

积分

注册会员

Rank: 2

沙发
发表于 2013-9-6 11:19:10 |只看该作者

回帖奖励 +2

编完了,期待明天的
回复

使用道具 举报

0

主题

0

好友

7

积分

新手上路

Rank: 1

板凳
发表于 2013-9-6 22:53:02 |只看该作者

回帖奖励 +2

完了~
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

地板
发表于 2013-9-7 20:29:29 |只看该作者

回帖奖励 +2

看全文
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

5#
发表于 2013-9-7 20:59:14 |只看该作者
def checkCrash(enemy, plane):里最后一个width是不是需要改成height?虽然width也不影响整个的运行。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2013-9-8 00:33:44 |只看该作者
bobowo 发表于 2013-9-7 20:59
def checkCrash(enemy, plane):里最后一个width是不是需要改成height?虽然width也不影响整个的运行。 ...

笔误了,谢指出。已改
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

78

积分

注册会员

Rank: 2

7#
发表于 2014-1-12 11:40:32 |只看该作者
本帖最后由 nemo 于 2014-1-12 11:53 编辑
crossin先生 发表于 2013-9-8 00:33
笔误了,谢指出。已改


我想问下先生让所有的敌机都重启或者减速该怎么写,能提示一下大概思路吗。我创建了一个宝物,但是暂时只能多加点分,不知道怎么和敌机产生联系。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2014-1-12 16:39:08 |只看该作者
nemo 发表于 2014-1-12 11:40
我想问下先生让所有的敌机都重启或者减速该怎么写,能提示一下大概思路吗。我创建了一个宝物,但是暂时只 ...

需要有一个list来记录场上所有的敌机
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

558

积分

高级会员

Rank: 4

9#
发表于 2014-9-20 23:13:35 |只看该作者
就快编完了,越来越激动呢!
学习,纯粹。
回复

使用道具 举报

0

主题

1

好友

273

积分

中级会员

Rank: 3Rank: 3

10#
发表于 2016-2-20 14:47:43 |只看该作者
继续学习~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-23 10:19 , Processed in 0.016986 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部