Questions tagged «architecture»

代码的结构。有关游戏引擎内部设计的问题。

3
创建实体作为聚合
我最近询问了如何将实体与其行为分开以及与本文相关的主要答案:http : //cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ 这里讨论的最终概念是:作为纯聚集体的对象。 我想知道如何使用C#将游戏实体创建为纯聚合。我还不太了解如何运行的概念。(也许实体是实现特定接口或基本类型的对象的数组?) 我当前的想法仍然涉及为每种实体类型都有一个具体的类,然后实现相关的接口(IMoveable,ICollectable,ISpeakable等)。 我如何才能完全将实体创建为聚合,而又没有该实体的任何具体类型?

2
游戏场景图中应包含什么?
请您帮我弄清楚游戏场景图应包含什么内容?请参阅以下列表: 游戏演员?(显然是的,所有更改状态的对象都应该是“场景图”的主要部分) 简单的静态游戏对象?(我的意思是,背景中没有动画的地方也不会发生碰撞) 游戏触发器? 游戏灯? 游戏摄影机? 武器子弹? 游戏爆炸和特效? 上面考虑的对象类型。现在来看场景图: 自关卡开始以来,场景图应该包含整个游戏关卡地图,还是仅包含地图的可见部分?如果第二个为真,则意味着随着玩家的移动,场景图将通过添加/删除游戏对象而不断更新。但是,仅包含地图的可见区域显然会更快地遍历和更新。

11
如何为关系数据库中的可用库存/物品/物品(例如武士刀)建模多个“用途”(例如武器)
因此,我正在通过www.ninjawars.net扩展项目的用途,但我不确定如何在我们使用的关系数据库中灵活地表示它们。 我可能在树错了树上,所以可以随意向其他方向提出建议,但是目前我认为每个项目都应该有关系“标签”。 例如,Katana当前是“项”数据库中的一行。为了使它成为一种武器和一种可携带的东西,我想我要拥有一个“特征”数据库,以及一个将它们之间简单链接的item_traits表。 // Objects and their basic data item_id | item 1 | Naginata // Things that objects can do trait_id | trait 1 | weapon 2 | holdable // How those objects do those things, e.g. powerfully, weakly, while on fire _item_id | _trait_id | item_trait_data 1 | …

2
内容管道工具是否应该嵌入引擎中?
游戏引擎应该有多低?引擎中应嵌入多少内容管道? 超级引擎可能有用的一些用例: 加载用户内容时,不需要用户打包其纹理,引擎将在加载时执行此操作。 脚本请求的字体大小要比预先生成的字体大得多,引擎可以解析ttf文件广告以构建新的纹理图集。 晕锻。 当然,这些都不是免费的。这需要您的内容管道工具使用C ++编写。您需要对管道中使用的支持库进行编译以在设备上使用。它要求内容生成必须没有错误。而且通常会使您的引擎更大且笨拙。 还有哪些其他优点和缺点? 优点胜过缺点吗? 一些具体问题: 引擎应该能够加载各种图像格式吗?仅TGA加载程序非常容易编写代码。 音频格式呢?仅支持加载wav文件是否可行?周围的音乐文件通常很大。 引擎是否应具有动态TTF解析和图集生成的能力? 纹理包装。

6
网络傍克隆
我具有TCP套接字,UDP通信等基础知识,但是在如何将它们应用于实时游戏环境方面找不到很多。 我有一个Pong克隆,有4个播放器,并且需要在三个客户端和服务器(服务器是第四个播放器)之间同步桨位置。目前,我使用UDP发送实时更新(桨式运动),并使用TCP设置游戏大厅等。 散发大量UDP流量是否是坏事?我是否应该研究类似DCCP的拥塞功能?还是这样的小规模项目真的不是问题吗? 客户端/服务器之间何时应发送同步消息?目前,服务器正在以其可以管理的最快速度向UDP数据包发送垃圾邮件,而客户端也在以最快的速度向其服务器发送垃圾邮件位置。这是最好的方法吗?我是否应该添加某种延迟,以便每X毫秒发送一次消息,还是仅在事件发生时才发送消息?(例如,桨叶速度由于用户输入而改变) 使客户端之间的点对点交流更好吗? 我在Pong的背景下问这些问题,但也对在其他游戏或通用解决方案中如何克服这些问题感兴趣。

