游戏编程技巧 - Subclass Sandbox
Subclass Sandbox
使用场景
你正在开发一款类似LOL的游戏,里面有许多英雄角色,你决定把这些英雄类交给小弟们实现。因为在这些英雄中,释放放技能时,有的要使用粒子系统造成炫酷的效果,有的要播放音效来震慑对手,有的要使用物理引擎来进行仿真,因此这些英雄类需要与系统的其他部分交互。之后,你在开发时,发现音频系统中部分全局参数被改掉了,物理引擎里也一样,终于你发现是小弟们的英雄类改了这些系统的参数/状态。为了系统能安全地运行,你决定使用sandbox技术来限制小弟们能进行的操作。
描述
父类定义abstract的sandbox方法,并提供部分操作方法,(以上方法均是protected),子类利用父类提供的操作方法去实现sandbox方法。
代码例子(C#)
//英雄基类
public abstract class BaseHero
{
protected abstract void ReleaseSkill();
protected void PlaySound(int soundId) {}
protected void PlayPhysics(int physicsId) {}
protected void PlayEffect(int effectId) {}
}
//英雄-剑圣
public class Blademaster : BaseHero
{
private const int SOUND_ID = 1;
private const int EFFECT_ID = 3;
protected override void ReleaseSkill()
{
PlaySound(SOUND_ID);
PlayEffect(EFFECT_ID);
//other code
}
}
在这里,英雄类剑圣在实现释放技能的方法时,只需要调用父类中的PlaySound和PlayEffect方法,而自己不需要去操作其他模块。
优点
- 子类不需要经常与其他系统模块交互,保证了系统的稳定
- 子类的实现变得简单,因为大多数需要的操作都可以在父类中找到
缺点
- 导致fragile base class问题,因为子类太依赖父类了
- 父类需要与其他模块交互
- 父类变得庞大而复杂
fragile base class 问题
当父类进行修改时,你不能确定子类会不会出故障
设计决策
1.父类应该提供什么操作
- 如果某操作只有小部分子类受益,则该操作父类可以不提供
- 如果某操作影响广泛,交给子类直接操作是不安全的,则父类封装并提供该操作
2.什么时候把操作交给具体类来处理
如果父类已经很庞大,可以将某些操作交给具体的类来管理,父类只需要返回该类
- 比如音频管理器、UI管理器等
- 降低了父类和其他系统模块的耦合度:当系统其他部分变化了的时候,只有该管理类需要变化,父类不需要进行改变
参考
游戏编程技巧 - Subclass Sandbox的更多相关文章
- 游戏设计模式:Subclass Sandbox模式,以及功能方法集的设计思考
书中总结出这种 Subclass Sandbox 的设计模式 Game Design Patterns: Subclass Sandbox 这种模式要点有两点: 在基类中实现各种功能性方法供子类调用 ...
- 游戏编程技巧 - Type Object
Type Object 使用场景 你在制作一款和LOL类似的游戏,里面有许多英雄,因此你想建立一个英雄基类,然后把各种英雄都继承自该基类,这些英雄类都有生命值和攻击力等属性.每次策划想增加一个英雄,你 ...
- 《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记
1.DirectDraw 这可能是Directx中最重要的技术,由于它是2D图形赖以实现的渠道.也是Direct3D构建于其上的帧缓冲层. 2.DirectDraw是由非常多借口组成的.共同拥有5个接 ...
- 3D游戏编程大师技巧──2D引擎的编译问题
接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...
- 3D游戏编程大师技巧──环境搭建
刚开微博,想借助这个平台与大家交流,写下自己的学习记录,希望得到大家的批评指正. 好了,进入主题.这段时间对游戏编程很感兴趣,于是在网友的推荐下开始学习<3D游戏编程大师技巧>这本书.今天 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader
高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
- 无插件Vim编程技巧
无插件Vim编程技巧 http://bbs.byr.cn/#!article/buptAUTA/59钻风 2014-03-24 09:43:46 发表于:vim 相信大家看过<简明Vim教程& ...
随机推荐
- JavaScript 学习笔记——cssText
平常编写代码,更改一个元素样式的时候,自己都是用 obj.style.width = "200px"; obj.style.position = "absolute&qu ...
- squid 2.7 通过域名反向代理多个服务器的配置方法
详细配置及注释如下,供大家学习参考. visible_hostname squid1.abc.com #设定squid的主机名,如无此项squid将无法启动 http_port 80 accel vh ...
- Redis五种数据类型命令介绍(4)
1.string类型命令 设置值:set id 001 获取值:get id 删除键值:del id 验证键是否存在:exists id 显示所有的key:keys * incr .incrby指 ...
- python学习笔记(4)--函数
1.函数 函数是指将一组语句的集合通过一个名字封装起来.要想执行这个函数,只需调用其函数名即可. 函数的特性: 1.减少重复代码 2.使程序变的课扩展 3.使程序变得易维护 语法定义: def pri ...
- 【Java EE 学习 70 下】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】
一.Action中User注入问题 Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐.可以想一种方法,当Action想要获取User对象的时候直接使用, ...
- [转]序列化悍将Protobuf-Net,入门动手实录
最近在研究web api 2,看了一篇文章,讲解如何提升性能的, 在序列化速度的跑分中,Protobuf一骑绝尘,序列化速度快,性能强,体积小,所以打算了解下这个利器 1:安装篇 谷歌官方没有提供.n ...
- Redis 数据库入门指南
Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库.缓存和消息代理使用.Redis 支持丰富的数据结构,有:字符串(Strings).哈希(Hashs).列表(Lists).集合(Se ...
- HBase JavaAPI操作示例
package testHBase; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBase ...
- Python爬虫学习(7):浙大软院网号嗅探
软院这边网速是挺不错的,而且在宿舍和实验室都是可以通过学号直接登陆的上网的,但是..有的时候实验室的台式机需要一个网号,笔记本需要一个网号,或者再加上一个路由器需要一个,然后,感觉网号托托的不够呀.刚 ...
- 可变参数列表与printf()函数的实现
问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...