Articles of 架构的

应用程序组件的依赖性和解耦

在我的客户端应用程序中我有两个主要组件: GameCore – 处理所有关于运行实际游戏的包装 NetworkClient – 一个负责与服务器进行通信(接收/发送数据包)的层。 我不确定的是NetworkClient应该将信息服务于游戏的GameCore进程。 核心进程有一个在update()调用中执行的事件队列。 我最初的想法是有这样的事情: NetworkClient接收状态更改的快照,获取该快照并将其logging到GameCore进程要处理的事件对象。 我看到的问题是不是太依赖于Core类的NetworkClient类。 反过来不是一个问题,因为可以有一个不同的客户端(udp,tcp等)与Core类一起工作。 所以从devise的角度来看,是否有一个原因,我可能不希望为Core类的特定实现编写NetworkClient类。 PS:我正在使用JavaScript,但问题并不需要关注实现技术。

结构GameObject – 状态 – 可视化表示

问题 :具有不同状态和不同视觉效果的GameObjects的最佳数据结构是什么? 情况是 : 我正在为手机创作游戏(用Kotlin编写,没有使用引擎)。 我简化的对象结构如下所示: 我有2个GameObjects(例如人和障碍 ) 每个GameObject可能有两个不同的状态( IDLE和MOVE ) 但是每个国家也可能有不同的graphics。 例如,根据移动方向,MOVE状态可能会显示位图左或位图右。 Person – > WALK-State – > Visualization(WALK,PERSON) – > draw(bitmap_walk_left_person) 我的问题是,我真的不确定这个结构。 我应该为每个国家或组成作出分类吗? 每个状态的一个视觉对象(例如MOVE,IDLE,TALK)包含所有的人脸和障碍位图,并且总是根据父母显示正确的一个? 目前看起来像这样 : 我有GameObject。 该对象具有在update()方法中调用的状态 (例如向左移动一点)。 每个国家都有一个知道其父母国家(州= WALK)的“视觉”对象。 它将自身与其状态types(如WALK)相关联,并考虑(如果需要)方向(左侧或右侧)。 这感觉就像它保持结构尽可能抽象,但我不确定这是一个很好的解决scheme,因为所有的对象都必须引用他们的“父母”。 因此,视觉需要参考状态(WALK)和游戏对象(人),以便为行走的人绘制视觉。 为每个国家创建子语句会更好吗? 所以我有一个类“VISUAL_MOVE_PERSON”,“VISUAL_IDLE_PERSON”,“VISUAL_IDLE_TREE”…这似乎是很多冗余的代码和类。 行动/国家和他们的视觉表示有一个共同的结构吗? 特别是因为我会有更多的对象,至less有几个不同的状态(IDLE,MOVE,TALK,…) 视觉效果应该是每个州的一部分吗? 或者它们是相互独立的(比如GameObjects有一个State和一个Visuals对象),而不是上面显示的“引用链”?

基于组件的体系结构中的组件inheritance之后未使用的方法?

我有一个GameObject类,其中包含组件,如: 渲染 相机 行为 刚体 首先, 我从具有Update()方法的Componentinheritance了它们 ,并且在每个游戏对象的每个组件上调用每一帧。 但后来我注意到,**渲染器和相机的更新方法是未使用**。 (像RenderData和CameraData这样的类是由基元分离出来的,在创建这些组件时,这些数据的指针被发送给GraphicsEngine,它将每帧处理它们。) 所以有一个未使用的方法是不好的。 所以我创建了一个DynamicComponent类 ,它inheritance了Component,而Behavior&Rigidbody类是从它inheritance的。 我将Update()从Component移动到了DynamicComponent,并且在gameobjects中有两个容器 : 组件(对于直接从组件inheritance的组件) dynamic组件(用于从D.Compinheritance的组件) 而每一帧我只称为DynamicComponents的更新()。 现在我有另一个问题。 有Behavior类,其中应该是一个Start()方法 ,在场景完全初始化时在每个Behavior上调用它。 这意味着我应该在游戏对象中有一个Components,D.Components和一个Behaviors容器 。 这对我来说很不好 有一个组件类,与开始(),更新()等非常简单,使一个非常干净的代码,但这意味着只有less数派生类实现其虚拟方法。 我该怎么办?

