Articles of 基于组件

我在哪里可以find一个基于组件的开源游戏?

检查链接: 演变您的层次结构 我对这种游戏开发感兴趣,理论看起来不错! 但是我想看看在这个方法之后开发的一些游戏的源代码。 如果它是简单的(甚至是教育性的),那么会更好,如果它被编码为C ++或者C#,它会更好。 谢谢!

基于组件的渲染

我有组件Renderer , Draws Texture2D (或精灵)然后我有方法OnUpdate ,并且应该有我的渲染代码,类似 spriteBatch.Draw(Texture, Vector2.Zero, Color.White) 但首先我需要做spriteBatch.Begin(); 。 我应该在哪里打电话? 我如何确保在任何Renderer组件的OnUpdate方法之前调用它? (我需要做更多的东西,然后只是Begin()我也需要设置右相机rendertarget等)

处理XNA 4.0组件对象游戏引擎中的2D像素着色器和SpriteBatches?

在过去,我在OpenGL / WebGL中实现了一些非常简单的三维片段和顶点着色器,并且在一般的着色器方面也有一些经验。 目前,我正在使用XNA 4.0中的2D游戏引擎,并且在当前体系结构中将每个对象和全景着色器进行整合。 我正在使用一个组件实体devise,其中我的“实体”仅仅是由谨慎的系统管理器(SpatialProvider,SceneProvider等)执行的组件的集合。 在这个问题的背景下,我的画图看起来像这样: SceneProvider :: Draw(GameTime)调用… ComponentManager :: Draw(GameTime,SpriteBatch)调用(在每个可绘制组件上) DrawnComponent :: Draw(GameTime,SpriteBatch) 在它告诉ComponentManager开始渲染场景之前,SpriteBatch在SceneProvider类中使用默认的SpriteBatch着色器进行设置。 根据我的理解,如果一个组件需要使用一个特殊的着色器来绘制自己,那么在调用Draw(GameTime,SpriteBatch)方法时,它必须执行以下操作: public void Draw(GameTime gameTime, SpriteBatch spriteBatch) { spriteBatch.End(); spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, EffectShader, ViewMatrix); // Draw things here that are shaded by the "EffectShader." spriteBatch.End(); spriteBatch.Begin(/* same settings that were set by SceneProvider to ensure the […]

麻烦使用组件基础模式

我正在尝试在我的新项目上使用基于组件的模式。 最后的项目我做了老式的方式。 基础类,并从中得出,直到你的大脑受伤。 这一次我想用一种新的方式用组件的方法来做。 Component Base Summary:这个想法是,你构建组件,并从不同的组件构成你的对象,例如Player类包含GraphicComponent , PhysicComponent , InputComponent , CameraComponent , ScriptComponent等,但像植物装饰对象只有GraphicComponent和可能PhysicComponent 。 我喜欢这种方法。 我试图实现它,但我有一点理解问题。 据我所知,每个组件都有自己的逻辑,而且几乎不知道其他组件。 但是这是我不明白的部分:比方说,我们有一个RenderComponent ,其中包含渲染的逻辑。 但是像播放器,植物和UI元素等每个具体对象都必须以完全不同的方式呈现。 玩家具有特殊效果和不同的animation,植物只是一个精灵,UI元素是两者的组合。 我是否一次性将RenderComponent中的每个不同渲染逻辑,例如RenderPlayer() , RenderPlant() , RenderUIElement() ,这对我没有任何意义,或者从RenderComponent创建一个接口,并创建一个特定的RenderComponent每个具体对象像PlayerRenderComponent : IRenderComponenent ? 更新 在阅读Nick的答案之后,我做了一个快速的UML比较图来澄清我是否有这个想法/结构。 该图只是一个伪类似UML图的例子,一些伪例子constelations。 这个想法是,具体的构成对象把它们的组件作为一个数据结构来对待和处理。 他们设置它,改变它,并从中读取它做逻辑。 他们还可以比较其他具体对象的组件,以便于将其组件提供给更高级的系统(如管理者) 更新2经过一些讨论和一些混淆的对立面争论后,我开始用谷歌关键词从我的评论中获得,并find了一篇文章 ,帮助我了解系统是如何粘在一起的。

为什么大型构建器类而不是在基于组件的实体系统中分离类?