3
为什么没有更多的游戏是64位可执行文件?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 到目前为止,尽管目前将近50%的Windows用户使用64位操作系统,但我仍然看到许多游戏仍采用32位体系结构编译?为什么是这样? 如果原因是要吸引更多的受众(因为32位应用程序可以在64位上运行),为什么不制作两个版本,因为它或多或少地涉及重新编译,而运行64位应用程序则可能会带来更多性能提升。可用的CPU寄存器和其他功能。

2
如何实现发动机零件之间的相互作用?
我想问一个问题,如何实现游戏引擎各部分之间的信息交换。 引擎分为四个部分:逻辑,数据,UI,图形。一开始我是通过标志进行这种交换的。例如,如果将新对象添加到数据中,则isNew对象类中的标志将设置为true。之后,引擎的图形部分将检查此标志,并将对象添加到游戏世界中。 但是,使用这种方法,我要编写很多代码来处理每种对象的每个标志。 我曾考虑使用某种事件系统,但是我没有足够的经验来知道这是否是正确的解决方案。 事件系统是唯一合适的方法,还是我应该使用其他方法? 如果重要的话,我正在使用Ogre作为图形引擎。
10 c++  architecture 

4
域驱动设计是否适合游戏?
我刚刚阅读了有关Domain模型的知识,因为我一直在开发一种游戏,该游戏的类仅包含数据(很少的行为/方法),因此它给我带来了启发。我将处理这些类的工作分配给了经理……现在我的经理看起来像是上帝的对象。我应该处理逻辑的游戏对象只是一个贫血领域模型。 我当前的设计模式是在Singleton中,我想进行一些重新编码以将这些内容发布出来。我从未在游戏上看到DDD(到目前为止),但这是一个好方法吗?我只是一个新手程序员(不喜欢游戏开发人员),所以我想在游戏变得过于肿以至于无法重新设计之前,了解有关良好架构的更多信息。

