Type Object

使用场景

你在制作一款和LOL类似的游戏,里面有许多英雄,因此你想建立一个英雄基类,然后把各种英雄都继承自该基类,这些英雄类都有生命值和攻击力等属性。每次策划想增加一个英雄,你都要设计一个新英雄类。到后来,已经有几百个英雄,而这些英雄类的结构都一样,只是里面的属性值不同,很明显代码设计出问题了。
类图如下:

代码如下:

public abstract class Hero {
  private int mHp;
  private int mAttack;
  public Hero(int hp, int attack) {
    mHp = hp;
    mAttack = attack;
  }
}

public class Tryndamere : Hero {
  public Tryndamere(int hp, int attack) {
    base(hp, attack);
  }
}

public class Blademaster : Hero {
  public Blademaster(int hp, int attack) {
    base(hp, attack);
  }
}

Type Object描述

定义一个类表示英雄类型,英雄类保存该类型类的引用。

代码

public class HeroType {
  private int mHp;
  public int Hp {
    set { mHP = value; }
    get { return mHp; }
  }

  private int mAttack;
  public int Attack {
    set { mAttack = value; }
    get { return mAttack; }
  }
}

public class Hero {
  private int mHp;
  private int mAttack;
  private HeroType mType;
  public Hero(HeroType heroType) {
    mHp = heroType.Hp;
    mAttack = heroType.Attack;
    mType = heroType;
  }
}

从这些代码来看,你可能发现不了该模式的优点。让我们来给出一个使用例子来深入说明一下。

使用

通常来说,数值都是从配置表中读取的,比如有以下的英雄数值:

"Tryndamere" : {
  "hp" : 100,
  "attack" : 50,
}

则我们读取这些数据后,可以像下面这样使用:

HeroType TryndamereType = new HeroType(table["Tryndamere"]["hp"], table["Tryndamere"]["attack"]);
Hero Tryndamere = new Hero(TryndamereType);

可见,我们可以创建任意多的英雄类型而不再需要设计新的英雄类。


其他设计方案

  • 在HeroType中提供一个工厂方法,利用该方法创建英雄类。
  • 在HeroType中实现继承(不是用编程语言中的继承)

    public class ObjectType {
      private int mValue;
      public int Value {
    set { mValue = value; }
    get { return mValue; }
      }
      public ObjectType(ObjectType parent, int value) {
    if(parent != null) {
      if(value == 0) mValue = parent.Value;
    } else {
      mValue = value;
    }
      }
    }

参考

游戏设计模式


游戏编程技巧 - Type Object的更多相关文章

  1. 游戏编程技巧 - Subclass Sandbox

    Subclass Sandbox 使用场景 你正在开发一款类似LOL的游戏,里面有许多英雄角色,你决定把这些英雄类交给小弟们实现.因为在这些英雄中,释放放技能时,有的要使用粒子系统造成炫酷的效果,有的 ...

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

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

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

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

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

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

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

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

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

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

  7. c++游戏编程书籍

    如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦):  1.Gamebryo 2.2游戏引擎(盛大.腾 ...

  8. Python菜鸟快乐游戏编程_pygame(2)

    Python菜鸟快乐游戏编程_pygame(博主录制,2K分辨率,超高清) https://study.163.com/course/courseMain.htm?courseId=100618802 ...

  9. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

随机推荐

  1. Vue.js与MVVM

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

  2. Hamilton四元数群的表示

    Hamilton四元数群$Q_8=\mathbb H=\{\pm e,\pm i,\pm j,\pm k\}$满足如下运算法则: $e$为单位元且同号得正.异号得负,此外$e=i^2=j^2=k^2, ...

  3. DOCKER 为新启用的容器配置外网IP

    网卡的配置文件存储在 /etc/sysconfig/network-scripts/ 目录下.每个网卡的详细内容将会以不同的名字存储,比如ifcfg-enp0s3. 让我们看下ifcfg-enp0s3 ...

  4. Mac php使用gd库出错 Call to undefined function imagettftext()

    第一次在Mac下使用ThinkPHP,用到验证码功能时报如题的错误: Call to undefined function Think\imagettftext() 然后检查自己的GD库,发现安装上了 ...

  5. ubuntu 报错: The system is running in low-graphics mode

    出错原因不知为何,apt-get install --reinstall unity-greeter 不起作用. 试了一下,这样居然有效: cd /etc/X11 sudo cp xorg.conf. ...

  6. Python 下载网络mp4视频资源

    最近着迷化学, 特别是古代的冶炼技术,感叹古人的聪明. 春秋时期的炼铁方法是块炼铁,即在较低的冶炼温度下,将铁矿石固态还原获得海绵铁,再经锻打成的铁块.冶炼块炼铁,一般采用地炉.平地筑炉和竖炉3种.铁 ...

  7. Linux deepin 下sublimes配置g++ openGL

    参考 :http://blog.csdn.net/u010129448/article/details/47754623 ubuntu 下gnome只要将代码中deepin-terminal改为gno ...

  8. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  9. AOJ 0558 Cheese【BFS】

    在H * W的地图上有N个奶酪工厂,分别生产硬度为1-N的奶酪.有一只吃货老鼠准备从老鼠洞出发吃遍每一个工厂的奶酪.老鼠有一个体力值,初始时为1,每吃一个工厂的奶酪体力值增加1(每个工厂只能吃一次), ...

  10. 初识node.js

    Node.js不是一种语言:不是框架:也不是工具.它是用于运行基于JavaScript应用程序的运行时环境.