96SEO 2026-02-19 18:54 13
开发魂斗罗八中我们加入了敌人但是敌人不能发射子弹而且也没有碰撞体接下来我们来实现一下

链接https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwdhdly
在__init__()函数中增加一个参数isEnemy用来指定这个子弹是不是敌人发射的
Bullet(pygame.sprite.Sprite):def
False):pygame.sprite.Sprite.__init__(self)self.images
[loadImage(../Image/Bullet/bullet1.png)]然后把下面红框框出的代码进行修改
False):pygame.sprite.Sprite.__init__(self)self.images
[loadImage(../Image/Bullet/bullet1.png)]self.index
person.isInWater:self.waterPosition(person)else:self.landPosition(person)else:if
drawEnemyBullet(enemyBulletList):for
bullet.isDestroy:enemyBulletList.remove(bullet)else:bullet.draw(MainGame.window)bullet.move()该函数用来显示子弹并让子弹移动
在主类外面写一个全局函数用来让检测敌人碰撞问题敌人下落是垂直方向的碰撞问题
让复制的y加1看看有没有发生碰撞这里看的碰撞是enemyColliderGroup中的碰撞collide
pygame.sprite.spritecollideany(t,
MainGame.enemyRiverGroup:enemy.isDestroy
1之后调用一下这个函数在主类的update()函数中加入该函数
loadImage(../Image/Enemy/Enemy1/fire.png)
loadImage(../Image/Enemy/Enemy1/fire.png,
loadImage(../Image/Enemy/Enemy1/fall.png)
loadImage(../Image/Enemy/Enemy1/fall.png,
这是因为现在敌人碰撞体组中什么都没有敌人脚下是空的当地人出现后就直接会掉下去啦
one表示这是产生敌人的第一个地区之前我们在Constants.py中设置了这个变量记录着敌人产生的高度
MAP_SCALE)MainGame.playerLandGroup
MAP_SCALE)MainGame.enemyLandGroup
eland9)MainGame.playerColliderGroup.add(MainGame.playerLandGroup)MainGame.enemyColliderGroup.add(MainGame.enemyLandGroup)def
river3)MainGame.enemyRiverGroup
eRiver3)MainGame.playerColliderGroup.add(MainGame.playerRiverGroup)MainGame.enemyColliderGroup.add(MainGame.enemyRiverGroup)e开头的是敌人碰撞体这里我多加入了一些碰撞体为地图后面的陆地也增加了
1.3571428571428572我其实不太确定地图中冲突的尺寸在图片中1000的位置应该是一个陆地但是在窗口中这个地方不是陆地里面有一个对应的系数我试了放大倍数2.5发现对不上所以我就想找一个系数1.3571428571428572但是这个系数也有问题窗口上面的图片的系数和下面的系数不一样
我觉得这个地方不需要明白能在地图中的对应位置设置碰撞体就行至于位置大家可以自己探索
drawPlayerOneBullet(player1BulletList):for
bullet.isDestroy:player1BulletList.remove(bullet)else:bullet.draw(MainGame.window)bullet.move()def
删除它的相关信息enemyList.remove(enemy)MainGame.allSprites.remove(enemy)MainGame.enemyGroup.remove(enemy)#
检查位置enemy.checkPosition(MainGame.player1.rect.x,
显示敌人enemy.draw(pygame.time.get_ticks())#
敌人移动enemy.move(pygame.time.get_ticks())#
敌人开火enemy.fire(enemyBulletList)def
让复制的y加1看看有没有发生碰撞这里看的碰撞是enemyColliderGroup中的碰撞collide
pygame.sprite.spritecollideany(t,
MainGame.enemyRiverGroup:enemy.isDestroy
MainGame.explodeList.append(Explode(enemy))t.rect.y
drawEnemyBullet(enemyBulletList):for
bullet.isDestroy:enemyBulletList.remove(bullet)else:bullet.draw(MainGame.window)bullet.move()def
MAP_SCALE)MainGame.playerLandGroup
MAP_SCALE)MainGame.enemyLandGroup
eland9)MainGame.playerColliderGroup.add(MainGame.playerLandGroup)MainGame.enemyColliderGroup.add(MainGame.enemyLandGroup)def
river3)MainGame.enemyRiverGroup
eRiver3)MainGame.playerColliderGroup.add(MainGame.playerRiverGroup)MainGame.enemyColliderGroup.add(MainGame.enemyRiverGroup)class
pygame.sprite.Group()playerRiverGroup
pygame.sprite.Group()enemyLandGroup
pygame.sprite.Group()enemyRiverGroup
pygame.sprite.Group()playerColliderGroup
pygame.sprite.Group()enemyColliderGroup
pygame.sprite.Group()enemyGroup
pygame.sprite.Group()bridgeGroup
初始化展示模块pygame.display.init()SCREEN_SIZE
pygame.display.set_mode(SCREEN_SIZE)#
设置窗口标题pygame.display.set_caption(魂斗罗角色)#
PlayerOne(pygame.time.get_ticks())#
设置角色的初始位置MainGame.player1.rect.x
把角色放入组中方便统一管理MainGame.allSprites
pygame.sprite.Group(MainGame.player1)#
pygame.image.load(../Image/Map/1/Background/First(Bridge).png)self.backRect
self.background.get_rect()self.background
pygame.transform.scale(self.background,(int(self.backRect.width
MAP_SCALE),int(self.backRect.height
设置背景颜色pygame.display.get_surface().fill((0,
游戏场景和景物更新函数self.update(MainGame.window,
获取窗口中的事件self.getPlayingModeEvent()#
设置帧率self.clock.tick(self.fps)fps
{:.2f}.format(fps)pygame.display.set_caption(caption)else:sys.exit()def
加载背景window.blit(self.background,
self.backRect)enemyUpdate(MainGame.enemyList,
pygame.time.get_ticks()MainGame.allSprites.update(self.keys,
player1BulletList)self.updatePlayerPosition()drawPlayerOneBullet(player1BulletList)drawEnemyBullet(MainGame.enemyBulletList)updateEnemyPosition()#
显示物体MainGame.allSprites.draw(window)#
-1500:self.generateEnemy(MainGame.player1.rect.x
pygame.time.get_ticks())self.generateEnemy(MainGame.player1.rect.x
-1700:self.generateEnemy(MainGame.player1.rect.x
pygame.time.get_ticks())self.generateEnemy(MainGame.player1.rect.x
Direction.RIGHT,pygame.time.get_ticks())for
删除并加入栈MainGame.colliderStack.insert(0,
collider)MainGame.playerColliderGroup.remove(collider)else:#
如果是的话且冲突栈不为空那么从栈中取出一个元素放入冲突组最前面的元素一定是先如队列的if
MainGame.colliderStack.pop()MainGame.playerColliderGroup.add(f)MainGame.playerRiverGroup.draw(window)def
MainGame.allSprites:sprite.rect.x
MainGame.playerColliderGroup:collider.rect.x
MainGame.colliderStack:collider.rect.x
MainGame.enemyColliderGroup:collider.rect.x
self.player1.xSpeedself.player1.rect.y
self.player1.ySpeedself.player1.isDown
这里是玩家和所有碰撞组中的碰撞体检测碰撞如果发生了碰撞就会返回碰撞到的碰撞体对象collider
pygame.sprite.spritecollideany(self.player1,
在河里设置isInWaterself.player1.isInWater
设置玩家在河里不能跳跃self.player1.isJumping
默认落下去是站在河里的self.player1.isStanding
Direction.RIGHT:self.player1.image
self.player1.rightInWaterImageelse:self.player1.image
MainGame.playerLandGroup:self.player1.isInWater
判断一下人物的y速度如果大于0则说明玩家已经接触到了碰撞体表面需要让玩家站在表面不掉下去if
State.WALKself.player1.rect.bottom
让玩家的纵坐标—1看看有没有发生碰撞tempPlayer.rect.y
pygame.sprite.spritecollideany(tempPlayer,
MainGame.playerColliderGroup):#
如果此时不是跳跃状态那么就让玩家变成下落状态因为玩家在跳跃时是向上跳跃不需要对下面的物体进行碰撞检测if
pygame.sprite.spritecollideany(self.player1,
设置玩家的右边等于碰撞体的左边self.player1.rect.right
collider.rect.rightself.player1.xSpeed
copy.copy(self.player1)tempPlayer.rect.y
pygame.sprite.spritecollideany(tempPlayer,
MainGame.playerColliderGroup):if
MainGame.playerLandGroup:self.player1.isInWater
MainGame.playerRiverGroup:self.player1.isInWater
分别加入敌人列表所有角色组敌人碰撞组MainGame.enemyList.append(enemy)MainGame.allSprites.add(enemy)MainGame.enemyGroup.add(enemy)if
__main__:MainGame().run()完整的敌人1类代码
Enemy1(pygame.sprite.Sprite):def
currentTime):pygame.sprite.Sprite.__init__(self)self.lastTime
[loadImage(../Image/Enemy/Enemy1/1.png),loadImage(../Image/Enemy/Enemy1/2.png),loadImage(../Image/Enemy/Enemy1/3.png)]self.leftImages
[loadImage(../Image/Enemy/Enemy1/1.png,
True),loadImage(../Image/Enemy/Enemy1/2.png,
True),loadImage(../Image/Enemy/Enemy1/3.png,
loadImage(../Image/Enemy/Enemy1/fire.png)self.leftFireImage
loadImage(../Image/Enemy/Enemy1/fire.png,
loadImage(../Image/Enemy/Enemy1/fall.png,
loadImage(../Image/Enemy/Enemy1/fire.png)self.leftFireImage
loadImage(../Image/Enemy/Enemy1/fire.png,
loadImage(../Image/Enemy/Enemy1/fall.png)self.leftFallImage
loadImage(../Image/Enemy/Enemy1/fall.png,
self.rightImages[self.index]else:self.image
self.leftImages[self.index]self.rect
self.image.get_rect()self.isFalling
没有开火就根据方向移动这里我设置敌人只能向一个方向移动不能转身if
如果此时是开火状态判断一下上次开火的时间和这次的时间是否相差1000#
这个的作用在于让敌人开火的时候站在那里不动因为敌人移动时是不能开火的if
如果两次开火间隔相差很大那么就可以让敌人再次开火self.isFiring
self.rightFireImageelse:self.image
self.rightImages[self.index]else:self.image
TrueenemyBulletList.append(Bullet(self,
Bullet(pygame.sprite.Sprite):def
False):pygame.sprite.Sprite.__init__(self)self.images
[loadImage(../Image/Bullet/bullet1.png)]self.index
person.isInWater:self.waterPosition(person)else:self.landPosition(person)else:if
self.ySpeedself.checkBullet()def
window):window.blit(self.image,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback