当前位置: 首页 > article >正文

从零开发游戏需要学习的c#模块,第二十二章(音效与背景音乐)

本节课学习目标加载并播放背景音乐循环收集金币时播放音效碰到敌人时播放音效用 MonoGame 内置音频系统实现第一步准备音频文件去这些网站下载免费音效freesound.orgopengameart.orgmixkit.co需要三个文件文件用途coin.wav吃金币音效hit.wav碰敌人音效bgm.wav或bgm.mp3背景音乐MonoGame 支持的格式.wav、.mp3、.ogg下载后放到Content文件夹属性设为“如果较新则复制”。第二步完整代码把Game1.cs完整替换为using Microsoft.Xna.Framework;using Microsoft.Xna.Framework.Graphics;using Microsoft.Xna.Framework.Input;using Microsoft.Xna.Framework.Audio;using Microsoft.Xna.Framework.Media;using System;using System.Collections.Generic;using System.IO;using FontStashSharp;namespace MY_FIRST_GAME{public enum GameState { Exploring, Battling }public class Game1 : Game{private GraphicsDeviceManager _graphics;private SpriteBatch _spriteBatch;private Player player default!;private Texture2D playerSpriteSheet;private Texture2D coinTexture;private ListVector2 coins;private Random rng;private int score;private Texture2D enemyTexture;private ListVector2 enemies;private SpriteFontBase font;private GameState state GameState.Exploring;// ★ 音频private SoundEffect coinSound default!;private SoundEffect hitSound default!;private Song bgm default!;public Game1(){_graphics new GraphicsDeviceManager(this);Content.RootDirectory Content;IsMouseVisible true;// ★ 背景音乐必须通过 MGCB Editor 加载// 如果 MGCB 不能用这里会跳过音乐加载}protected override void Initialize(){_graphics.PreferredBackBufferWidth 800;_graphics.PreferredBackBufferHeight 600;_graphics.ApplyChanges();rng new Random();coins new ListVector2();enemies new ListVector2();score 0;SpawnCoins(5);SpawnEnemies(3);base.Initialize();}protected override void LoadContent(){_spriteBatch new SpriteBatch(GraphicsDevice);// 玩家图集using var stream File.OpenRead(Content/player_spritesheet.png);playerSpriteSheet Texture2D.FromStream(GraphicsDevice, stream);player new Player(playerSpriteSheet, new Vector2(400, 300));// 金币coinTexture new Texture2D(GraphicsDevice, 24, 24);Color[] coinData new Color[24 * 24];for (int i 0; i coinData.Length; i) coinData[i] Color.Gold;coinTexture.SetData(coinData);// 敌人enemyTexture new Texture2D(GraphicsDevice, 40, 40);Color[] enemyData new Color[40 * 40];for (int i 0; i enemyData.Length; i) enemyData[i] Color.Red;enemyTexture.SetData(enemyData);// 字体var fontSystem new FontSystem();fontSystem.AddFont(File.ReadAllBytes(Content/consola.ttf));font fontSystem.GetFont(18);// ★ 加载音效SoundEffect 可以用 FileStream 直接读try{using var coinStream File.OpenRead(Content/coin.wav);coinSound SoundEffect.FromStream(coinStream);using var hitStream File.OpenRead(Content/hit.wav);hitSound SoundEffect.FromStream(hitStream);// 背景音乐MediaPlayer 需要 MGCB 编译直接读文件不支持// 暂时用音效替代把 bgm 循环播放}catch (Exception ex){System.Diagnostics.Debug.WriteLine(音效加载失败 ex.Message);}}// ★ 开始播放背景音乐在 Initialize 之后调用protected override void BeginRun(){base.BeginRun();// 尝试播放背景音乐音效作为临时方案try{// 如果你的 bgm 是 mp3/wav可以用 SoundEffect 播放using var bgmStream File.OpenRead(Content/bgm.wav);var bgmSound SoundEffect.FromStream(bgmStream);SoundEffectInstance bgmInstance bgmSound.CreateInstance();bgmInstance.IsLooped true;bgmInstance.Volume 0.3f; // 音量 30%bgmInstance.Play();}catch{// 没有音乐文件就跳过}}private void SpawnCoins(int count){for (int i 0; i count; i)coins.Add(new Vector2(rng.Next(50, 750), rng.Next(50, 550)));}private void SpawnEnemies(int count){for (int i 0; i count; i)enemies.Add(new Vector2(rng.Next(80, 720), rng.Next(80, 520)));}protected override void Update(GameTime gameTime){float deltaTime (float)gameTime.ElapsedGameTime.TotalSeconds;KeyboardState keyboard Keyboard.GetState();if (state GameState.Exploring){player.Update(deltaTime);CheckCoinCollision();CheckEnemyCollision();if (coins.Count 0) SpawnCoins(5);if (enemies.Count 0) SpawnEnemies(3);}if (keyboard.IsKeyDown(Keys.M)){// ★ 按 M 静音/取消静音MediaPlayer.IsMuted !MediaPlayer.IsMuted;SoundEffect.MasterVolume SoundEffect.MasterVolume 0 ? 0f : 1f;}if (keyboard.IsKeyDown(Keys.Escape)) Exit();base.Update(gameTime);}private void CheckCoinCollision(){Rectangle playerRect player.GetBounds();for (int i coins.Count - 1; i 0; i--){Rectangle coinRect new Rectangle((int)coins[i].X, (int)coins[i].Y, 24, 24);if (playerRect.Intersects(coinRect)){coins.RemoveAt(i);score 10;// ★ 播放吃金币音效try { coinSound?.Play(); }catch { }}}}private void CheckEnemyCollision(){Rectangle playerRect player.GetBounds();for (int i enemies.Count - 1; i 0; i--){Rectangle enemyRect new Rectangle((int)enemies[i].X - 20, (int)enemies[i].Y - 20, 40, 40);if (playerRect.Intersects(enemyRect)){enemies.RemoveAt(i);score 50;// ★ 播放碰敌人音效try { hitSound?.Play(); }catch { }}}}protected override void Draw(GameTime gameTime){GraphicsDevice.Clear(Color.CornflowerBlue);_spriteBatch.Begin();foreach (Vector2 coinPos in coins)_spriteBatch.Draw(coinTexture, coinPos, Color.White);foreach (Vector2 enemyPos in enemies)_spriteBatch.Draw(enemyTexture, enemyPos, null, Color.White,0f, new Vector2(20, 20), 1f, SpriteEffects.None, 0f);player.Draw(_spriteBatch);_spriteBatch.DrawString(font, $分数{score}, new Vector2(10, 10), Color.White);_spriteBatch.DrawString(font, $金币{coins.Count}, new Vector2(10, 35), Color.Gold);_spriteBatch.DrawString(font, $敌人{enemies.Count}, new Vector2(10, 60), Color.Red);_spriteBatch.DrawString(font, $HP{player.Hp}/{player.MaxHp}, new Vector2(10, 85), Color.LimeGreen);_spriteBatch.DrawString(font, WASD移动 | M静音 | ESC退出, new Vector2(10, 570), Color.LightGray);_spriteBatch.End();base.Draw(gameTime);}}}本节课新内容using var stream File.OpenRead(Content/coin.wav); coinSound SoundEffect.FromStream(stream); coinSound.Play(); // 播放一次SoundEffectInstance bgmInstance bgmSound.CreateInstance(); bgmInstance.IsLooped true; // 循环播放 bgmInstance.Volume 0.3f; // 音量 bgmInstance.Play();SoundEffect.MasterVolume 0f; // 所有音效静音 SoundEffect.MasterVolume 1f; // 恢复本节课到此结束我叫魔法阵维护师关注我下期更精彩

相关文章:

从零开发游戏需要学习的c#模块,第二十二章(音效与背景音乐)

本节课学习目标 加载并播放背景音乐(循环) 收集金币时播放音效 碰到敌人时播放音效 用 MonoGame 内置音频系统实现 第一步:准备音频文件 去这些网站下载免费音效: freesound.org opengameart.org mixkit.co 需要三个文件…...

TranslucentTB:Windows任务栏透明化终极解决方案与高级配置指南

TranslucentTB:Windows任务栏透明化终极解决方案与高级配置指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentT…...

解锁AMD Ryzen隐藏性能:一款开源调试工具如何让你成为硬件调优高手

解锁AMD Ryzen隐藏性能:一款开源调试工具如何让你成为硬件调优高手 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

BetterGI原神自动化工具:5分钟快速上手指南,解放你的游戏时间

BetterGI原神自动化工具:5分钟快速上手指南,解放你的游戏时间 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条…...

OpenAI大神教你如何榨干Codex

闻乐 发自 凹非寺量子位 | 公众号 QbitAI新晋员工确实毫无保留。Jason Liu,13k星开源库Instructor的作者,刚被OpenAI招进Codex团队没多久,不仅在社交平台大方发API额度;还写了篇Codex-maxxing,把自己的Codex玩法全抖出…...

arXiv开始拒收综述,CS新人发论文得找人背书

一水 发自 凹非寺量子位 | 公众号 QbitAI坏了!在arXiv发综述的门,已经被关上了。arXiv接收门槛收紧后,最新受害者已急哭:arXiv的审核越来越严格了。综述论文已经不再被允许发表了,计算机科学领域彻底完蛋了&#xff0c…...

DeepSeek V4价格打骨折,宁王京东网易抢着入场,梁文锋:目标是AGI

听雨 发自 凹非寺量子位 | 公众号 QbitAI同一天,DeepSeek又发生两件大事。一边,DeepSeek-V4-Pro API宣布永久降价。从 6月1日起,V4 Pro的API价格将正式调整为当前促销价,不再恢复原价。另一边,The Information爆料&…...

刚刚,马斯克第三代星舰首飞成功!

克雷西 发自 凹非寺量子位 | 公众号 QbitAI刚刚,马斯克的第十二次星舰试验,也是第三代星舰的首次飞行,顺利完成!当地时间昨天下午5点30分(北京时间今早6点30分),33台猛禽3发动机同时点火&#x…...

Steam创意工坊模组下载终极指南:WorkshopDL跨平台模组自由教程

Steam创意工坊模组下载终极指南:WorkshopDL跨平台模组自由教程 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台上的游戏无法使用Steam创意…...

VMware Workstation Pro 17免费许可证密钥完整指南:快速激活专业虚拟化工具

VMware Workstation Pro 17免费许可证密钥完整指南:快速激活专业虚拟化工具 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major …...

HAR模型调优实战:为何精心调优的线性模型能击败复杂机器学习?

1. 项目概述:当HAR模型遇上机器学习,一场关于“调优”的较量在金融计量和量化交易领域,预测明天的市场波动率,就像试图预测一场风暴的强度,充满了挑战但也至关重要。无论是为了给衍生品定价、管理投资组合风险&#xf…...

算法公平性评估:如何用自洽性与方差分析区分真实偏见与随机噪声

1. 项目概述:为什么我们需要关注算法评估中的“噪声”?在算法公平性研究领域,我们常常看到这样的结论:“模型在A群体上的误报率(FPR)比B群体高X个百分点,因此存在不公平。” 然而,作…...

模型不确定性下的公平性评估:自一致性指标与集成弃权策略

1. 项目概述:当公平性评估遭遇模型不确定性在机器学习,尤其是公平性评估这个领域,我们常常会陷入一种“确定性幻觉”。我们训练一个模型,在某个测试集上计算其误判率、假阳性率、假阴性率,然后得出一个结论&#xff1a…...

如何快速提升电脑性能:5个终极系统调优技巧指南

如何快速提升电脑性能:5个终极系统调优技巧指南 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 你是否遇到过这样的…...

魔兽争霸3终极优化指南:5分钟解决画面拉伸、帧率限制与中文兼容问题

魔兽争霸3终极优化指南:5分钟解决画面拉伸、帧率限制与中文兼容问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争…...

实战揭秘:3步解锁你的微信聊天记忆宝库

实战揭秘:3步解锁你的微信聊天记忆宝库 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因为手机丢失或更换设备,眼睁睁看着珍贵的微信聊天记录消失无踪?那些承…...

BabelDOC:解决学术文档翻译三大痛点的智能PDF翻译工具

BabelDOC:解决学术文档翻译三大痛点的智能PDF翻译工具 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 你是否曾经面对一份重要的英文科研论文,需要快速理解却苦于语言障…...

RAG:终结AI“一本正经胡说八道”,让AI回答问题不再答非所问!

本文用通俗易懂的方式解释了RAG技术,即“检索增强生成”,它通过为AI构建专属知识库,在回答问题时先检索相关信息再生成答案,有效解决AI“答非所问”和“幻觉”问题。文章详细介绍了RAG的工作原理、核心价值及实用场景,…...

Anthropic为何如此反华

美国政客对中国进行科技封锁,本不是什么新闻。但一个商业公司宁可损失上亿美元的收入也要禁止中国人访问他们的AI就有点魔症了。我们不禁要问:为什么我们现在看到Anthropic的CEO Dario Amodei在所有场合都持强硬的反华立场,不免感觉有些奇怪。…...

终极指南:如何用OpenCore Legacy Patcher让旧Mac焕发新生,完美运行最新macOS

终极指南:如何用OpenCore Legacy Patcher让旧Mac焕发新生,完美运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否拥…...

ncmdump终极指南:3分钟学会网易云音乐NCM格式免费解密

ncmdump终极指南:3分钟学会网易云音乐NCM格式免费解密 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经下载了网易云音乐的歌曲,却发现它们都是无法在其他播放器打开的NCM格式?别担心&am…...

BabelDOC终极指南:如何完美保留PDF格式的专业文档翻译工具

BabelDOC终极指南:如何完美保留PDF格式的专业文档翻译工具 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 你是否曾为翻译PDF文档而烦恼?格式错乱、公式变形、排版混乱—…...

Thorium浏览器:基于Chromium的终极性能优化与隐私保护深度解析

Thorium浏览器:基于Chromium的终极性能优化与隐私保护深度解析 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Source code and Linux releases. Windows/MacOS/ARM builds served in different repos, links are towards the to…...

5分钟快速上手:AMD Ryzen处理器硬件调试完整指南

5分钟快速上手:AMD Ryzen处理器硬件调试完整指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode…...

机器学习赋能心电图分析:探索神经认知障碍的早期筛查新路径

1. 项目概述:当心电图遇见机器学习,为大脑健康“把脉”作为一名长期关注医疗AI交叉应用的从业者,我常常思考一个问题:我们能否从那些看似常规、无处不在的临床检查中,挖掘出超越其传统用途的深层价值?心电图…...

量子机器学习可解释性:从经典XAI到XQML的挑战与创新方法

1. 项目概述:当量子机器学习遇上“黑盒”挑战作为一名长期关注前沿技术交叉领域的从业者,我最近花了大量时间研究一个既烧脑又极具潜力的方向:如何让量子机器学习(QML)模型变得“透明”。我们都知道,经典深…...

高斯混合期望传播算法:突破高阶MIMO检测性能瓶颈

1. 项目概述与核心挑战在无线通信系统的演进中,多输入多输出(MIMO)技术早已不是新鲜概念,它通过部署多根天线,在相同的频带内同时传输多个独立的数据流,从而成倍地提升了频谱效率和系统容量。然而&#xff…...

贝叶斯分层建模与机器学习插补:应对经济数据稀疏性的稳健分析框架

1. 项目概述:当数据稀缺成为常态,我们如何看清经济转型的脉络?在低收入和中等收入国家(LMICs)从事经济研究或政策分析,最常遇到的困境不是模型不够先进,而是数据“不够用”。你手头的数据集可能…...

ICA与NMF算法详解:从盲源分离到矩阵分解的数学原理与工程实践

1. 项目概述:从数据噪音中“听”出独立的声音在信号处理、神经科学、金融数据分析等领域,我们常常会遇到一个经典的“鸡尾酒会问题”:在一个嘈杂的房间里,多个声源(比如不同人的谈话、背景音乐)的声音混合在…...

高基数分类变量编码实战:均值、低秩与多项式逻辑回归方法解析

1. 项目概述:高基数分类变量的编码困局与破局思路在数据科学和机器学习的日常建模工作中,分类变量(Categorical Variables)的处理是绕不开的一环。从用户ID、邮政编码到产品SKU,这些变量往往携带了丰富的信息&#xff…...