5
为什么在Vector3s中不能使用运算符'> ='?
我正在尝试获得一个矩形,以便在我称为_positionA和的两个位置之间移动_positionB。两者都是类型Vector3。矩形移动得很好。但是,到达时_positionB它不会像应该的那样朝相反的方向移动。 我回到代码中看一看。我得出的结论是,随着对象的移动,if代码中的语句错过了rects位置等于的框架_positionB。如果rects的位置大于或等于, 我决定将代码修改为反向_positionB。我的代码不太长,因此我将在下面显示它: using UnityEngine; using System.Collections; public class Rectangle : MonoBehaviour { private Vector3 _positionA = new Vector3(-0.97f, -4.28f); //Start position private Vector3 _positionB = new Vector3(11.87f, -4.28f); //End position private Transform _rect_tfm; private bool _atPosA = false, _atPosB = false; public Vector2 speed = new Vector2(1f, 0f); private …
9 unity  c#  vector  mathematics  vector  matrix  unity  c#  transformation  java  3d  terrain-rendering  shading  ios  opengl-es  opengl  rendering  optimization  python  scripting  minecraft-modding  modding  pc  3d-meshes  mesh  culling  point-cloud  networking  interpolation  mathematics  game-design  ai  game-mechanics  animation  unreal-4  skeletal-animation  3dsmax  unity  c#  3d  opengl  c++  textures  unity  ide  cocos2d  cocos2d-x-js  unity  c#  mono  il2cpp  c++  game-loop  timer  linux  flash  actionscript-3  java  glsl  c++  vector  entity-component  c++  directx11  windows  visual-studio  libgdx  mouse  unity  c#  architecture  storage  unity  c#  rotation  coordinates  quaternion  vrpn  movement  vector  unreal-4  unity  shaders  unity  gui  text  bug  shooter  3d  animation  rendering  voxels  c++  mmo  multithreading  linux  textures  procedural-generation  terrain-rendering  multiplayer  mmo  game-state  java  android  libgdx  opengl  procedural-generation  unity  gui  3d  animation  tools  geometry-shader  mobile  advertisements  unity  c#  animation  scripting  unity  animation  unityscript  coroutines  unity  shaders  lighting  camera 

3
AI代理如何访问有关其环境的信息?
这可能是一个琐碎的问题,但是我很难理解。非常感谢您的帮助。 在使用面向对象设计的游戏开发中,我想了解AI代理如何从游戏世界访问他们需要的信息以执行其动作。 众所周知,在游戏中,人工智能代理商经常需要“感知自己的环境”并根据周围发生的事情采取行动。例如,如果一个代理人足够靠近他,他可能被编程为追逐该玩家,在移动时避开障碍物(使用避障转向行为),等等。 我的问题是我不确定该怎么做。AI代理如何获取有关游戏世界所需的信息? 一种可能的方法是,代理简单地直接从游戏世界中请求他们需要的信息。 有一个叫做GameWorld的类。它处理重要的游戏逻辑(游戏循环,碰撞检测等),并保留对游戏中所有实体的引用。 我可以让这个班成为单身人士。当代理商需要游戏世界的信息时,它直接从GameWorld实例中获取信息。 例如,Seek当玩家靠近时,可以将一个坐席编程给玩家。为了做到这一点,经纪人必须获得球员的位置。因此,它可以直接直接请求:GameWorld.instance().getPlayerPosition()。 代理商也可以只获取游戏中所有实体的列表,并根据需要对其进行分析(以找出,或其他附近有哪些实体): GameWorld.instance().getEntityList() 这是最简单的方法:代理商直接联系GameWorld类并获取他们所需的信息。但是,这是我所知道的唯一方法。有更好的吗? 有经验的游戏开发人员将如何设计?天真的“获取所有实体的列表并寻找所需的东西”的方法吗?有哪些方法和机制可以使AI代理访问他们所需的信息以执行其动作?
9 architecture  ai  oop 

3
许多小型多态类(用作属性,消息或事件)的灵活替代方法
我的游戏中有两个类非常有用,但逐渐变得很痛苦。消息和属性(属性本质上是一个组件)。 它们都从基类派生并包含一个静态ID,因此系统只能关注他们想要的对象。效果很好...除了... 随着游戏的扩展,我一直在不断开发新的消息类型和属性类型。每次我需要编写2个文件(hpp和cpp)和一堆样板文件,以获得本质上是classID和一种或两种标准数据类型或指针。 它开始使玩转和测试新想法成为真正的琐事。我希望当我想创建一个新的消息或属性类型时,我希望能够键入类似 ShootableProperty: int gunType, float shotspeed; ItemCollectedMessage: int itemType; 而不是创建头文件和cpp文件,而是编写一个构造函数,包括父类等。 大约20到40行(包括警卫和其他所有内容)在我脑海中逻辑上是1或2行。 是否有一些编程模式可以解决此问题? 用脚本(我一无所知)呢?有没有办法定义一堆几乎相同的类? 这正是一个类的样子: // Velocity.h #ifndef VELOCITY_H_ #define VELOCITY_H_ #include "Properties.h" #include <SFML/System/Vector2.hpp> namespace LaB { namespace P { class Velocity: public LaB::Property { public: static const PropertyID id; Velocity(float vx = 0.0, float vy = …

5
如何在不重新启动的情况下从选项屏幕更新显示设置?
我目前正在使用Allegro 5和boost在C ++ 11中创建2D RPG。 我的目标是在“选项”菜单中更改选项后以某种方式更新我的游戏设置。我不想强迫用户重新启动我的游戏。其他游戏在更改分辨率或从全屏模式切换到全屏模式时不需要重启,因此我的游戏也不需要重启。请在下面查看系统的简化视图。 请注意,我不一定要直接从OptionsScreen调用我的Game对象。虚线仅仅是为了说明我要达到的效果。当在系统的不同部分中更改选项时,以某种方式导致游戏更新。 详细说明 ScreenManager包含GameScreen当前存在的所有对象的列表。这些将是游戏中的各种屏幕,包括弹出窗口。该设计或多或少地遵循C#/ XNA中的游戏状态管理示例。 在ScreenManager包含了我的参考Game对象。该Game对象初始化和修改游戏的设置。如果要更改分辨率,请全屏播放或静音,这是我在Game课堂上要做的。 但是,OptionsScreen当前无法访问Game类。见下图: GameScreen可以发信号三个事件onFinished,onTransitionStart和onTransitionEnd。没有,onOptionsChanged因为只有一个屏幕可以做到这一点。ScreenManager无法为此设置事件处理,因为它将所有屏幕都处理为GameScreen。 我的问题是,如何更改设计以使OptionsMenu中的更改不需要重新启动,而是立即更改?我最好Game在单击“应用”按钮后请求更新我的对象。

4
为什么我应该使用单独的初始化和清理方法,而不是将逻辑放入引擎组件的构造函数和析构函数中?
我正在开发自己的游戏引擎,目前正在设计经理。我已经读过,对于内存管理,使用Init()和CleanUp()函数比使用构造函数和析构函数更好。 我一直在寻找C ++代码示例,以查看这些功能如何工作以及如何将其实现到引擎中。如何Init()和CleanUp()工作,我如何能实现他们进入我的引擎?

2
实体系统中的多种运动源
我对实体系统这个概念还很陌生,已经阅读了很多东西(最有用的是这个很棒的博客和这个答案)。 尽管我在理解如何通过不确定数量的源操纵对象的位置这样简单的事情上遇到了一些麻烦。 也就是说,我有我的实体,该实体具有职位组成部分。然后,我在游戏中发生了一些事件,告诉该实体在给定时间内移动给定距离。 这些事件可以随时发生,并且具有不同的位置和时间值。结果是将它们混合在一起。 在传统的OO解决方案中,我会有某种MoveBy类,其中包含距离/时间,以及在我的游戏对象类内部的数组。每帧,我都要遍历所有MoveBy,然后将其应用于该位置。如果a MoveBy已达到结束时间,请从阵列中将其删除。 对于实体系统,我对如何复制这种行为感到有些困惑。 如果一次只有一个,而不是能够将它们复合在一起,那将是相当简单的(我相信),并且看起来像这样: PositionComponent 包含 x, y MoveByComponent 包含 x, y, time Entity同时具有a PositionComponent和aMoveByComponent MoveBySystem查找具有这两个组成部分的实体,并将的值添加MoveByComponent到中PositionComponent。当time到达,它会从该实体的组件。 我对于在很多情况下如何做同样的事情有些困惑。 我最初的想法是我会: PositionComponent,MoveByComponent与上述相同 MoveByCollectionComponent其中包含MoveByComponents 的数组 MoveByCollectionSystem查找具有PositionComponent和的实体,并在MoveByCollectionComponent其中的MoveByComponents中进行迭代,并根据需要应用/删除。 我猜这是一个更普遍的问题,具有许多相同的组件,并且希望有一个相应的系统对每个组件起作用。我的实体将其组件包含在组件类型->组件的哈希中,因此每个实体严格只有一种特定类型的组件。 这是看待这个问题的正确方法吗? 实体是否应该始终始终只有一种给定类型的组件?

4
我应该在游戏中的图形和物理引擎之间共享数据吗?
我正在编写包含几个模块的游戏引擎。其中两个是图形引擎和物理引擎。 我想知道这是否是在他们之间共享数据的好解决方案? 两种方式(是否共享)如下所示: 不共享数据 GraphicsModel{ //some common for graphics and physics data like position //some only graphic data //like textures and detailed model's verticles that physics doesn't need }; PhysicsModel{ //some common for graphics and physics data like position //some only physics data //usually my physics data contains A LOT …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.