接上回继续,这次我们要给游戏加点难度,增加几个随机出现的敌人,玩家碰到敌人后Game Over。

最终效果如下,头上顶个"电风扇"的家伙,就是敌人。

一、先定义敌人类

 1 # 敌人类
 2 class Mob(pg.sprite.Sprite):
 3     def __init__(self, game):
 4         pg.sprite.Sprite.__init__(self)
 5         self.game = game
 6         self.current_frame = 0
 7         self.last_update = 0
 8         self.image_up = self.game.spritesheet.get_image("flyMan_fly.png")
 9         self.image_down = self.game.spritesheet.get_image("flyMan_jump.png")
10         self.image = self.image_up
11         self.rect = self.image.get_rect()
12         self.rect.centerx = random.choice([-100, WIDTH + 100])
13         self.vx = random.randrange(1, 4)
14         if self.rect.centerx > WIDTH:
15             self.vx *= -1
16         self.rect.y = random.randrange(HEIGHT / 2)
17         self.vy = 0
18         self.dy = 0.5
19
20     def update(self):
21         self.rect.x += self.vx
22         self.vy += self.dy
23         # 敌人上下移动
24         if abs(self.vy) > 3:
25             self.dy *= -1
26         center = self.rect.center
27         if self.dy < 0:
28             self.image = self.image_up
29         else:
30             self.image = self.image_down
31         self.rect = self.image.get_rect()
32         self.rect.center = center
33         self.rect.y += self.vy
34         # 超出边界自动清除资源
35         if self.rect.left > WIDTH + 100 or self.rect.right < -100:
36             self.kill()

View Code

代码并不复杂,要注意的地方,已经加了注释,注意下坐标的初始化处理。在[-100,100]的x坐标,[0,HEIGHT/2]的y坐标范围内,随机选1个位置,让敌人出现,然后为了有上下振动的的效果,update中对y轴速度有一个偏移量dy的处理。

二、然后调整main.py

update函数中每隔一定时间,加入敌人

 1     def update(self):
 2         self.all_sprites.update()
 3
 4         # 每隔一定时间,随机加入敌人
 5         now = pg.time.get_ticks()
 6         if now - self.mob_timer > MOB_FREQ + random.choice([-1000, -500, 0, 500, 1000]):
 7             self.mob_timer = now
 8             mob = Mob(self)
 9             # 指定分层
10             self.all_sprites.add(mob, layer=MOB_LAYER)
11             self.mobs.add(mob)
12
13         # 与敌人的碰撞检测
14         mob_hits = pg.sprite.spritecollide(self.player, self.mobs, False)
15         if mob_hits:
16             self.playing = False
17
18        ...
19
20         if self.player.rect.top < HEIGHT / 4:
21             self.player.pos.y += max(abs(self.player.vel.y), 2)
22             # 屏幕滚动时,敌人也要相应的滚动
23             for mob in self.mobs:
24                 mob.rect.top += max(abs(self.player.vel.y), 2)
25                 if mob.rect.top > HEIGHT:
26                     mob.kill()
27            ...

View Code

这里有几个小技巧:

2.1 敌人出现的频度,可以调整MOB_FREQ 这个常量,它在settings.py中定义

# enemy
MOB_FREQ = 8000

表示每8秒左右出现一个敌人,然后为了更具随机性,if条件中还加入了random.choice([-1000, -500, 0, 500, 1000]),所以最终敌人出现的时间间隔,实际是 7.0s、7.5s、8.0s、8.5s、9s 中某一个。

2.2 兔子向上跳,所有档板向下滚动时,敌人也要同步向下滚动,不然画面会不太自然(有兴趣的可以把这一段去掉试试)

2.3 为了防止敌人,被档板、加速器之类的给遮挡住,这里我们使用了pygame中的分层概念。其实就是类似ps中的图层概念,层越高的对象,就越在最上面。即:层"低"的对象,会被层"高"的对象遮挡掉。

为了使用分层,all_sprites必须换成LayeredUpdates,参考以下代码:

 1     def new(self):
 2         self.score = 0
 3         # 这里换成LayeredUpdates为了体现"分层"效果
 4         self.all_sprites = pg.sprite.LayeredUpdates()
 5         self.platforms = pg.sprite.Group()
 6         self.powerups = pg.sprite.Group()
 7         # 敌人的分组
 8         self.mobs = pg.sprite.Group()
 9         self.player = Player(self)
10         # 指定分层
11         self.all_sprites.add(self.player, layer=PLAYER_LAYER)
12         self.mob_timer = 0

View Code

这些分层值,同样可以定义在settings.py中

1 # layer
2 PLAYER_LAYER = 4
3 MOB_LAYER = 3
4 PLATFORM_LAYER = 1
5 POWERUP_LAYER = 2

