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的更多相关文章

  1. 游戏设计模式:Subclass Sandbox模式,以及功能方法集的设计思考

    书中总结出这种 Subclass Sandbox 的设计模式 Game Design Patterns: Subclass Sandbox 这种模式要点有两点: 在基类中实现各种功能性方法供子类调用 ...

  2. 游戏编程技巧 - Type Object

    Type Object 使用场景 你在制作一款和LOL类似的游戏,里面有许多英雄,因此你想建立一个英雄基类,然后把各种英雄都继承自该基类,这些英雄类都有生命值和攻击力等属性.每次策划想增加一个英雄,你 ...

  3. 《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记

    1.DirectDraw 这可能是Directx中最重要的技术,由于它是2D图形赖以实现的渠道.也是Direct3D构建于其上的帧缓冲层. 2.DirectDraw是由非常多借口组成的.共同拥有5个接 ...

  4. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  5. 3D游戏编程大师技巧──环境搭建

    刚开微博,想借助这个平台与大家交流,写下自己的学习记录,希望得到大家的批评指正. 好了,进入主题.这段时间对游戏编程很感兴趣,于是在网友的推荐下开始学习<3D游戏编程大师技巧>这本书.今天 ...

  6. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  7. [libgdx游戏开发教程]使用Libgdx进行游戏开发(11)-高级编程技巧 Box2d和Shader

    高级编程技巧只是相对的,其实主要是讲物理模拟和着色器程序的使用. 本章主要讲解利用Box2D并用它来实现萝卜雨,然后是使用单色着色器shader让画面呈现单色状态:http://files.cnblo ...

  8. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  9. 无插件Vim编程技巧

    无插件Vim编程技巧 http://bbs.byr.cn/#!article/buptAUTA/59钻风 2014-03-24 09:43:46 发表于:vim  相信大家看过<简明Vim教程& ...

随机推荐

  1. 3ds max 渲染模型

    有的模型因为法线方向问题,渲染的时候有的面缺失,只需要强制双面,如下图,就能把所有的面都渲染出来.

  2. Web应用性能优化思路

    瓶颈是什么? 一条4车道的公路,运行非常顺畅,突然出了点事故,事故车导致某个地方只剩下1车道,然后就开始堵车,因为四辆车同时塞向一个车道里.把这个事故清除了,故障车拖走了,道路会开始恢复了通畅. 这个 ...

  3. PHP面试总结

    从8月15号来到北京一直到今天,一月有余.来的这段时间一直准备笔试面试,大大小小的公司,乱七八糟面了10多家,近期才安顿下来.面试的这段时间感觉自己成长了不少.初来到这个陌生的城市一脸茫然,不会乘地铁 ...

  4. 剑指Offer-【面试题07:两个栈实现队列】

    package com.cxz.question7; import java.util.Stack; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail 和del ...

  5. 使用Solr索引MySQL数据

    环境搭建 1.到apache下载solr,地址:http://mirrors.hust.edu.cn/apache/lucene/solr/ 2.解压到某个目录 3.cd into D:\Solr\s ...

  6. 实时控制软件设计作业_01——汽车ABS系统分析

    制动防抱死系统(antilock brake system)简称ABS.作用就是在汽车制动时,自动控制制动器制动力的大小,使车轮不被抱死,处于边滚边滑(滑移率在20%左右)的状态,以保证车轮与地面的附 ...

  7. yii2的分页和ajax分页

    要想使用Yii分页类第一步:在控制器层加载分页类 use yii\data\Pagination;第二步: 使用model层查询数据,并用分分页,限制每页的显示条数$data = User::find ...

  8. Tray - a SharedPreferences replacement for Android

    一个代替SharedPreferences的开源库, no Editor, no commit() no apply(),因此不存在UI卡顿现象,并且支持多线程,在一个线程中存另一个线程中取数据. h ...

  9. 毕业论文中使用的技术—FileReader接口

    用来把文件读入内存,并且读取文件中的数据. FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据 FileReader接口的方法 方法名 参 ...

  10. orcal 操作

    清空表数据(不清除表结构): truncate table 表名