学习 Python 之 Pygame 开发魂斗罗(十)
在上次的博客学习 Python 之 Pygame 开发魂斗罗(九)中,我们让敌人能发射子弹,能移动,这次我们给敌人加上可以被消灭
下面是图片的素材
链接:https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwd=hdly
提取码:hdly
不知道为什么,我这次运行代码,发现敌人一直不开火,如果你也遇到了,来看看如何解决吧

当我们运行游戏后,出现了敌人不开火的问题,我们进入敌人1类的fire()函数

加入一行代码,看看是否能进入开火的条件

运行游戏后发现,这个变量一直是True,所以无法进入下面的if语句

我们看看,哪里修改了这个变量

我们找到,修改变量值的地方在主类的updateEnemyPosition()函数中
当敌人进行垂直碰撞检测时,如果敌人脚下没有碰撞体,那么就判定敌人是下落状态,于是敌人的isFalling变量为True了,但是如果敌人脚下有碰撞体,我们应该把isFalling变成True,不然敌人就一直处于下落状态,那么就永远不会开火了
所以,我们加入下方的代码,这样问题就解决了

我们要想一想,为什么敌人会处于下落状态,敌人出来后并没有到达悬崖边,那么是如何处于下落状态的呢?
原来是我们产生敌人的位置距离下方的碰撞体有几个像素,当敌人产生后,下方距离碰撞体有点距离,所以就变了下落状态,又因为陆地碰撞体敌人碰到后不会死亡,所以敌人就会出现不会开火的情况
这个问题解决后,下面我们来写子弹击中敌人
敌人死亡时,会有爆炸特效,所以我们要先创建爆炸效果类,然后才能写敌人死亡的逻辑
首先,在Constants.py中加入爆炸效果的类型,在魂斗罗中,第一关桥也会爆炸,BOSS死亡后也会爆炸,敌人死亡也会爆炸,但是他们的爆炸特效不一样,所以我们要加入一个枚举类,用来枚举出各种爆炸效果
class ExplodeVariety(Enum):
CIRCLE = 1
BRIDGE = 2

这里说明了两种爆炸效果,一种是敌人死亡的圆圈爆炸,还有一种是桥的爆炸
下面这个是桥爆炸的特效

下面是敌人死亡的特效

接下来就可以创建爆炸效果类了
class Explode:
def __init__(self, object, variety = ExplodeVariety.CIRCLE, isUseTime = False):
# 获取爆炸对象的位置
self.rect = object.rect
if variety == ExplodeVariety.CIRCLE:
self.images = [
loadImage('../Image/Explode/circleExplode1.png'),
loadImage('../Image/Explode/circleExplode1.png'),
loadImage('../Image/Explode/circleExplode1.png'),
loadImage('../Image/Explode/circleExplode1.png'),
loadImage('../Image/Explode/circleExplode2.png'),
loadImage('../Image/Explode/circleExplode2.png'),
loadImage('../Image/Explode/circleExplode2.png'),
loadImage('../Image/Explode/circleExplode2.png'),
loadImage('../Image/Explode/circleExplode3.png'),
loadImage('../Image/Explode/circleExplode3.png'),
loadImage('../Image/Explode/circleExplode3.png'),
loadImage('../Image/Explode/circleExplode3.png'),
]
elif variety == ExplodeVariety.BRIDGE:
self.images = [
loadImage('../Image/Explode/bridgeExplode1.png'),
loadImage('../Image/Explode/bridgeExplode2.png'),
loadImage('../Image/Explode/bridgeExplode3.png'),
]
self.index = 0
self.image = self.images[self.index]
self.isDestroy = False
self.isUseTime = isUseTime
self.lastTime = None
def draw(self, window, currentTime = None):
if self.isUseTime:
if currentTime - self.lastTime > 115:
# 根据索引获取爆炸对象, 添加到主窗口
# 让图像加载五次,这里可以换成五张大小不一样的爆炸图片,可以实现让爆炸效果从小变大的效果
if self.index < len(self.images):
self.image = self.images[self.index]
self.index += 1
window.blit(self.image, self.rect)
else:
self.isDestroy = True
self.index = 0
self.lastTime = currentTime
else:
window.blit(self.image, self.rect)
else:
# 根据索引获取爆炸对象, 添加到主窗口
# 让图像加载五次,这里可以换成五张大小不一样的爆炸图片,可以实现让爆炸效果从小变大的效果
if self.index < len(self.images):
self.image = self.images[self.index]
self.index += 1
window.blit(self.image, self.rect)
else:
self.isDestroy = True
self.index = 0
每种爆炸效果是多张图片,为了让爆炸效果的显示的顺畅一点,我给敌人死亡的爆炸效果多加入了几张重复的图片,这样运行起来爆炸效果比较好,当然也可以使用帧率来控制
桥的爆炸效果我用的帧率来控制,所以有个变量isUseTime,如果是True,表示用游戏中的时间来控制图片的加载
首先,在主类中增加爆炸效果列表

其次,创建显示爆炸效果函数
def drawExplode(explodeList):
for explode in explodeList:
if explode.isDestroy:
explodeList.remove(explode)
else:
if explode.isUseTime:
explode.draw(MainGame.window, pygame.time.get_ticks())
else:
explode.draw(MainGame.window)
这里由于isUseTime为True时,draw()函数需要多传入一个参数,所以要写if-else语句
最后,在主类中调用显示爆炸特效函数和给敌人加入爆炸特效

给敌人进入河中加入爆炸特效

接下来我们运行一下游戏,看看效果

发现敌人落到河里就爆炸啦
下面给添加玩家子弹击中敌人,敌人死亡
进入子弹类,添加函数
def collideEnemy(self, enemyList, explodeList):
for enemy in enemyList:
if pygame.sprite.collide_rect(self, enemy):
self.isDestroy = True
enemy.isDestroy = True
explodeList.append(Explode(enemy))
遍历敌人列表,如果当前的子弹碰到了敌人,那么就加入爆炸特效,让敌人的isDestroy为True
然后在主类的drawPlayerOneBullet()函数中,调用函数

接下来运行一下

ok,我们就实现了
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o