Articles of 架构

我怎样才能解决我的球员运动中的振动?

编辑:解决了我的问题,但看看另一个答案 我陷入了一个我无法弄清楚的问题。 当我把我的球员移动到一个新点时,它确实到达那里,但是它震动。 我似乎无法停下来。 我已经使用了一个实体组件系统。 这是我的Component_Transform类中的一个函数 void direction(float x_pos_str, float y_pos_str, float x_pos_end, float y_pos_end) { if (x_pos_str < x_pos_end) { if (x_pos_str != x_pos_end) { velocity.x = 1; } } if (y_pos_str < y_pos_end) { if (y_pos_str != y_pos_end) { velocity.y = 1; } } if (x_pos_str > x_pos_end) { if (x_pos_str != x_pos_end) […]

确定什么是组件的指南?

背景: 所以我正在开发我的第一个2D C ++格斗游戏(用于学习的目的),我有一个设置,我有'组件',它们实际上只是数据的持有者,可能有一些简单的实用function,如GetComp(),AddToComp()等。所有组件被传递到组件系统,这些组件系统只是作用于某些组件(例如MovementSystem(PositionComp pos,VelocityComp vel)等)的function,它们被分成各自的域(Graphics,Animation,Physics等)。 所有组件都由“战斗机”类保持,充当组件保持器,将所有内容保持在一起。 问题: 我遇到的问题是我不知道如何决定究竟应该做一个组件,什么不应该。 例如,对于我的animation,我有一个系统,实质上就像SetAnimation(spriteComponent sprite, animationClip anim)一样需要一个“spriteComponent”和一个“animationClip”obj。 就目前来看,我的animationClip类不被认为是一个组件,目前还没有附加在我的Fighter类中,但我想我可以这样实现它。 我如何确定应该将哪些类/types组合成组件? 这在其他ECS系统中如何处理?

我应该从Tile Info类中分离path查找信息吗?

我已经在基于Tile的游戏上实现了A *,我的Tile类包含很多信息,比如Position,TileType,Items,Characters等等。 现在该类有边缘引用(邻居),运动成本等。我应该创建一个新的类像节点只包含寻路相关的信息?

面向对象编程中的方法问题

我正在学习Java(第一语言),作为一个项目,我正在研究一个简单的益智游戏。 我的问题涉及到课堂上的方法。 我有我的Block类; 它有许多属性,设置方法,获取方法和简单的方法。 有不less。 然后我有我的主板课。 目前它大部分的逻辑,精灵定位的碰撞检测,然后画出精灵等等。 正如我正在学习编程一样,我正在学习编程游戏,我很想知道在给定的方法中通常可以接受多less代码。 有太多的方法吗? 我所有的绘图function都发生在一种方法中,我应该把它分解成几个“子”方法吗? 我的想法是,如果我在后来的阶段发现,我正在使用for循环在spriteCollision()方法中search冲突的数组中循环,效率低下我编写一个新的方法,只是用旧的方法调用replace新的,保留旧的代码不变。 有一个包含一个if语句的方法是不好的做法,并将该方法的调用放在for循环中? 我非常处于编码/devise的初级阶段,我需要所有的帮助。 当人们谈论在一天内把原型扔在一起的时候,我觉得这有点吓人! 不能等到我这么好!

实体组件系统中的属性所有权

您通常如何处理这些系统中的数据所有权? 现在我只有一个映射types(std :: string或hashed int) – > void *,其中外部源可以通过简单的AddAttribute方法添加属性。 现在我遇到了删除某些数据的地方和方法的问题,因为有些数据是通过外部源添加的(例如,引用另一个实体),其中一些是包含它的实体的合法数据(例如健康属性)。 最明显的解决scheme将是简单地使用共享指针,但不知何故,我担心,当我有很多实体时,他们的开销会变得明显(请参阅https://stackoverflow.com/questions/3628081/shared-ptr-horrible速度 )。 另一个我可以想到的解决scheme是首先使用两个不同的方法:“AddAttributeExternal”和“AddAttributeInternal”(或类似的命名是无关的),其中属性只会删除通过第二个添加的数据。 但是我想避免这种情况,因为它引入了重复的代码,当你引入大量的数据变化时,可能会出错。 有更好的/更优化的解决scheme,还是我需要改变我对实体数据的思维方式?

一种独立于API的管理video内存的方式?

我正在开发一款游戏。 游戏架构非常模块化。 我有一个“graphics引擎”,它使用Direct3D或OpenGL渲染器。 但是用户无法直接访问渲染器。 而是使用“graphics引擎”类,它使用渲染器接口。 我也有一个资源管理系统。 就目前来看,渲染器可以重新分配和释放video内存。 由于“graphics引擎”通过向“渲染器”发送信号,在RAM和VideoRam之间传输资源具有不良的逻辑,这使我的devise以一种糟糕的方式结合在一起。 我希望资源管理系统负责分配video内存。 我想尽可能地分解“渲染器”和“graphics引擎”类,并使渲染器只负责渲染。 有没有办法获得一个通用的指针videoRAM缓冲区,并使用它来呈现两个渲染器? 我的问题基本上是,我只能获得OpenGL或Direct3D手柄,只能从相关的API中使用。 而“graphics引擎”不应该知道它使用哪个渲染器。

基于组件的架构:“纯”还是一些inheritance?

(我问了一个类似的问题,但里面有更多的问题,我觉得还不够清楚,所以我打开了一个新的问题)。 直到最近,我用inheritance层次实现了所有的游戏。 那些是简单的游戏。 例如: Entity / \ Movable Static / \ / \ Orc Mage Tree Wall 这适用于简单的游戏。 不过最近我读到了“实体组件系统”。 使用这种方法,一个类不会从另一个类inheritance以获得function。 而是由它组成,它允许更灵活的devise。 我的问题是这样的: 我知道每个组件都是一个类(从一个公共基类派生)。 然而,有一件事我不明白:在“组件系统”方法中,是否有一个类是所有实体都是实例的 – 实体之间的唯一区别是它们包含的组件? 例如:有一个Entity类。 游戏中的所有实体都是这个类的实例。 它们之间的唯一区别是它们由不同的Component对象组成。 例如: Component aiComponent = new AIComponent(); Component movementComponent = new MovementComponent(); Component physicsComponent = new PhysicsComponent(); Component rangedAttackComponent = new RangedAttackComponent(); Entity orc = new Entity(); […]

关于以属性为中心的游戏对象运行时的问题

我正在阅读Jason Gregory的游戏引擎架构 所以据他说,我应该使用一个实体数组,每个属性的数组,如数组gameObjectsPosition , gameObjectsHealth …但在我的情况下,世界被分割成一个块网格。 每个块都有它自己的数组(或者是现在的vector,但是我的飞机来改变它)实体(游戏对象)。 那么,我该怎么办? 创建一个包含所有实体位置的单个数组(在健康,级别,方向,维度等方面都是如此),或者在每个块中创建特定于属性的数组? 那么如何处理这些属性数组呢? 我的意思是,对于每个dynamic实体,我可以更新维度,大小和健康,或者我可以为每个属性更新每个实体。 例: UpdateWorld() { for each entity in dynamicEntities entity.updatePosition() entity.updateHealth() entity.updateDimensions() entity.updateMesh() } UpdateWorld() { for each entity in dynamicEntities entity.updatePosition() for each entity in dynamicEntities entity.updateHealth() for each entity in dynamicEntities entity.updateDimensions() for each entity in dynamicEntities entity.updateMesh() } 如何处理每个块的大小? 这意味着每个块都有一个MAX_ENT_PER_CHUNK (在我的例子中是1024)的数组,然后如果一个块有24个实体,则会有1000个实体无用。 另外,我不能使用超过1024个实体。 […]

客户端代码在引擎返回时处理自己的generics

我正在用Java 8写一个游戏引擎,并且有用Groovy编写的原型客户端代码。 新的游戏对象可以用一个构建器来创建,它可以定义填充空白的所有东西。 为了简化事情,假设Game类唯一需要的是键盘input(客户端和引擎都知道)到dynamicinput事件(只有客户端才知道)的映射。 input事件由客户端定义,并且只能由客户端处理。 该引擎仅用于通知客户端发生了已经映射到该input事件的input。 此时,它将以该input事件作为唯一参数调用客户端实现的方法。 我的目标是让接收input事件的客户端代码在编译时知道客户端在实例化Game对象时首先提供的事件types。 我最初的天真的尝试是把我的引擎代码变成genericstypes的<T extends Enum<?>>但是这只是混乱的一切,并且没有解决任何问题,因为据我所知,客户端代码只知道它获得callback时处理generics枚举。 这是我试图甚至可能的吗? 我是用枚举还是generics走在路上?

我应该通过我的资源经理types,可能需要它,或使其全球?

说我有这个Cache<typename Resource>类模板,这是一个资源caching,包含一个std::map<std::string, Resource> ,映射到资源的string。 我可以有许多不同types的资源:声音,纹理,几何等等。所以我需要像所有这些caching的容器: struct ResourceManager { Cache<Sound*> _soundCache; Cache<Mesh*> _meshCache; Cache<Texture2D> _textureCache; }; Mesh对象可能需要从纹理caching中查询Texture对象,所以可以通过两种方式来处理这些caching:将指向_textureCache的指针_textureCache给每个Mesh对象,或者通过其构造函数(这种方法非常笨拙),或者定义一个全局的ResourceManager对象,所以每个类都可以一直使用它的caching。 这个问题是否曾经被提出来讨论? 我该如何处理呢? 大多数引擎做什么? 他们在哪里存储这些caching? 这样做是否可行? : ~GameEngine.h~ … #include "ResourceManager.h" //global object resourceManager g_resourceManager; class GameEngine { … };