学习 Python 之 Pygame 开发魂斗罗(十六)

这篇具有很好参考价值的文章主要介绍了学习 Python 之 Pygame 开发魂斗罗(十六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

完成最终的魂斗罗

在上次的博客学习 Python 之 Pygame 开发魂斗罗(十五)中,我们加入了boss,至此,魂斗罗的主体部分已经完成了,接下来就是在其他地方加入一点敌人,设置进场动画,胜利动画,失败动画和音效了,在这篇博客中,我们加入音效和加入进场动画。

下面是图片的素材和源码,我把源码也放到了网盘

链接:https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwd=hdly
提取码:hdly

1. 创建Sound类

import pygame


class Sound:
    def __init__(self, filename):
        self.filename = filename
        pygame.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

把该类导入到需要播放音效的类

2. 添加背景音乐

在主类的构造函数中加入如下代码,并且在run()函数中播放背景音乐

# 加载音乐
self.backgroundMusic = Sound('../Sound/1.mp3')

学习 Python 之 Pygame 开发魂斗罗(十六)

注意不要加入到循环中了

3. 添加玩家发射子弹音效

来到玩家1类,找到fire()函数,修改代码

    def fire(self, currentTime, playerBulletList):
        self.isFiring = True
        # 潜水状态下不能开火
        if not (self.isInWater and self.isSquating):
            if len(playerBulletList) < PLAYER_BULLET_NUMBER:
                if currentTime - self.fireLastTimer > 150:
                    Sound('../Sound/commonFire.mp3').play()
                    playerBulletList.append(Bullet(self))
                    self.fireLastTimer = currentTime

学习 Python 之 Pygame 开发魂斗罗(十六)

4. 增加击中boss要害音效

来到子弹类,修改collideEnemy()函数
学习 Python 之 Pygame 开发魂斗罗(十六)

5. 击中敌人音效

还是在子弹类的collideEnemy()函数中加入代码
学习 Python 之 Pygame 开发魂斗罗(十六)

    def collideEnemy(self, enemyList, explodeList):
        for enemy in enemyList:
            if pygame.sprite.collide_rect(self, enemy):
                if enemy.type == 3 or enemy.type == 4:
                    enemy.life -= 1
                    Sound('../Sound/hitWeakness.mp3').play()
                    if enemy.life <= 0:
                        self.isDestroy = True
                        enemy.isDestroy = True
                        explodeList.append(Explode(enemy, ExplodeVariety.BRIDGE))
                else:
                    Sound('../Sound/enemyDie.mp3').play()
                    self.isDestroy = True
                    enemy.isDestroy = True
                    explodeList.append(Explode(enemy))

由于博主没有其他的音效,只能添加这部分了,如果大家自己找到了音效,可以加入,让游戏变得更完整

6. 加入进场动画

在主类中加入加载进场动画函数

    def loadApproachAnimation(self):
        # 读取进场图片
        approach = pygame.image.load('../Image/Map/1/Background/First(Approach).png')
        approachRect = self.background.get_rect()
        approach = pygame.transform.scale(
            approach,
            (int(approachRect.width * 1),
             int(approachRect.height * 1))
        )
        approachRect.x = 0
        # 设置进场图片移动速度
        cameraAdaption = 3
        # 记录当前时间
        currentTime = 0
        # 创建一张黑色的图片,用来盖住选择图标
        image = pygame.Surface((50, 50)).convert()
        image.fill((0, 0, 0))
        # 记录是否播放音效,播放了就要画了
        isPlayed = False
        showTime = pygame.time.get_ticks()
        lastingTime = pygame.time.get_ticks()
        keys = ''
        while 1:
            MainGame.window.blit(approach, approachRect)
            
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    # 上上下下左右左右BABA A是跳跃键,B是射击键
                    if event.key == pygame.K_w:
                        keys += 'w'
                    elif event.key == pygame.K_s:
                        keys += 's'
                    elif event.key == pygame.K_j:
                        keys += 'b'
                    elif event.key == pygame.K_k:
                        keys += 'a'
                    elif event.key == pygame.K_RETURN:
                        if not isPlayed:
                            approachRect.x = -1435
                            Sound('../Sound/start.mp3').play()
                            currentTime = time.time()
                            isPlayed = True
                    
            # 让背景向右走这么多距离
            if approachRect.x > -1435:
                approachRect.x -= cameraAdaption
                
            if isPlayed:
                # 设置图标一闪一闪的
                if abs(lastingTime - pygame.time.get_ticks()) > 400:
                    if 1200 > abs(showTime - pygame.time.get_ticks()) > 0:
                        MainGame.window.blit(image, (190, 390))
                    else:
                        showTime = pygame.time.get_ticks()
                        lastingTime = pygame.time.get_ticks()
                    
            # 更新窗口
            pygame.display.update()
            # 设置帧率
            self.clock.tick(self.fps)
            fps = self.clock.get_fps()
            caption = '魂斗罗 - {:.2f}'.format(fps)
            pygame.display.set_caption(caption)
            
            # 如果时间超过60,就开始加载第一关
            if 100 > abs(time.time() - currentTime) * 10 > 60:
                print(keys)
                if keys == 'wwssbaba':
                    initPlayer1(30)
                break

这里需要解释几处

# 当按键按下,直接结束进场动画,播放音乐,让图标还是闪烁,一定时间后进入第一关
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()
    elif event.type == pygame.KEYDOWN:
        # 上上下下左右左右BABA A是跳跃键,B是射击键
        if event.key == pygame.K_w:
            keys += 'w'
        elif event.key == pygame.K_s:
            keys += 's'
        elif event.key == pygame.K_j:
            keys += 'b'
        elif event.key == pygame.K_k:
            keys += 'a'
        elif event.key == pygame.K_RETURN:
            if not isPlayed:
                approachRect.x = -1435
                Sound('../Sound/start.mp3').play()
                currentTime = time.time()
                isPlayed = True

这部分是让玩家按下回车后直接播放音乐,并且直接来到玩家选择界面(如下图),如果按下了上上下下左右左右BABA时,玩家就会30条名

学习 Python 之 Pygame 开发魂斗罗(十六)

if isPlayed:
    # 设置图标一闪一闪的
    if abs(lastingTime - pygame.time.get_ticks()) > 400:
        if 1200 > abs(showTime - pygame.time.get_ticks()) > 0:
            MainGame.window.blit(image, (190, 390))
        else:
            showTime = pygame.time.get_ticks()
            lastingTime = pygame.time.get_ticks()

这部分是让图标闪烁的,整体思想就是创建一块黑布(纯黑图片),一段时间把原来的图标盖住,一段时间不盖住,上面的代码就是实现这个功能,abs(lastingTime - pygame.time.get_ticks()) > 400 这个代码是不盖住的,lastingTime 是不盖住的时间,如果超过了400,就进入if语句体,让黑布显示出来,盖住图标,盖住的时间是1200 ,如果大于1200 了,就不盖住了。

注意导入模块,否则会出现如下报错

学习 Python 之 Pygame 开发魂斗罗(十六)

主类新增runGame()函数

    def runGame(self):
        self.loadApproachAnimation()
        self.run()

该函数是游戏的运行函数

修改main()函数

学习 Python 之 Pygame 开发魂斗罗(十六)
我们运行一下游戏,看看效果

可以看到界面慢慢移动,如果按下任意键,就会播放声音,播放完后过几秒会进入第一关

7. 解决玩家掉出地图死亡问题

在当前的游戏中,玩家掉落到山崖后,没有死亡,我们需要修改一下
来到主类的updatePlayerPosition()函数

增加如下代码

if tempPlayer.rect.y > 610:
    if MainGame.player1.damage(1):
        initPlayer1(MainGame.player1.life)

学习 Python 之 Pygame 开发魂斗罗(十六)
这段代码就是如果玩家的y坐标大于610,就算玩家死亡,重新加载玩家

8. 完善玩家游戏失败函数

把主类的isEnd属性变成类属性

学习 Python 之 Pygame 开发魂斗罗(十六)

学习 Python 之 Pygame 开发魂斗罗(十六)
增加endGame()函数

学习 Python 之 Pygame 开发魂斗罗(十六)

def endGame():
    MainGame.isEnd = True

这里需要修改一下逻辑,来到updateEnemyPosition()函数

学习 Python 之 Pygame 开发魂斗罗(十六)
把原来的endGame函数改为victory,表示玩家胜利了

我们先暂时定义一下这个函数

def victory():
    pass

学习 Python 之 Pygame 开发魂斗罗(十六)
之后继续修改endGame()函数逻辑

现在运行游戏,看看玩家没有生命了游戏会不会退出

发现是可以的

9. 总结

至此,魂斗罗整体就算完成了,由于博主没有通过的地图和爆炸的音效,这里没办法加入

大家接下来可以扩展,博主没有完善游戏结束和游戏胜利的界面,如果后面我找到了对应的素材,我会加入到游戏里,并且会发一个博客

坦克大战开发了一个星期完成了,比起坦克大战,魂斗罗写了大概一个半月了,其实可以很早可以完成,博主之前在准备考研复试,比较忙,这段时间算是没什么事情了,想着不能半途而废,把魂斗罗完成一下。

最后感谢各位小伙伴的学习和支持。

整体代码和素材我都会放到网盘,需要的小伙伴可以自己去拿哦。文章来源地址https://www.toymoban.com/news/detail-445675.html

到了这里,关于学习 Python 之 Pygame 开发魂斗罗(十六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么魂斗罗只有 128KB 却可以实现那么长的剧情

      A :为什么你用 128KB 能实现这么多画面、音乐、动画? B : 128KB 还不够么?其实为了表现力已经相当奢侈了,加了很多不重要的细节。 A :就说你们的音乐,这个音乐,我压到最低码率的 mp3 ,也得至少 1MB 吧。 B :你怎么压的?一首背景音乐怎么可能超过 1KB 。 A :那你实

    2024年02月07日
    浏览(46)
  • 学习 Python 之 Pygame 开发坦克大战(二)

    坦克大战游戏包含很多个物体,现在要对这些物体进行总结 类名 包含的操作 包含的属性 敌方坦克类 射击,移动,显示 生命,速度,伤害,方向,类型 我方坦克类 射击,移动,显示 生命,速度,伤害,方向,装甲,等级 子弹类 移动,显示 方向,伤害,发射源,速度 墙壁

    2024年02月02日
    浏览(52)
  • 学习 Python 之 Pygame 开发坦克大战(一)

    Pygame是一组Python用于编写视频游戏的模块。Pygame在优秀的SDL库上添加了功能。可以让我们使用python语言创建功能齐全的游戏和多媒体程序,并且Pygame是高度可移植的,几乎可以在所有平台和操作系统上运行。 官方文档 函数名称 作用 返回值 pygame.display.init() 初始化展示模块

    2024年02月02日
    浏览(49)
  • python | 基础学习(六)pygame游戏开发:飞机大战

    pygame 模块,转为电子游戏设计 $ sudo pip3 install pygame windows: pip install pygame (1)新建项目 飞机大战 (2)新建文件 pygame.py (3)建立游戏窗口: ①pygame的初始化和退出 pygame.init() :导入并初始化所有pygame模块,使用其他模块之前,必须先调用init方法。 pygame.quit() :卸载所有

    2024年02月08日
    浏览(56)
  • Python 游戏开发与 Pygame

    第一章. Python 简介 Python 简介和历史 Python 特点和优势 安装 Python 第二章. 变量和数据类型 变量和标识符 基本数据类型:数字、字符串、布尔值等 字符串操作 列表、元组和字典 第三章. 控制语句和函数 分支结构:if/else 语句 循环结构:for 和 while 循环 函数 参数传递与返回值

    2024年04月17日
    浏览(51)
  • Python学习笔记-Pygame

    目录 一、Pygame概述 1.安装Pyganme 2.Pygame常用模块介绍 2.1 display模块常用方法 2.2 pygame.event模块常用方法 2.3 Surface对象的常用方法 二、问题汇总 1.窗体问题 1.1 添加死循环之后出现窗体未响应。 记述关于Pyganme开发的基本知识。 Pygame是跨平台的python模块,转为电子游戏设计(包含

    2024年02月09日
    浏览(101)
  • 【python】之pygame模块,游戏开发【基础篇】

    什么是pygame? Pygame 是一个专门用来开发游戏的 Python 模块,主要为开发、设计 2D 电子游戏而生,具有免费、开源,支持多种操作系统,具有良好的跨平台性等优点。它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等

    2024年02月08日
    浏览(59)
  • Python -- 利用pygame库进行游戏开发基础

            Pygame是一个基于Python的游戏开发库,它提供了一系列的工具和接口,使开发人员能够轻松地创建各种类型的游戏,包括2D游戏和简单的3D游戏,主要是为了开发2D游戏而生。具有免费、开源,支持多种操作系统,具有良好的跨平台性等优点。 在开始学习Pygame之前,您

    2024年01月22日
    浏览(60)
  • Python Pygame游戏开发教程正式发布(非常详细)

    Pygame 是一款专门为开发和设计 2D 电子游戏而生的、免费开源的 Python 软件包/模块,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性 Pygame 在 SDL 的基础上开发而成,它提供了诸多操作模块,比如图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏

    2024年04月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包