我正在阅读关于基于组件的实体系统,我想知道为什么通常有一个大的EntityBuilder类,像CreatePlayer() , CreateEnemySpaceship()和CreatePowerup() ,都创建一个实体,附加一些组件,并返回实体。 如果给定足够多的实体,那么这个类就有可能变得相当大,而且search这个大的代码文件最终会变得非常麻烦。 而且,在这个系统中,由于所有的实体都是Entitytypes的,所以为了确定实际是什么 ,你必须添加一些TypeComponent到可能包含像“Player”,“Enemy”和“Powerup ”。 现在你失去了强打字的一些好处,不得不依靠个人记忆更多(在我看来不好)。 此设置的另一个问题是无法根据实体的types使用函数重载。 相反,人们将不得不使用哈希表基于一些有点丑陋的识别组件。 我想知道,为什么不为每个实体分别设置不同的类,而不是让这些大型的构建器类和繁琐的方法来确定实体是什么? 那么,这就是我们正在做的,但他们导致了庞大而复杂的层次结构,对吧? 那么,我不主张大的层次。 而是将每个方法从这个单体构建器类移动到派生自实体的单独的类,并将该代码放置在构造器中。 没有多重inheritance。 没有大树。 示例:“发送”,“飞船”和“敌人空间”都将从“实体”和“唯一实体”派生。 这对确定碰撞发生时实体的types以及如何处理事件可能很有用。 除了构造函数逻辑如何构造实体(附加组件和什么)之外,类本身基本上是空的。 这个解决scheme似乎还有更多的可扩展性,考虑到是否需要修改EnemyEliteFighterSpaceship的创建过程,而不是search某个大的构建器类,只需要到那个类文件。 我在这里错过了什么? 我想,如果其他的话,我的真正的问题将是一个优雅的方式来确定什么是一个实体,当它与另一个实体碰撞,所以可以采取一些行动(增加分数,播放声音等)。 我最初尝试设置某种types的组件,但它似乎有点hackish,而不是简单地从基础实体类派生。 此外,从基本实体类派生出强大的types和types安全支持,摆脱公共静态构建器类,并允许多态行为和易于确定实体的types。 所以我想知道,所有这些积极的,没有可感知的消极(除了..更多的文件?组织胜过文件计数在我看来),为什么大多数组件系统赞成这些大型建设者/工厂类而不是我提出的方法?

在屏幕上重复使用实体:游戏数据与对象建模

我正在制作2D RPG。 我目前有一个MainWorldScreen ,它有一个Player实体和一些他可以碰撞的MapObjects 。 玩家有几个组件(精灵,键盘input)等实现特定的逻辑,使其在主世界屏幕上工作。 现在问题出现在我开始在“战斗”屏幕上工作。 问题的关键在于, 我应该重新使用/扩展我的播放器实体还是在每个屏幕上创建一个实体? 到目前为止,组件都是基于行为的 – 在屏幕上显示某些东西的精灵,input组件来捕获和暴露事件以处理input等等。我的实体是实现游戏逻辑的组件的组合(例如,在键盘上单击)。 如果我把它作为“纯粹的”面向对象的,我可能会有一个更大的Player类,它具有所有屏幕所需的所有组合属性 – 设备列表,健康状况等,每个屏幕只会采取它所需要的。 但是,由于我有组件,如果我重用了我的播放器实体,重用它就没有多大意义; 我将不得不删除和重新添加新的组件,因为屏幕使用完全不同的数据,我不知道玩家状态应该去哪里(例如设备)。 什么是正确的方式来处理这个? 我应该与每个屏幕一个Player实体(至less有这两个屏幕)吗? 我应该在实体中保持玩家状态,并且当我将其从屏幕传递到屏幕时,根据屏幕添加/删除组件?

实体系统将如何处理相关组件?

