上一篇(Python游戏之Pygame——太空飞机大战(二))完成了敌机类以及敌机坠毁时释放包裹类,这一篇将给出英雄战机类和处理。由于英雄战机是由游戏者操控的,所以要处理操控事件,比如往那个方向飞,发射子弹或者导弹,或者都发射,遇到敌机太多时还可以发射大boss——核弹,遇到很多子弹时通过变形躲子弹等。看起来很炫酷,下面开始打码。

class HeroPlane(Sprite):def __init__(self, heroType, position, layerGroup, hPlaneGroup):self.groups = layerGroup, hPlaneGroupself.type = heroTypeself._layer = HERO_PLANES[self.type]['LAYER']super().__init__(self.groups)self.image = pygame.image.load(IMAGE_PATH + HERO_PLANES[self.type]['IMAGE']).convert_alpha()self.rect = Rect(position, self.image.get_size())self.xSpeed = HERO_PLANES[self.type]['X_SPD']self.ySpeed = HERO_PLANES[self.type]['Y_SPD']self.speedupFactor = HERO_PLANES[self.type]['SP_FACTOR']self.bulletType = random.choice(list(HERO_BULLETS_TYPE.values()))self.missileType = random.choice(list(HERO_MISSILES_TYPE.values()))self.bShootCount = HERO_PLANES[self.type]['B_COUNT']self.mShootCount = HERO_PLANES[self.type]['M_COUNT']self.nuclearQty = HERO_PLANES[self.type]['QUANTITY']self.defence = HERO_PLANES[self.type]['DEFENCE']# 捡到power子弹包计算数量self.power_bullet_qty = 0def move_left(self):if self.rect.left >= self.xSpeed * self.speedupFactor:self.rect.left -= self.xSpeed * self.speedupFactorelse:self.rect.left = 0def move_right(self):if self.rect.right <= SCREEN_SIZE[0] - self.xSpeed * self.speedupFactor:self.rect.right += self.xSpeed * self.speedupFactorelse:self.rect.right = SCREEN_SIZE[0]def move_up(self):if self.rect.top >= GAME_AREA_START_HEIGHT + self.ySpeed * self.speedupFactor:self.rect.top -= self.ySpeed * self.speedupFactorelse:self.rect.top = GAME_AREA_START_HEIGHTdef move_down(self):if self.rect.bottom <= SCREEN_SIZE[1] - self.ySpeed * self.speedupFactor:self.rect.bottom += self.ySpeed * self.speedupFactorelse:self.rect.bottom = SCREEN_SIZE[1]# 处理键盘事件,分别用 awsd 来控制方向,你懂得,如果你喜欢 方向键自己修改。当然你可以扩展为游戏手柄。def move(self, keyPressed):if keyPressed[K_a]:self.move_left()if keyPressed[K_w]:self.move_up()if keyPressed[K_s]:self.move_down()if keyPressed[K_d]:self.move_right()# 发射子弹,根据配制文件修改数量,请考虑对称性,子弹也不要太多,不然满屏子弹飞def shoot_bullets(self):if self.bShootCount == 2:Bullet(self.bulletType, (self.rect.left + 40, self.rect.top), self.groups[0], heroBulletGroup)Bullet(self.bulletType, (self.rect.right - 40, self.rect.top), self.groups[0], heroBulletGroup)if self.bShootCount == 4:Bullet(self.bulletType, (self.rect.left + 20, self.rect.top), self.groups[0], heroBulletGroup)Bullet(self.bulletType, (self.rect.left + 40, self.rect.top), self.groups[0], heroBulletGroup)Bullet(self.bulletType, (self.rect.right - 20, self.rect.top), self.groups[0], heroBulletGroup)Bullet(self.bulletType, (self.rect.right - 40, self.rect.top), self.groups[0], heroBulletGroup)# 如果有强力子弹,也可以发射def shoot_power_bullets(self):if self.power_bullet_qty > 0:if self.bShootCount == 2:Bullet('P_BULLET', (self.rect.left + 40, self.rect.top), self.groups[0], heroBulletGroup)Bullet('P_BULLET', (self.rect.right - 40, self.rect.top), self.groups[0], heroBulletGroup)self.power_bullet_qty -= 2if self.bShootCount == 4:Bullet('P_BULLET', (self.rect.left + 20, self.rect.top), self.groups[0], heroBulletGroup)Bullet('P_BULLET', (self.rect.left + 40, self.rect.top), self.groups[0], heroBulletGroup)Bullet('P_BULLET', (self.rect.right - 20, self.rect.top), self.groups[0], heroBulletGroup)Bullet('P_BULLET', (self.rect.right - 40, self.rect.top), self.groups[0], heroBulletGroup)self.power_bullet_qty -= 4return Truereturn False# 发射导弹def shoot_missiles(self):if self.mShootCount == 1:Bullet(self.missileType, (self.rect.centerx, self.rect.top), self.groups[0], heroBulletGroup)if self.bShootCount == 2:Bullet(self.missileType, (self.rect.centerx - 15, self.rect.top), self.groups[0], heroBulletGroup)Bullet(self.missileType, (self.rect.centerx + 15, self.rect.top), self.groups[0], heroBulletGroup)# 发射核弹def shoot_nuclear(self):if self.nuclearQty >= 1:Bullet('NUCLEAR', (self.rect.centerx, self.rect.top + 10), self.groups[0], nuclearGroup)self.nuclearQty -= 1return Truereturn False# 捡到敌机丢下的包裹def pickup_package(self, pType):if pType == 'P_BULLET':self.power_bullet_qty += PACKAGES['P_BULLET']['QUANTITY']if pType == 'NUCLEAR':self.nuclearQty += 1if pType == 'DEFENCE':self.defence += PACKAGES['DEFENCE']['QUANTITY']# 躲子弹变形和恢复def transform(self, event):if event.type == KEYDOWN and event.key == K_SPACE:currentCenter = self.rect.centerself.image = pygame.transform.smoothscale(self.image, (40, 80))self.rect.center = currentCenterelif event.type == KEYUP and event.key == K_SPACE:currentCenter = self.rect.centerself.image = pygame.image.load(IMAGE_PATH + HERO_PLANES[self.type]['IMAGE']).convert_alpha()self.rect.center = currentCenter# sounds 为声音数组, 0 用于普通子弹、导弹, 1 用于核弹def shoot(self, keyPressed, sounds):if keyPressed[K_j]:self.shoot_bullets()sounds[0].play()if keyPressed[K_k]:self.shoot_missiles()sounds[0].play()if keyPressed[K_l]:if self.shoot_power_bullets():sounds[0].play()if keyPressed[K_i]:if self.shoot_nuclear():sounds[1].play()# 处理 heroPlane 被子弹击中 或者 被敌机撞击def was_collided(self, group):for sp in group:if pygame.sprite.collide_rect(self, sp):self.defence -= sp.destroyValuesp.kill()if self.defence <= 0:return Truereturn False