View Code

细心的朋友可能发现一个问题:兔子与敌人的碰撞检测貌似有点怪,明明还差着一些距离,就认为碰上了。这个问题,下节我们再来讨论改进办法。

源码参考:https://github.com/yjmyzz/kids-can-code/tree/master/part_16

转载于:https://www.cnblogs.com/yjmyzz/p/pygame-kidscancode-part16-enemy.html

pygame-KidsCanCode系列jumpy-part16-enemy敌人相关推荐

  1. 炸掉你的城堡!(pygame獾兔大战)

    代码修改bug,添加注释等,獾的速度加快之后很难-- git地址: https://github.com/Jailman/blowupyrcastle.git 游戏资源使用了文章中附带的下载,原版文章 ...

  2. 使用pygame开发一个弹幕射击游戏(一)

    本文作为开发过程记录用. 目前游戏画面: 下一个添加的功能:敌机可以进行射击. 弹幕类 from pygame.sprite import Sprite from pygame import tran ...

  3. pygame飞机大战

    飞机大战 这是我python的pygame库编的一个小游戏,只要一发子弹不打中两架敌机就没有bug.打开时请使用cmd或dos等终端打开. 以下是源代码: import pygame import r ...

  4. python血条游戏代码_手把手Python和pygame游戏开发教程(二)

    欢迎,来自IP地址为:114.99.15.226 的朋友 前面教程第一部分已经成了小兔子的正确移动和转向,现在需要给它添加更多的动作以进行游戏的进一步开发. 让小兔子可以射箭 你的小兔子可以正确移动后 ...

  5. 用Python和Pygame写游戏-从入门到精通(1)

    From: http://eyehere.net/2011/python-pygame-novice-professional-1/ 博客刚开,打算做一个Pygame的系列,翻译自Will McGug ...

  6. SurvivalShooter学习笔记(八.敌人管理器)

    敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour{public PlayerHealt ...

  7. Python程序设计,pygame飞机大战课程设计

    *飞机大战游戏设计 摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功 ...

  8. Python实验,用pygame做飞机大战游戏设计

    飞机大战游戏设计 摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能 ...

  9. pygame制作游戏全套的

    只需要修改一下招聘的名字和音乐的名字那么这个程序就可以使用了 import sys import pygame from pygame.sprite import Group from pygame. ...

  10. 【Unity】U3D TD游戏制作实例(三)相机管理器、生成敌人优化、敌人血槽小组件

    文章目录 相机管理器 调整相机 敌人类优化 融合导航测试代码 敌人移动速度 销毁对象 加载敌人配置 敌人生成方式优化 血槽组件 相机管理器 调整相机 首先将主相机调整为正交镜头,这样可以防止模型畸变. ...

最新文章

  1. basic与python哪个容易胖_减肥看热量还是碳水化合物 脂肪和碳水哪个更容易长胖...
  2. 【 HDU - 5363】Key Set(水题,快速幂,组合数学)
  3. canvas反向裁剪技巧
  4. Python在视频处理上的优势有哪些
  5. openssl 基本算法小例
  6. 结合使用 Hadoop 和 Couchbase
  7. 分层模型中数据传输过程
  8. atitit. 深入理解Cohesion)原理ad  attilax大总结
  9. linux司机售票员问题
  10. 奇虎360-数据可视化
  11. vue-froala-wysiwyg富文本编辑器
  12. Qt拖拽实现绘制流程图
  13. C#实现简易计算器(Console程序)
  14. Uipath调用Macro(invoke VBA/Execute Macro/invoke VBScript)
  15. 2021-08-27小白笔记3
  16. 【代码审计】51 TP5框架、无框架 变量覆盖反序列化
  17. 电脑内存条的选配与安装详述
  18. 2021年全球超导体收入大约735.7百万美元,预计2028年达到823.7百万美元
  19. 程序员再也不用抢月饼了~
  20. 连续状态转移算法(STA)的实现(python版)

热门文章

  1. wkhtmltopdf乱码解决方案
  2. 浪潮官网服务器型号,浪潮服务器有哪些型号,哪位了解?
  3. 数字经济2.0—趋势、逻辑、选择
  4. 基于随机无迹σ变异的改进HHO算法
  5. OpenCV-Python教程#5-颜色和颜色检测
  6. android浏览器全屏设置分辨率,小屏幕大世界 傲游云浏览器Android全屏模式
  7. 电脑只有飞行模式 不显示任何WiFi信号
  8. 在AD中添加logo
  9. ThinkPHP拼团拼购h5单商户商城[可对接公众号]非常棒的一款h5拼团商城源码
  10. HDU 6304 Chiaki Sequence Revisited(找规律)