目前,我正在学习实体组件系统,并且对组件有一个疑问。 系统如何处理相关组件? 例如,在2D游戏中,我有一个具有以下组件的游戏对象实体: RenderComponent – 包含当前的字符精灵 AnimationComponent – 包含一组精灵和帧索引 CharacterStateComponent – 告诉角色实际在做什么 考虑到玩家的input,比如“move_forward” ,我不确定下面哪个程序应该发生: 系统轮询: Input通知StateSystem 。 StateSystem更新CharacterStateComponent 。 AnimationSystem读取CharacterStateComponent更改。 AnimationSystem更新AnimationComponent 。 RenderSystem读取AnimationComponent更改。 RenderSystem更新RenderComponent 。 RenderSystem通常绘制RenderComponent 。 所有function于一身的更新: Input通知CharacterSystem 。 CharacterSystem更新CharacterStateComponent , AnimationComponent和RenderComponent 。 AnimationSystem正常地重复AnimationSystem 。 RenderSystem通常绘制RenderComponent 。 我不太确定引擎如何响应一个组件的更改,以便更新其他组件。 我相信当涉及到每个系统必须轮询其必备组件更改时(如系统轮询所示),将会有性能问题。 实体系统将如何处理相关组件?

组件体系结构入门:DI?

TLDR:如果我有像Ship和Bullet这样的实体,以及像Positionable和Drawable这样的组件,我应该为每个组件创建接口并使用DI将它们注入到我的实体中,还是应该做其他的事情? (在这种情况下, Ship将扩展IPositionable并且有一个由DI注入的PositionableComponent的实例,任何对ship.getX或ship.setX调用ship.setX将被实现为myPositionable.getX或myPositionable.setX 。) 我刚刚从MVC转移到更多的组件架构。 我还没有消息的概念(这是粗糙的原型代码),对象现在只是获得其他类的内部属性和值。 除了这个问题之外,这似乎正在变成一个面向方面的编程挑战。 我注意到,例如,所有具有position组件的实体都将具有相似的属性(获取/设置X / Y / Z,旋转,速度)。 将这些推到一个接口后面,并使用dependency injection来注入一个已经拥有所有锅炉代码的generics类(例如PositionComponent),这是否是一种常见的做法和/或好主意? (我相信答案会影响我用于消息传递的模型) 编辑:我建议的DI模型如下。 创建像Ship和Bullet这样的实体类 创建接口来表示这些组件。 例如。 我可以期待一个PositionableComponent.getX方法。 创建组件类,如实现我的界面的PositionableComponent , DrawableComponent 像Ship这样的实体将拥有像PositionableComponent这样的组件。 他们将通过在内部保留一个positionalbleComponent可调组件的实例并将所有接口调用redirect到组件来实现这些方法。 我的DI框架(可能会自动)通过接口连接组件,例如。 Ship._positionableComponent = new PositionableComponent() 。 这就是NInject的工作原理,这是我使用过的唯一框架(现在我在Haxe工作)。 这将允许我在更高级别上工作(船舶包含组件),并减less样板代码(组件实现),但会引入重复代码(redirect到内部组件)。 由于我在Haxe工作,所以我可以避免手写这个样板文件。 但是,好处是我可以重写组件的行为。 如果undeadMonster.IsAlive()在HP大于-100(而不是0)时应该返回true,我可以很容易地对它进行编码,从代码级别变得非常明显。 但我不确定我是否正确解决这个问题。

基于组件的游戏devise和共享网格数据

假设你制作一个游戏引擎,并且你有几个GameObjects,每个GameObject都有一个你可以添加或删除的组件列表。 假设有一个MeshComponent有顶点,法线等等。如果有几个GameObjects具有相同的MeshComponent,将会有很多内存浪费。 当然有很多方法来实现这个,但我想要一些很好的建议如何解决这个问题? 组件如何共享不会被修改的数据?

我应该如何管理我的游戏对象和组件?

到目前为止,编程游戏中最大的问题就是如何构造代码。 过了一段时间,它变成了一个令人难以置信的混乱。 原因是因为我不知道不同的类应该如何相互作用。 例如,假设我有一个Player类,一个PlayerInput class和一个Map类。 Player类包含关于玩家位置的信息,而PlayerInput类处理改变该位置,但是首先使用Map类确保它位于可漫步区域内。 我应该如何构造这个? 我通常的做法是将这些组件作为parameter passing到需要它们的参数的构造函数中,如下所示: var map = new Map(); var player = new Player(); var input = new PlayerInput(player, map); 这个问题很快就会变得混乱。 当你添加新的组件时,你必须通过你的构造函数并更新它们,如果你有镜像引用,那么它就不能正常工作: var physics = new Physics(input); //Oops, doesn't work var input = new Input(physics); 我应该如何管理我的游戏对象和组件?