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. C# 动态调用DLL库

    最近经常用到C#动态调用类库,简单的做下记录方便以后查询. 使用下面的几行代码就可以简单实现DLL类库的调用了 using System.Reflection; // 引入该命名空间 // 获取roc ...

  2. android 蓝牙 http://blog.csdn.net/u012843100/article/details/52384219

    http://blog.csdn.net/u012843100/article/details/52384219

  3. 【.net+jquery】绘制自定义表单(含源码)

    前言 两年前在力控的时候就想做一个类似的功能,当时思路大家都讨论好了,诸多原因最终还是夭折了.没想到两年多后再这有重新提出要写一个绘制表单的功能.对此也是有点小激动呢?总共用时8.5天的时间基本功能也 ...

  4. web socket (记录下来方便观看)

    Web Sockets HTML5 WebSocket 设计出来的目的就是要取代轮询和 Comet 技术,使客户端浏览器具备像 C/S 架构下桌面系统的实时通讯能力. 浏览器通过 JavaScript ...

  5. postgresql 设置只读用户

    postgresql 设置只读用户 ` CREATE USER readonly WITH ENCRYPTED PASSWORD 'ropass'; alter user readonly set d ...

  6. TextView属性android:ellipsize="marquee"不生效的解决办法

    最近自己在写自己的第一个app,过程中遇到了这个问题,查了不少帖子,经过尝试发现,这种问题一般分为两类: 1. TextView的Text值赋值后不更改,很多帖子上说如下写法就可以生效: <Te ...

  7. Notepad++ 使用nppexec插件配置简易开发环境

    notepad++  采用nppexec插件来配置简易开发环境,而不需要笨重的IDE以及麻烦.重复的命令行.控制台输入: 以下为本人最近用到的脚本配置: //编程语言脚本中$(NAME_PART).x ...

  8. 数据分析师的福音——VS 2017带来一体化的数据分析开发环境

    (此文章同时发表在本人微信公众号“dotNET开发经验谈”,欢迎右边二维码来关注.) 题记:在上个月的Connect() 2016大会上,微软宣布了VS 2017 RC的发布,其中为数据分析师带来了一 ...

  9. linux中的环境变量

    linux中用到很多的环境变量的设置,这里推荐一个博客: http://www.cnblogs.com/mengyan/archive/2012/09/04/2669894.html

  10. php字符串匹配

    $a='abcdef'; $b='abc'; similar_text($a,$b,$num); $num=3;