北京市轨道交通建设管理有限公司网站,汕头市小程序定制公司,自己做网站需要什么软件,制作网站民治学习 Python 之 Pygame 开发坦克大战#xff08;四#xff09;坦克大战添加音效1. 初始化音效2. 加入游戏开始音效和坦克移动音效3. 添加坦克开火音效4. 添加装甲削减音效5. 添加坦克爆炸音效6. 添加子弹击中边界音效坦克大战添加音效
我的素材放到了百度网盘里#xff0c;…
学习 Python 之 Pygame 开发坦克大战四坦克大战添加音效1. 初始化音效2. 加入游戏开始音效和坦克移动音效3. 添加坦克开火音效4. 添加装甲削减音效5. 添加坦克爆炸音效6. 添加子弹击中边界音效坦克大战添加音效
我的素材放到了百度网盘里里面还有原版坦克大战素材我都放在一起来我的素材是从原版改的各位小伙伴可以直接用或者自己改一下再用做出适合自己的素材
素材链接百度网盘 链接https://pan.baidu.com/s/19sCyH7rp37f6DzRj0iXDCA?pwdtkdz 提取码tkdz
那我们就继续编写坦克大战吧
1. 初始化音效
现在已经完成了敌方坦克和我方坦克的对打了我们把音效加入一下
创建音乐类
import pygameclass Sound:def __init__(self, filename):self.filename filenamepygame.mixer.init()self.sound pygame.mixer.Sound(self.filename)def play(self, loops 0):self.sound.play(loops)def stop(self):self.sound.stop()def setVolume(self):self.sound.set_volume(0.2)return self这些代码在 学习 Python 之 Pygame 开发坦克大战一中已经提前见过了
2. 加入游戏开始音效和坦克移动音效
坦克的移动是有音效的在主类加入类成员
playerTankMoveSound Sound(../Sound/player.move.wav).setVolume()
startingSound Sound(../Sound/intro.wav)class MainGame:...# 坦克移动音效playerTankMoveSound Sound(../Sound/player.move.wav).setVolume()# 游戏开始音效startingSound Sound(../Sound/intro.wav)...在主函数中调用播放
def startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption(Tank Battle)# 初始化我方坦克MainGame.playerTank PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)# 播放开始音乐MainGame.startingSound.play()...修改getPlayingModeEvent()函数
def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:MainGame.playerTankMoveSound.play(-1)if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)if event.type pygame.KEYUP:MainGame.playerTankMoveSound.stop()if event.key pygame.K_w:MainGame.playerTank.stop Trueelif event.key pygame.K_s:MainGame.playerTank.stop Trueelif event.key pygame.K_a:MainGame.playerTank.stop Trueelif event.key pygame.K_d:MainGame.playerTank.stop True完整的主类代码
import pygame
import sysfrom PlayerTank import PlayerTank
from EnemyTank import EnemyTank
from Sound import SoundSCREEN_WIDTH 1100
SCREEN_HEIGHT 600
BACKGROUND_COLOR pygame.Color(0, 0, 0)
FONT_COLOR (255, 255, 255)
PLAYER_TANK_POSITION (325, 550)class MainGame:# 窗口Surface对象window None# 玩家坦克playerTank None# 玩家子弹playerBulletList []playerBulletNumber 3# 敌人坦克enemyTankList []enemyTankTotalCount 5# 用来给玩家展示坦克的数量enemyTankCurrentCount 5# 敌人坦克子弹enemyTankBulletList []# 爆炸列表explodeList []# 坦克移动音效playerTankMoveSound Sound(../Sound/player.move.wav).setVolume()# 游戏开始音效startingSound Sound(../Sound/intro.wav)def __init__(self):passdef startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption(Tank Battle)# 初始化我方坦克MainGame.playerTank PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)# 播放开始音乐MainGame.startingSound.play()while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:MainGame.playerTankMoveSound.play(-1)if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)if event.type pygame.KEYUP:MainGame.playerTankMoveSound.stop()if event.key pygame.K_w:MainGame.playerTank.stop Trueelif event.key pygame.K_s:MainGame.playerTank.stop Trueelif event.key pygame.K_a:MainGame.playerTank.stop Trueelif event.key pygame.K_d:MainGame.playerTank.stop Truedef drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)else:playerBulletList.remove(bullet)def drawEnemyTank(self):# 如果当前坦克为0那么就该重新生成坦克if len(MainGame.enemyTankList) 0:# 一次性产生三个如果剩余坦克数量超过三那只能产生三个n min(3, MainGame.enemyTankTotalCount)# 如果最小是0就说明敌人坦克没有了那么就赢了if n 0:print(赢了)return# 没有赢的话就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount - n# 遍历坦克列表展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)def initEnemyTank(self, number):y 0position [0, 425, 850]index 0for i in range(number):x position[index]enemyTank EnemyTank(x, y)MainGame.enemyTankList.append(enemyTank)index 1def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)def drawExplode(self):for e in MainGame.explodeList:if e.isDestroy:MainGame.explodeList.remove(e)else:e.draw(MainGame.window)if __name__ __main__:MainGame().startGame()
3. 添加坦克开火音效
玩家坦克发射子弹是有音效的
修改getPlayingModeEvent()函数
def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:MainGame.playerTankMoveSound.play(-1)if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)# 添加音效Sound(../Sound/shoot.wav).play(0)4. 添加装甲削减音效
当我方坦克击中时如果有装甲装甲较少时会有音效 当敌方坦克血量减少时也会出现音效
修改子弹类中的playerBulletCollideEnemyTank()函数增加敌方坦克血量减少音效
def playerBulletCollideEnemyTank(self, enemyTankList, explodeList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy Trueif tank.life 0:# 增加爆炸效果explode Explode(tank, 50)explodeList.append(explode)else:Sound(../Sound/enemy.armor.hit.wav).play()
修改子弹类中的enemyBulletCollidePlayerTank()函数增加我方坦克血量装甲音效
def enemyBulletCollidePlayerTank(self, playerTank, explodeList):
# 玩家坦克生命值为0不用检测
if playerTank.life 0:return
# 检测是否发生碰撞
if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)Sound(../Sound/enemy.armor.hit.wav).play()else:playerTank.loseLife(self.damage)# 增加爆炸效果explode Explode(playerTank, 50)explodeList.append(explode)playerTank.life max(0, playerTank.life)if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True5. 添加坦克爆炸音效
修改子弹类中的下面两个函数
def playerBulletCollideEnemyTank(self, enemyTankList, explodeList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy Trueif tank.life 0:# 增加爆炸效果explode Explode(tank, 50)explodeList.append(explode)Sound(../Sound/kill.wav).play()else:Sound(../Sound/enemy.armor.hit.wav).play()def enemyBulletCollidePlayerTank(self, playerTank, explodeList):# 玩家坦克生命值为0不用检测if playerTank.life 0:return# 检测是否发生碰撞if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)Sound(../Sound/enemy.armor.hit.wav).play()else:playerTank.loseLife(self.damage)# 增加爆炸效果explode Explode(playerTank, 50)explodeList.append(explode)playerTank.life max(0, playerTank.life)Sound(../Sound/kill.wav).play()if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True6. 添加子弹击中边界音效
在子弹类中checkBullet()函数增加音效代码
def checkBullet(self, explodeList):toDestroy False# 如果出界就设置为销毁if self.rect.top 0 or self.rect.top 600:toDestroy Trueif self.rect.left 0 or self.rect.right 900:toDestroy Trueif toDestroy:explode Explode(self, 25)explodeList.append(explode)self.isDestroy TrueSound(../Sound/block.wav).play()运行一下看看整体的效果
完整的主类代码
import pygame
import sysfrom PlayerTank import PlayerTank
from EnemyTank import EnemyTank
from Sound import SoundSCREEN_WIDTH 1100
SCREEN_HEIGHT 600
BACKGROUND_COLOR pygame.Color(0, 0, 0)
FONT_COLOR (255, 255, 255)
PLAYER_TANK_POSITION (325, 550)class MainGame:# 窗口Surface对象window None# 玩家坦克playerTank None# 玩家子弹playerBulletList []playerBulletNumber 3# 敌人坦克enemyTankList []enemyTankTotalCount 5# 用来给玩家展示坦克的数量enemyTankCurrentCount 5# 敌人坦克子弹enemyTankBulletList []# 爆炸列表explodeList []# 坦克移动音效playerTankMoveSound Sound(../Sound/player.move.wav).setVolume()# 游戏开始音效startingSound Sound(../Sound/intro.wav)def __init__(self):passdef startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption(Tank Battle)# 初始化我方坦克MainGame.playerTank PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)# 播放开始音乐MainGame.startingSound.play()while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:MainGame.playerTankMoveSound.play(-1)if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)# 添加音效Sound(../Sound/shoot.wav).play(0)if event.type pygame.KEYUP:MainGame.playerTankMoveSound.stop()if event.key pygame.K_w:MainGame.playerTank.stop Trueelif event.key pygame.K_s:MainGame.playerTank.stop Trueelif event.key pygame.K_a:MainGame.playerTank.stop Trueelif event.key pygame.K_d:MainGame.playerTank.stop Truedef drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)else:playerBulletList.remove(bullet)def drawEnemyTank(self):# 如果当前坦克为0那么就该重新生成坦克if len(MainGame.enemyTankList) 0:# 一次性产生三个如果剩余坦克数量超过三那只能产生三个n min(3, MainGame.enemyTankTotalCount)# 如果最小是0就说明敌人坦克没有了那么就赢了if n 0:print(赢了)return# 没有赢的话就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount - n# 遍历坦克列表展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)def initEnemyTank(self, number):y 0position [0, 425, 850]index 0for i in range(number):x position[index]enemyTank EnemyTank(x, y)MainGame.enemyTankList.append(enemyTank)index 1def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)def drawExplode(self):for e in MainGame.explodeList:if e.isDestroy:MainGame.explodeList.remove(e)else:e.draw(MainGame.window)if __name__ __main__:MainGame().startGame()
完整的敌方坦克类代码
import random
import pygame
import pygame.imagefrom ParentObject import ParentObject
from Bullet import Bulletclass EnemyTank(ParentObject):def __init__(self, x, y):super().__init__()types [(1, 3), (2, 1), (3, 2), (4, 10)]# 随机产生一种坦克self.type types[random.randint(0, len(types) - 1)]up []down []left []right []for i in range(1, self.type[1] 1):up.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (UP).png))down.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (DOWN).png))left.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (LEFT).png))right.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (RIGHT).png))self.images {UP: up,DOWN: down,LEFT: left,RIGHT: right}# 生命self.life self.type[1]# 方向self.direction DOWNself.image: pygame.Surface self.images[self.direction][self.life - 1]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 速度self.accumulationMax: float 0self.accumulation 0.1speed 0maxBulletCount 0damage 1# 每种坦克都有不同的属性if self.type[0] 1:speed 3self.level 1maxBulletCount 1elif self.type[0] 2:speed 5self.level 2maxBulletCount 1damage 3elif self.type[0] 3:speed 7self.level 1maxBulletCount 3damage 2elif self.type[0] 4:speed 6self.level 2maxBulletCount 3damage 1self.speed speed# 移动开关self.stop True# 开火开关self.fire True# 步数self.step 30# 伤害self.damage damage# 子弹个数self.bulletCount 0self.maxBulletCount maxBulletCountdef loseLife(self, value 1):self.life - valuedef move(self):新增步数变量, 当坦克移动时, 步数进行减少, 当步数小于等于0的时候, 修改地方坦克的方向:return: Noneif self.stop:if self.step 0:self.direction self.randDirection()self.step 30else:if self.accumulationMax 1:self.accumulationMax 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedself.step - 1else:self.accumulationMax self.accumulationdef shot(self):if self.fire:if self.bulletCount self.maxBulletCount:num random.randint(0, 100)if num 5 or num 6:self.bulletCount 1return Bullet(self)return Nonedef draw(self, window):# 获取展示的对象self.image self.images[self.direction][self.life - 1]window.blit(self.image, self.rect)def randDirection(self):directions [UP, DOWN, LEFT, RIGHT]index random.randint(0, 3)return directions[index]def collidePlayerTank(self, playerTank):# 遍历全部敌方坦克检查有没有碰撞if pygame.sprite.collide_rect(self, playerTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvYdef collideEnemyTank(self, enemyTankList):for tank in enemyTankList:if pygame.sprite.collide_rect(self, tank) and tank ! self:self.rect.left self.prvXself.rect.top self.prvY完整的我方坦克类代码
import pygame
import pygame.image
from ParentObject import ParentObject
from Bullet import Bulletclass PlayerTank(ParentObject):def __init__(self, x, y, order, amour)::param x: 坦克横坐标:param y: 坦克纵坐标:param order: 玩家坦克序号1表示一号玩家2表示二号玩家:param amour: 坦克初始护甲super().__init__()self.images []if order 1:self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP1.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN1.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT1.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT1.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP2.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN2.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT2.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT2.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP3.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN3.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT3.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT3.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP4.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN4.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT4.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT4.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP5.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN5.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT5.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT5.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP6.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN6.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT6.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT6.png)})# 生命self.life 3# 装甲self.armor amour# 方向self.direction UP# 根据护甲选择坦克的样子self.image: pygame.Surface self.images[max(self.armor - 1, 0)][self.direction]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 速度self.accumulation: float 0self.speed 2# 移动开关self.stop True# 重生self.isResurrecting False# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 等级self.level 1# 伤害self.damage 1def move(self):if self.accumulation 1:self.accumulation 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedelse:self.accumulation 0.20def shot(self):return Bullet(self)def draw(self, window, x, y):# 坦克生命中为0表示已经死亡不再展示坦克if self.life 0:return# 判断坦克是否复合if self.isResurrecting:# 把坦克位置设置为指定的重生位置self.rect.left xself.rect.top yself.isResurrecting Falseself.direction UP# 获取展示的对象self.image self.images[max(self.armor - 1, 0)][self.direction]# 画出图片window.blit(self.image, self.rect)def collideEnemyTank(self, enemyTankList):# 遍历全部敌方坦克检查有没有碰撞for enemyTank in enemyTankList:if pygame.sprite.collide_rect(self, enemyTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvYdef loseLife(self, value 1):self.life - value
完整的子弹类代码
import pygame
from ParentObject import ParentObject
from Explode import Explode
from Sound import Soundclass Bullet(ParentObject):def __init__(self, tank):super().__init__()self.images {UP: pygame.image.load(../Image/Bullet/Bullet(UP).png),DOWN: pygame.image.load(../Image/Bullet/Bullet(DOWN).png),LEFT: pygame.image.load(../Image/Bullet/Bullet(LEFT).png),RIGHT: pygame.image.load(../Image/Bullet/Bullet(RIGHT).png)}# 方向self.direction tank.directionself.image: pygame.Surface self.images[self.direction]self.rect self.image.get_rect()# 坦克发射子弹的位置if self.direction UP:self.rect.left tank.rect.left 17.5self.rect.top tank.rect.top - 25elif self.direction DOWN:self.rect.left tank.rect.left 17.5self.rect.top tank.rect.top 25elif self.direction LEFT:self.rect.left tank.rect.left - 25self.rect.top tank.rect.top 17.5elif self.direction RIGHT:self.rect.left tank.rect.left 25self.rect.top tank.rect.top 17.5# 速度self.accumulationMax: float 0self.accumulation 0.25self.speed 10# 销毁开关self.isDestroy False# 发射源self.source tank# 伤害self.damage tank.damagedef move(self, explodeList):if self.accumulation 1:self.accumulation 0if self.direction LEFT:self.rect.left - self.speedelif self.direction UP:self.rect.top - self.speedelif self.direction DOWN:self.rect.top self.speedelif self.direction RIGHT:self.rect.left self.speed# 检查子弹是否出界self.checkBullet(explodeList)else:self.accumulation 0.20def checkBullet(self, explodeList):toDestroy False# 如果出界就设置为销毁if self.rect.top 0 or self.rect.top 600:toDestroy Trueif self.rect.left 0 or self.rect.right 900:toDestroy Trueif toDestroy:explode Explode(self, 25)explodeList.append(explode)self.isDestroy TrueSound(../Sound/block.wav).play()def draw(self, window):window.blit(self.image, self.rect)def playerBulletCollideEnemyTank(self, enemyTankList, explodeList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy Trueif tank.life 0:# 增加爆炸效果explode Explode(tank, 50)explodeList.append(explode)Sound(../Sound/kill.wav).play()else:Sound(../Sound/enemy.armor.hit.wav).play()def enemyBulletCollidePlayerTank(self, playerTank, explodeList):# 玩家坦克生命值为0不用检测if playerTank.life 0:return# 检测是否发生碰撞if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)Sound(../Sound/enemy.armor.hit.wav).play()else:playerTank.loseLife(self.damage)# 增加爆炸效果explode Explode(playerTank, 50)explodeList.append(explode)playerTank.life max(0, playerTank.life)Sound(../Sound/kill.wav).play()if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True
完整的音乐类代码
import pygameclass Sound:def __init__(self, filename):self.filename filenamepygame.mixer.init()self.sound pygame.mixer.Sound(self.filename)def play(self, loops 0):self.sound.play(loops)def stop(self):self.sound.stop()def setVolume(self):self.sound.set_volume(0.2)return self完整的爆炸效果类代码
import pygame.imageclass Explode:def __init__(self, object, size):# 获取爆炸对象的位置self.rect object.rectself.images []self.images.append([pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png)])self.images.append([pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png)])self.mode 0if size 25:self.mode 1self.index 0self.image self.images[self.mode][self.index]self.isDestroy Falsedef draw(self, window):# 根据索引获取爆炸对象, 添加到主窗口if self.index len(self.images):self.image self.images[self.mode][self.index]self.index 1window.blit(self.image, self.rect)else:self.isDestroy Trueself.index 0至此坦克大战出了地图中的固定景物外都有音效和动作下面就为地图添加墙之类的物体了