14_ Component 游戏开发组件模式

# component

不同作用的程序需要保持互相隔离
我们不想ai 物理 渲染 声音 等等功能 耦合在一起,像下面这样
```
//bad
if (collidingWithFloor() && (getRenderState() != INVISIBLE))
{
  playSound(HIT_FLOOR);
}

```

一个 entity 可跨多个领域, 不同的领域保持隔离(component class),
entity == container of component(组件的容器)

### when to use
1 一个对象使用多个功能, 你想不同功能互相隔离
2 一个类变得很大, 越来越难用
3 只想使用基类的某个功能,就需要把那个功能做成组建. 就不用继承它了

##### 问题
组建通信
性能变低

### Code
```

class GraphicsComponent
{
public:
  void update(Bjorn& bjorn, Graphics& graphics)
  {
    Sprite* sprite = &spriteStand_;
    if (bjorn.velocity < 0)
    {
      sprite = &spriteWalkLeft_;
    }
    else if (bjorn.velocity > 0)
    {
      sprite = &spriteWalkRight_;
    }

    graphics.draw(*sprite, bjorn.x, bjorn.y);
  }

private:
  Sprite spriteStand_;
  Sprite spriteWalkLeft_;
  Sprite spriteWalkRight_;
};

class PhysicsComponent{};

class InputComponent{}
class PlayerInputComponent : public InputComponent {}

class Bjorn
{
public:
  int velocity;
  int x, y;

  Bjorn(InputComponent* input, PhysicsComponent *phys, GraphicsComponent *graph)
  : input_(input), physics_(phys), graphics_(graph)
  {}

  void update(World& world, Graphics& graphics)
  {
    input_->update(*this);
    physics_.update(*this, world);
    graphics_.update(*this, graphics);
  }

private:
  InputComponent* input_;
  PhysicsComponent physics_;
  GraphicsComponent graphics_;
};

GameObject* createBjorn()
{
  return new GameObject(new PlayerInputComponent(),
                        new BjornPhysicsComponent(),
                        new BjornGraphicsComponent());
}

```

### How do components communicate with each other?
1 通过修改容器对象的状态(容器对象复杂,对状态的实现)
2 包含直接引用(快速, 但是组件实例耦合了)
3 通过发送消息(复杂, 解耦, 容器对象简单)
时间: 2024-10-13 02:04:55

14_ Component 游戏开发组件模式的相关文章

黄金十二宫游戏开发区块模式

黄金十二宫游戏开发 软件开放公司,可开发类似系统.非平台方,玩家勿扰. 黄金十二宫区块链游戏模式介绍:黄金十二宫的品种 白羊宫,区块价值301-900元,预约时间00:00 16:59,领@养时间17:00 20:00,IT领域,预约金币3,收益天数3天,智能合约收益10.5% 金牛宫,区块价值100-300元,预约时间00:00 16:59,领@养时间17:00 20:00,预约金币2,收益天数7天,智能合约收益21% 处nv宫,区块价值901-2500元,预约时间00:00 16:59,领@

Transform组件C#游戏开发快速入门

Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸 图2-8  组件与属性 所有的游戏对象都有Transform组件,而Transform组件下的各属性,决定了游戏对象的位置.朝向和大小的状态.要修改游戏对象上Transform组件下的各属性,必须要指定修改的游戏对象是哪一个,指定的方式有两种: q  直接使用鼠标点选Scene视图中要改变状态的游戏对

9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中. 在这里,我们将它稍加推广,泛指一切生成并返回一个对象的静态函数. 一个经典的工厂方法如同这样: Sprite* factoryMethod() { Sprite* ret = new Sprite(); //在这里对 ret

游戏开发设计模式之原型模式 &amp; unity3d JSON的使用(unity3d 示例实现)

命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 实现原型模式 原型模式带来的好处就是,想要构建生成任意独特对象的生成类,只需要一个生成类和一个原型即可.当我们有一个抽象的敌人Monster类就有很多继承它的各种各样的敌人,人类.动物.龙等等,如果我们想为每个敌人做一个生成器父类Spawner,也会有与monster对应数量的子类,也许就会这样: 这样就会产生类的数量变多,而且这些类的功能是重复的.开始的spa

[Unity3D]Unity3D游戏开发之基于2D贴图实现血条组件的开发

各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程.今天呢,我们来做一个在游戏中十分重要的组成元素:血条.血条是什么呢?血条是生命值的一种体现,就像<仙剑奇侠传三>电视剧中,当景天说他想让那些被邪剑仙害死的人活过来的时候,天帝说需要等量的生命值来换,所以电视剧中的结局就变成了景天留在世上的时间并不多了,雪见依偎着他坐在新安当门口的时候,天上忽

果园农场种植游戏复利拆分模式app系统开发详解

330复利拆分果园游戏app系统开发(苏公子.188.1414.7927)皮皮果游戏开发,玫瑰庄园游戏开发,复利拆分游戏开发,330模式开发,330果园系统开发,复利拆分农场系统开发,英伦果开发,皮皮果游戏介绍,地点的移动.由于移动互联设备小巧的外形,它天生具有可以移动的特征,人们可以拿着它随时随地随身的查询信息.办公.娱乐.购物等,在快节奏的生活方式中,可以随时移动和携带终端设备,在公交车.地铁.火车等特殊场合也可以随时接入网络,接受信息,提高了人们的办事效率,加快信息传播的速度. 果园复利拆

MVC模式在游戏开发的应用

原地址: http://www.cocoachina.com/gamedev/2012/1129/5212.html MVC是三个单词的缩写,分别为:模型(Model).视图(View)和控制Controller).MVC是一个设计模式,它强制性地使应用程序的输入.处理和输出分开,将应用程序分成三个核心部件:模型.视图.控制器.它们各自处理自己的任务,关系如图所示: 模型是数据层,视图是表现层,控制器是逻辑层,也对应于程序运行中的数据输入,数据处理,数据输出基本三步骤.事实上,MVC模式开发也适

游戏开发设计模式之对象池模式(unity3d 示例实现)

前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定的池中重用对象,来提升性能和内存的使用,而不是一个一个的分配内存在释放它们.当你需要创造大量重复的对象,而且经常使用这些对象,你就要考虑使用对象池了,因为反复创建销毁就是一个内存反复分配与释放的过程,很容易产生内存碎片.在主机和移动端与PC相比内存稀缺,我们都希望游戏能够更加稳定,而不能有效的管理内

cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现

一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create方法就可以啦~,只是需要传入大小和颜色等等的参数即可. void GameLayer::addStartLine() { auto block = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,visibleSize.he