MMORPG大型游戏设计与开发(客户端架构 part11 of vegine)
从早年的无声电影到现在的逼真3D大片,人类在科技上可谓是一再突破。不知道有没有人经历过那无声的日子,没有声音的世界,咱们的耳朵也就失去了它本有的用途了。在游戏世界中,声音元素成了必不可少的一部分,一个没有声音的游戏现在可谓是太少见了,而且存活下来的希望自然不高。当前在游戏中,特别是3D游戏中,声音分为3D音效和平面音效。3D音效中主要是指环境音效,比如说某个地方的流水发出的声音,某片树林里充满的鸟叫声。平面音效即咱们感官的普通音效,背景音乐,自身的技能、UI声音。
CODE
模块sound 文件buffer.h -- 声音资源缓存
/**
* PAP Engine ( -- )
* $Id buffer.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-19 20:14:03
* @uses vengine sound buffer class
*/
#ifndef VENGINE_SOUND_BUFFER_H_
#define VENGINE_SOUND_BUFFER_H_ #include "vengine/config.h" namespace vengine_sound { class VENGINE_API Buffer { public:
virtual bool read_wavbuffer(const STRING& name) = ; //从文件中读取buffer
virtual void release() = ; //释放
virtual int32_t get_reference() const = ; //获得引用资源 }; }; //namespace vengine_sound #endif //VENGINE_SOUND_BUFFER_H_
模块sound 文件source.h --声音资源类
/**
* PAP Engine ( -- )
* $Id source.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-20 11:41:14
* @uses vengine sound source class
*/
#ifndef VENGINE_SOUND_SOURCE_H_
#define VENGINE_SOUND_SOURCE_H_ #include "vengine/config.h"
#include "vengine/sound/buffer.h"
#include "vengine/math/base.h" namespace vengine_sound { class VENGINE_API Source { public:
typedef enum {
kTypeBackground, //背景音乐
kTypeSkill, //技能
kTypeEnvironment, //环境音乐
kTypeUI //UI特效
} type_enum; public:
virtual int32_t getid() const = ;
//播放中不立即生效,需要stop后重新play
virtual void setbuffer(Buffer* buffer) = ;
virtual Buffer* getbuffer() = ;
//循环播放
virtual void setlooping(bool flag) = ;
virtual bool islooping() const = ;
virtual void play() = ;
virtual void stop() = ;
virtual bool isplaying() const = ;
virtual bool isstoped() const = ;
virtual void setposition(
const vengine_math::base::threefloat_vector_t& position) = ;
virtual const vengine_math::base::threefloat_vector_t& getposition() = ;
virtual void updatevolume() = ;
}; }; //namespace vengine_sound #endif //VENGINE_SOUND_SOURCE_H_
模块sound 文件system.h
/**
* PAP Engine ( -- )
* $Id system.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-20 15:03:13
* @uses vengine sound system module
*/
#ifndef VENGINE_SOUND_SYSTEM_H_
#define VENGINE_SOUND_SYSTEM_H_ #include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/sound/buffer.h"
#include "vengine/sound/source.h" namespace vengine_sound { //外提供的声音播放接口,返回声音源HANDLE
typedef int32_t (__stdcall* function_play)
(const char* soundfile, float* position, bool loop);
//外提供声音的停止接口
typedef void (__stdcall* function_stop)(int32_t id); class VENGINE_API System : public vengine_kernel::Node { VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_sound_System); public:
virtual Buffer* createbuffer(int32_t id) = ; //创建一个声音资源
virtual Buffer* createbuffer(const char* filename) = ; //创建一个声音资源
//创建/删除播放源
//3D模式 - 音量会随着位置变化
//自动删除模式 - 只播放一遍,然后自动释放
virtual Source* createsource(Source::type_enum type,
bool is3d,
bool autodestroy) = ;
virtual Source* createsource(Source::type_enum type,
bool is3d,
bool autodestroy,
Source** reference) = ;
virtual void destroysource(Source* source) = ;
virtual void destroysource(int32_t id) = ;
virtual void play_UIsound(int32_t id) = ; //收听者
virtual void set_listenerposition(
vengine_math::base::threefloat_vector_t& position) = ;
virtual vengine_math::base::threefloat_vector_t&
get_listenerposition() = ; virtual function_play get_playfunction() = ;
virtual function_stop get_stopfunction() = ; }; }; //namespace vengine_sound #endif //VENGINE_SOUND_SYSTEM_H_
SIMPLE
看看天龙八部里面有哪些声音配置

总结
本次设计中用到的模式与武侠世界/天龙八部的声音模块相似的配置,依赖于声音库fmod,大家可以去了解一下该库的用法,如果对代码中不明白的接口,欢迎提出问题。由于时间关系,现阶段我就不逐条解释了。下节讲的是资源和输入模块,虽然是两个模块,但是比较小。
MMORPG大型游戏设计与开发(客户端架构 part11 of vegine)的更多相关文章
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)
在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...
- MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)
这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...
- MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)
由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...
- MMORPG大型游戏设计与开发(客户端架构 part9 of vegine)
时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的 ...
- MMORPG大型游戏设计与开发(客户端架构)
首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...
随机推荐
- 已解决:Ubuntu php gettext 无效
使用gettext做多文字国际化,按PHP官方文档,在CentOS上OK,在Ubuntu上不行,调试了快1天,试了网上提供的无数方法,终于有一个OK了…… 看到此文的同学别再被坑了…… 感谢:http ...
- jQuery仿京东无限级菜单HoverTree
官方网址:http://keleyi.com/jq/hovertree/ 效果图: 看了上面效果图,你或许已经明白为什么是仿京东菜单.如果还不明白,请访问http://list.jd.com/list ...
- php获取数组第一个值 current()
获取数组第一个元素的值,如果是数字索引那还好,直接$array[0],如果键名是字符串,你又未知这个字符串呢?用current()函数就可以做到. current() 函数返回数组中的当前元素(单元) ...
- 调用MyFocus库,简单实现二十几种轮播效果
一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要 ...
- SDWebImage 加载网络图片失败,重新运行,就能加载成功。
现象: 使用SDWebImage 加载网络图片,偶尔会有一两张图片就是显示不出来.重新运行有时又可以了. 这个问题的原因是: 当SDWebImage 在加载图片的时候 我用的是- (void)sd_s ...
- 如何:对 SharePoint 列表项隐藏 ECB 中的菜单项
可以通过使用功能框架向编辑控制块 (ECB) 菜单添加新的自定义操作.但是,您不能使用此方法进行相反的操作,即隐藏现有的 ECB 菜单项,因为它们是通过使用 ECMAScript(JavaScript ...
- myeclipse 2015 CI 16发布【附下载】
2015升级版再次来袭! 更新日志: Slack Integration 新版本集成了Slack,你只需要注册一个Slack帐号然后就可以发送和接收代码片段.你甚至不需要登录Slack就可以直接在Ec ...
- VMware: XXX is still busy. Please wait until the operation is complete before closing
在使用vmware的过程中发现创建快照.恢复快照.管理快照等功能突然都变成灰色的,用不了.更觉得夸张的是仅仅剩下关闭虚机按钮是红色的.心想估计是虚机快照没处理完之类的问题导致的,于是想想关闭虚机重 ...
- 图形学理论知识 BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function)
图形学理论知识 BRDF 双向反射分布函数 Bidirectional Reflectance Distribution Function BRDF理论 BRDF表示的是双向反射分布函数(Bidire ...
- leetcode 第188题,我的解法,Best Time to Buy and Sell Stock IV
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...