好了,英雄战机类和方法、以及处理相关键盘事件( 一共处理了 aswd, ijkl,space 九个键)。如果你想扩展别的功能,堆积木就好了。
仔细的朋友注意到了, HeroPlane类没有update方法,因为位置更新由用户来操作,这里是不需要的。当然你也可以添加update()方法,把特殊需要处理的事情放在这里,将会由战机所在的群的update()自动调用。
到这里,已经完整给出了 子弹类、敌机类、包裹类、英雄战机类的完整处理,有兴趣的朋友已经可以自己动手了,先准备好相关素材,然后编写个play() 来玩了。
哦,忘了,还有星空背景。
由于星空背景不是本人原创,是在原创的基础上进行了改写,以便能融入游戏。这里要感谢原创人。
星空背景使用了两个类: Star 类 和 Space,Space里有很多Star,对吧。

class Star(object):def __init__(self, x, y, speed):self.x = xself.y = yself.speed = speed
class Space:def __init__(self, targetSurf):self.targetSurf = targetSurfself.stars = self.get_stars()def get_stars(self):stars = []for n in range(10):x = randint(0, SCREEN_SIZE[0] - 1)y = randint(0, SCREEN_SIZE[1] - 1) + GAME_AREA_START_HEIGHTspeed = randint(100, 300)stars.append(Star(x, y, speed))return starsdef showspace(self, spaceClock):x = randint(0, SCREEN_SIZE[0])speed = randint(3, 15)star = Star(x, GAME_AREA_START_HEIGHT, speed)self.stars.append(star)time_passed_in_seconds = spaceClock.tick() / 1000.# 新产生的星星由于时间长(time_passed_in_seconds),因此移动速度快很多# 导致产生了很多不同速度的星星,当都朝一个方向运动时,看起来就像星空了。white = (255, 255, 255)for star in self.stars:new_y = star.y + time_passed_in_seconds * star.speed * 30pygame.draw.aaline(self.targetSurf, white, (star.x, new_y), (star.x, new_y + 2))  # 2 星星长度star.y = new_ydef on_targetSurf(star):return star.y < SCREEN_SIZE[1]self.stars = list(filter(on_targetSurf, self.stars))

这里Star是一个点,有兴趣的朋友可以改为Sprite和Group来实现,将Star修改为一个小圆或者不同亮度的星星图片等。但也需要考虑Star太多后占用内存太多。

好了,本文就到这里,下一篇将会给出主函数,将这些东西组合起来玩游戏了。

