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. Vue.js 快速入门

    什么是Vue.js vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API.作者是尤雨溪,写下这篇文章时vue.js版本为1.0.7 准备 我推荐 ...

  2. while 与do ..while区别

    package com.chongrui.test;/*while语句的一般形式如下:while(表达式)语句表达式为非0值,执行while中内嵌语句.它是先判断表达式,在根据表达式值,执行语句.do ...

  3. iOS打包测试

    iOS开发中,怎么打包为ipa格式的软件包以及怎么安装到手机终端上. (我的开发环境为Xcode6.1.1 )作为个人开发者(当然我的开发者帐号为个人开发者帐号,而不是企业开发者帐号),对于自己来说, ...

  4. 实现移动设备远程登录linux服务器

    明天下午要考试了.所以最近时间有点紧,都在忙着看矩阵课本,刷刷题. 回到我们博客题目内容,最近正在看linux,之前是通过在笔记本上装着虚拟机的方法来进行操作. 之后发现一些能够进一步改进的地方,首先 ...

  5. 搭建LAMP环境注意事项

    一:安装mysql 5.5以上版本需要使用cmake 和 bison 并且需要安装ncurses 在安装MySQL完毕之后,需要覆盖 掉 /etc/my.cnf centos默认会有一个my.cnf文 ...

  6. 【DWR系列01】-DWR简介及入门例子

    .literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...

  7. 虚拟机主机能互相ping通,但是无法远程连接

    首先将虚拟机关机,找到Edit virtual machine Settings(编辑虚拟机设置)

  8. 加密狗的管理层API(C#代码)

    using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...

  9. Go语言 字符串处理

    LastIndex - 查询字符串最后出现的位置 原型:func strings.LastIndex(s string, sep string) int

  10. xpath定位实战(1)

    1.执行scrapy shell "https://book.douban.com/subject/2256039/"