如何保持用户input和渲染独立于实现环境?

我正在用JavaScript编写俄罗斯方块克隆。 总的来说,我在编程方面有相当多的经验,但对于游戏开发来说,这是相当新颖的。 我想将核心游戏代码与将其绑定到一个环境(如浏览器)的代码分开。 我的快速思想导致我的渲染和inputfunction在我的主要游戏对象外部。 我可以将当​​前的游戏状态传递给渲染方法,渲染方法可以使用canvas ,元素,文本等进行渲染。我还可以将input映射到某些游戏input事件,例如移动棋子左侧 , 顺时针旋转棋子等。 我在devise这个应该如何在我的对象中实现时遇到困难。 我应该传递对主要对象将用于呈现和处理用户input的函数的引用吗? 例如… var TetrisClone = function(renderer, inputUpdate) { this.renderer = renderer || function() {}; this.inputUpdate = input || function() {}; this.state = {}; }; TetrisClone.prototype = { update: function() { // Get user input via function passed to constructor. var inputEvents = this.inputUpdate(); // Update game […]

dynamic调整服务器端的tickrate

我对游戏开发/这个网站一无所知,所以我很抱歉,如果这是完全foobar。 今天,我尝试着为networking游戏构建一个小游戏循环(想想MW3,CSGO等)。 我想知道为什么他们不建立在服务器性能基础上的自动调整率? 如果客户知道这个框架是基于这个价格的话,会不会影响客户? 有没有人尝试过呢? 这是我的早餐C ++的大脑。 如果x ticks已经稳定,它将会改善tickrate。 如果“滞后”,则报价将减lessy个数量: // GameEngine.cpp : Defines the entry point for the console application. // #ifdef WIN32 #include <Windows.h> #else #include <sys/time.h> #include <ctime> #endif #include<iostream> #include <dos.h> #include "stdafx.h" using namespace std; UINT64 GetTimeInMs() { #ifdef WIN32 /* Windows */ FILETIME ft; LARGE_INTEGER li; /* Get the […]

子系统和GameObject组件之间的通信?

目前我有一个架构(不是100%准确): RenderData包含原始graphics,由GraphicsEngine处理。 在创建之后,我必须将渲染数据的指针从渲染器发送到GraphicsEngine。 这是通过传递给GameObject来完成的,GameObject将它传递给Scene,它传递给Core,它将在GraphicsEngine中调用相应的方法。 这个问题是场景可以访问Core。 我怎样才能正确地在GraphicsEngine上注册这些RenderData? 这与用于发送声音的AudioEngine的行为组件相同。 这与刚体组件的刚体数据和物理引擎也是一样的。 但是还有一个问题:如何发送与PhysicsEngine相撞的对象? 我曾经想过在碰撞对象的RigidbodyData处注册对象ID,Renderer会感觉到这一点,并处理自定义行为。 (就像子弹与玩家相撞时发生的情况) 如果这是好的,那么我如何给自定义的脚本指示与另一个游戏对象有碰撞? 在创建Behavior之后,我们将他们的OnCollide方法添加到Rigidbody的数组中? 或者只是将行为存储在通用组件容器中,而不是将这些行为存储在通用组件容器中,只需对它们进行迭代,然后调用OnCollosion? 另一个问题:窗口处理input,并且必须在场景中指示这些行为组件。 所以它已经访问了Scene,并且在接收到input时,它会调用Scene对应的方法来以某种方式传播事件?

游戏系统和组件基础架构中的组件之间的关系?

基于我之前在这里提出的有关将input与实体的其他组件解耦的问题,我在XNA之上开发了一个小型组件体系结构,以了解每件事情是如何工作和共同进行的。 基本上,我的架构有以下组件/服务/系统: 游戏 这是任何游戏的根源,负责勾选游戏循环(更新,绘图)以及实例化所有系统。 GameModule 负责游戏某个方面的游戏模块,比如UI( UIModule ),Input( InputModule ),animation( SpriteAnimationModule ),场景( SceneStackModule )等等。 场景 掌握游戏的当前状态。 基本上是一个实体经理。 🙂 实体 只有一些组件和非常基本的世界空间信息,例如位置,旋转等等的实体 零件 一个实体的组件,可以是任何东西( SpriteComponent , ScriptComponent , ControllerComponent )… 然而现在我似乎有一个问题,就是我的游戏系统(模块)和组件之间的责任问题,这些组件之间并不知晓。 例如,我有一个在我的游戏中实例化的UIModule ,我需要在任何其他系统之前更新/渲染,以便在UI上正确处理input事件。 为此,我需要遍历所有的UIComponent – 不幸的是封装在当前场景中。 而这又只能通过SceneStackModule (场景的LIFO集合)访问。 所以我必须让我的UIModule知道场景的概念(通过使SceneStackModule成为UIModule的依赖),为每个场景创建一个UIModule ,或者使UIModule成为一个依赖,并且注册UIComponent两次(一次在实体中,一次在模块中)。 方法1 public class UIModule : GraphicalModuleBase { public UIModule(SceneStackModule sceneStack) { } public void Draw(GameTime gameTime) { […]

MySql数据库devise的Facebook游戏

我在facebook游戏的计划阶段,它将类似farmville,但将公园。 我一直是一个Flash游戏开发多年,但所有这些数据库的东西对我来说是新的,所以我很难find处理数据的最佳方式。 我知道我需要一张桌子给玩家,所以这很简单。 每个玩家可以种植已经在公园里的农作物/花卉和/或收获树木等。 我设置的方式是公园是由2层或2个2Darrays组成的,底部arrays或地面砖arrays只是一个大的瓷砖,而在一个8×8的栅格中,所以看起来也非常简单,只是在“公园地面砖表”中存储了16个条目,但是关于这个问题的第一个问题。 这16个条目将对应于每个公园,所以我仍然使用ID上的自动增量或其他types的ID来以某种方式将它们表示为一组? 我只是想从数据库中获取这16个最快的方法。 接下来是比较棘手的东西,这是公园的第二层或物品/物品/农作物二维数组。 每个玩家都必须拥有自己的二维数组版本,所以首先要注意的是如何在数据库中设置这个版本? 我想也许有一个“公园项目arrays”,然后每个玩家的每个function(树,作物)等将被存储在该arrays,但我可以看到,变得非常快速,所以不知道如何做到这一点? 或者如果这个大小会是一个问题? 那么最重要的是,每个玩家可以维护多个公园:p …再次保持所有这些是最好的数据库devise? 谢谢你的帮助!

使用指针来更改物理引擎中的数据有什么优点和缺点?

我正在研究一个实体组件系统,我正在考虑这个通信协议: 游戏对象的物理组件会发送一个UpdateMyState消息,并附加其状态。 物理引擎收到这个。 物理组件发送一个指向其数据的指针,物理引擎改变状态。 因为它是一个指针,所以不需要返回消息。 标准的方法涉及物理引擎发送一个UpdatedState消息,附加新的状态。 这将由物理组件处理。 我不确定我的方式是否是一个很好的练习。 它不是一个完整的基于消息的系统,但它减less了所需的消息量,并且简化了系统。 使用指针来更改物理引擎中的数据有什么优点和缺点?

良好的技能devise(治疗,药物等)

我试图为我的游戏创建一个devise良好的“技能系统”,但是好奇的是,如果有人知道一个好的devise? 技能可以治疗,伤害可以是单个目标,多个(链),AOE。 即时伤害/治愈或加class。 有些技能可以一起伤害和治愈,等等。 也许有点复杂,我可以开始,但任何人都可以帮助我吗? 更新: 让我说我有一个字符类,每个字符的C有生命值,也是一个方法TakeDamage(float amountOfDmg,Character damage_causer); 这个TakeDamage(..)方法应该在每个Skill类中使用吗? class AnySkill { public: void Execute() { *(somehow get the character who takes damage)*->TakeDamage(damage, *(somehow get the causer)*) } private: float damage; } 这是一个很好的devise? class Character { public: void SetTarget(Character* target) { target_ = target; } void TakeDamage(float damage, Character* causer) { hit_points_ -= damage; […]