Python游戏之Pygame——太空飞机大战(三)相关推荐

  1. Python游戏之Pygame——太空飞机大战(四)

    上一篇(Python游戏之Pygame--太空飞机大战(三))完成了英雄战机和星空,那么基本上飞机大战的主要元素都已经完成,该是总结成功玩自己游戏的时候了. 哦,差点忘了,Bullet类对于普通子弹和 ...

  2. Python游戏之Pygame——太空飞机大战(二)

    上一篇(Python游戏之Pygame--太空飞机大战(一))文章简单对游戏进行了说明,给出了部分配置文件以及子弹类.下面给出敌机类和方法. 大家直到,飞机必须能非,最好能非直线飞行.因此必须有X_s ...

  3. Python游戏之Pygame——太空飞机大战(一)

    学习Python,最好的办法是实战,实战!我们知道,有无数的先人和大侠提供了非常多的软件包供我们选用.有时候学习是一件很枯燥的事,玩游戏就不一样了.我们玩的最多的游戏是别人开发的,能不能开发出一款自己 ...

  4. 转载:python中的pygame编写飞机大战(三) 子弹类的实现

    作者:还在琢磨  来源:CSDN  原文:https://blog.csdn.net/mbl114/article/details/78075095  版权声明:本文为博主原创文章,转载请附上博文链接 ...

  5. 转载:python中的pygame编写飞机大战(一)游戏框架搭建

    作者:还在琢磨  来源:CSDN  原文:https://blog.csdn.net/mbl114/article/details/78074742  版权声明:本文为博主原创文章,转载请附上博文链接 ...

  6. pygame实现飞机大战游戏

    标题:pygame实现飞机大战游戏 源码链接:我的github地址 一.具体演示 1.怪兽分为小怪,和大怪:大怪可以发射子弹 2.英雄飞机共有10个生命值 3.英雄飞机可以上下左右移动 4.显示了英雄 ...

  7. 用Unity快速开发太空飞机大战游戏实战经验分享(上)

    用unity动手先来试试一个简单的太空飞机大战吧.看官请继续往下... 最终效果,可控制己方战机,朝目标敌机发射子弹,打飞机~~~!伴随想象,慢慢呈现这个太空飞机大战游戏. 1. 新建打飞机unity ...

  8. C++ 与cocos2d-x-4.0完成太空飞机大战 (二)

    C++ 与cocos2d-x-4.0完成太空飞机大战 (二) 动画演示 飞机精灵编码:AircraftSprite.cpp 飞机精灵编码:AircraftSprite.h 飞机动画编码:Aircraf ...

  9. 体感游戏 | 手势识别玩飞机大战游戏(一) 用pygame实现飞机大战小游戏

    Color Space OpenCV与AI深度学习 后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是: 使用Pygame实现简易飞机大战小游戏 使用Python+OpenCV实现简 ...

最新文章

  1. java 包含汉字,【转载】Java判断字符串中是不是包含汉字
  2. boost::hana::extend用法的测试程序
  3. 16行代码AC_【第十届蓝桥杯省赛c/c++B组真题解析】7.完全二叉树的权值
  4. 最新最全产品删除页代码
  5. python怎么用for循环找出最大值_用for循环语句写一个在输入的十个数字中求最大和最小值的python程序应该怎么写?...
  6. +++程序员高手修炼之路
  7. FastDFS的介绍
  8. No migrations to apply.(django不能创建数据库中的表的问题)makemigrations/migrate
  9. JMeter使用CSV Data参数化,中文参数传递过程出现乱码问题解决
  10. 手动清理Windows系统目录
  11. u盘无法格式化不在计算机中,u盘被写保护无法格式化怎么办 u盘无法格式化原因及解决...
  12. 〖Python 数据库开发实战 - MySQL篇㉕〗- 数据更新操作 - UPDATE 语句
  13. 学习某一门技术的步骤(韩顺平老师提供)
  14. Redis从入门到入坟系列文章(一): keys 命令
  15. 人人都是产品经理总结 第三章1
  16. 属羊的几月出生最好命
  17. 一键生成Springboot Vue项目! 【私活神器】
  18. VRChat与Anthos Capital携手合作,完成8,000万美元的D轮融资
  19. linux shift f11,然后按下CTRL+SHIFT+F11组合键
  20. 编程语言的历史介绍以及高级编程语言的分类

热门文章

  1. alpha测试和beta测试Gamma测试的区别是什么?
  2. 关于memset,malloc以及free后的野指针误区详解
  3. 初识托福TOEFL口语
  4. matlab中删除矩阵中的某些行
  5. 一文看懂推荐系统:物品冷启05:流量调控
  6. 推荐一款latex公式OCR识别软件
  7. CMakeLists.txt 构建 Qt工程
  8. 迅雷超级会员和白金会员怎么买最便宜多少钱一年多少钱一个月
  9. 服务器显示16g内存可用,安装Win7 64位系统需要16G内存,但内存显示只有8G可用,怎么处理?...
  10. 网站是否被墙的辨别及解决方法