游戏开发

专业和独立游戏开发人员的问答



4
为什么在游戏开发中弧度优先于度?
我一直在寻找弧度的定义,发现数学家更喜欢弧度,因为它们是从pi派生的,而不是像度数那样完全任意的。 但是,我还没有找到在游戏开发中使用它们的令人信服的理由,可能是由于我完全缺乏相关的数学理解。我知道语言中大多数sin / cos / tan函数的弧度是多少,但是有人也可以按度创建库函数(并避免使用pi时固有的舍入错误)。 我不希望这是一个自以为是的民意测验,我只是想听听那些从事游戏开发(以及相关的数学研究)的人,他们认为弧度提供了优于学位的体验,而不是“我们使用弧度因为我们一直使用它们”,只是为了帮助我(可能还有其他人)了解它们的好处。

13
如何使回溯变得有趣?
玩家第一次浏览空间时,这很有趣:内容是新的,危险是未知的,需要找到路径。但是,各种情况都迫使玩家回溯或多次浏览同一空间。关卡设计人员可能是出于经济考虑,或者试图建立对空间的熟悉度。也许游戏本身是开放式的,或者像沙盒一样,在相同的空间中导航是游戏本身的一部分。这些可以使相同的空间显得乏味而稀疏。 鉴于不可避免地需要回溯(或多次导航相同的空间),有什么有效且经济的方法可以使之有趣?请记住: 我们故意重用这些级别,以取得效果或节省成本。因此,修改无法识别的级别将违反我们的意图。 我们也不能过多地修改游戏玩法;如果我们试图通过重用关卡来节省成本,那么通过增加游戏玩法而产生的更多成本将适得其反。 我想到的一个快速解决方案是为玩家提供某种加电或载具,使他们可以更快地回溯。我敢肯定,有更好的方法,以及使用它们的游戏示例。


7
如何实现可热交换的C ++模块?
快速的迭代时间是开发游戏的关键,在我看来,这比花哨的图形和具有大量功能的引擎更重要。难怪许多小型开发人员选择脚本语言。 能够暂停游戏并修改资产和代码,然后继续并立即使更改立即生效的Unity 3D方式对此非常有用。我的问题是,有人在C ++游戏引擎上实现了类似的系统吗? 我听说有些真正的超高端引擎确实可以,但是我对找出是否有办法在本土引擎或游戏中做到这一点更感兴趣。 显然会有折衷方案,而且我无法想象您可以在游戏暂停期间重新编译代码,重新加载代码并在各种情况下或在每种平台上工作都可以。 但是,对于AI编程和简单级逻辑模块来说,这也许是可能的。我似乎并不想在短期(或长期)项目中做到这一点,但我很好奇。
39 c++  hot-reload 

18
基于回合制的策略游戏,实时发生动作?[关闭]
好的,这个想法现在已经在对话中第三次出现了,已经困扰了我很多年了。这个想法是一款游戏,其中所有玩家在游戏处于暂停状态时都向单位做出决策/下达命令,并且所有动作都立即实时执行。从TRPG(即最终幻想战术)到小规模的小规模冲突(即蠕虫),到具有多个基地和多个单位的游戏(即Advance Wars),再到风险类型的游戏(即Risk),可能处于任何级别。 )。 我可以看到的主要缺点是玩家无法立即看到动作的结果。在传统的回合制或实时策略游戏中,用户单击“愚蠢的攻击”,马上就会发生爆炸。可能还会出现一些奇怪的情况(例如,您将单元发送给以相反方向运行的单元进行混战),但这是一个低级的细节。一个好的游戏设计师应该能够解决这些问题。最后,回合制游戏通常很少,但是它们提供的战术深度在实时战略游戏中是不可能的,并且总是有市场的(每年都会出现数十种新的TBS)。 有没有使用这种范例的游戏? 为什么没有更多? 进行这项工作需要什么? 您可以预见哪些潜在问题? 澄清一下,我的意思是纯粹的策略。这些命令是预先输入的,分辨率是实时的,但不需要玩家实时输入“抽动”。 编辑: Iain的答案将我引向了Laser Squad Nemesis,它基本上回答了第二个和第四个问题;-P-如果您想知道为什么这行不通,请下载演示(9MB)并单击第一个教程。哎哟!当然,Laser Squad Nemesis的用户界面无济于事(播放和暂停按钮?是认真的吗?如果这是我唯一要做的事情,为什么我每次都要单击“发出订单”?) 对于简单的事情(例如几个答案中提到的棋盘游戏,或Iain创建的Zwok),此范例非常有用!在更传统的战术/战略游戏中似乎出现了问题,因为命令输入与命令执行之间存在明显的滞后。实际上Zwok-以及上面提到的一些棋盘游戏- 之所以起作用,是因为摆脱了这一滞后,尽管如此。鼓励您猜测对手接下来会做什么,然后“思考一下”。但是,在更传统的小型战术策略游戏中,挫败因素是不值得的。 这可能是有趣的,看看在这样的比赛真的很大规模。例如,李和拿破仑并没有实时命令他们的部队,而是根据往往是数小时之久的信息做出决策,而执行这些命令通常要花费数小时。即使在今天,将军们也没有实时的自上而下的地图。但是,要消除这种“挫败因素”,就需要进行一些精巧的游戏设计。

6
快速移动物体的六角形碰撞检测?
对象具有位置和速度矢量。通常仅使用该位置来检查两个物体是否发生碰撞,这对于移动速度非常快的物体是有问题的,因为可能发生物体移动得如此之快,以至于在第一次碰撞检查中它位于第一个物体的前面,而在第二个碰撞检查中位于它的后面第二次碰撞检查。 现在,还有基于行的碰撞检查,其中您仅检查每个对象的运动矢量是否与另一个对象的边界框相交。这可以看作是一点的扩展。这仅在快速移动的物体很小的情况下才有效。 所以我的想法是,为什么不扩展矩形而不是扩展点?这将产生一个六边形。 现在,到目前为止一切顺利。但是我实际上如何检查两个这种六角形是否相交?请注意,这些是非常特殊的六角形。 奖励问题:是否可以计算出碰撞发生的确切位置(或确切地说,经过多少时间)?这对于检测实际发生的情况(例如在何处以及具有多少功率)以及模拟它们在碰撞到帧结束之间的时间中如何移动非常有用。

3
当几个类需要访问相同的数据时,应在哪里声明数据?
我有一个使用C ++编写的基本2D塔防游戏。 每个地图都是从GameState继承的单独的类。地图将逻辑和绘图代码委托给游戏中的每个对象,并设置数据(例如地图路径)。在伪代码中,逻辑部分可能看起来像这样: update(): for each creep in creeps: creep.update() for each tower in towers: tower.update() for each missile in missiles: missile.update() 对象(爬行,塔和导弹)存储在指针矢量中。这些塔必须能够进入蠕变矢量和导弹矢量,以制造新的导弹并确定目标。 问题是:我在哪里声明向量?它们是否应该是Map类的成员,并作为参数传递给tower.update()函数?还是在全球宣布?还是我完全想不到的其他解决方案? 当几个类需要访问相同的数据时,应在哪里声明数据?

1
为什么此节拍检测代码无法正确注册某些节拍?
我制作了此SoundAnalyzer类来检测歌曲中的节拍: class SoundAnalyzer { public SoundBuffer soundData; public Sound sound; public List<double> beatMarkers = new List<double>(); public SoundAnalyzer(string path) { soundData = new SoundBuffer(path); sound = new Sound(soundData); } // C = threshold, N = size of history buffer / 1024 B = bands public void PlaceBeatMarkers(float C, int N, …
38 c#  audio 

2
为什么我们在游戏物理学中使用勾股定理?
我最近了解到,我们在物理计算中经常使用勾股定理,恐怕我并没有真正理解这一点。 这是一本书的示例,以确保对象MAXIMUM_VELOCITY在水平面中的移动速度不会快于常量: MAXIMUM_VELOCITY = <any number>; SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; function animate(){ var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity); if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){ scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY; x_velocity = x_velocity / scalar; z_velocity = x_velocity / scalar; } } 让我们用一些数字尝试一下: 对象试图在x中移动5个单位,在z中移动5个单位。总共只能水平移动5个单位! MAXIMUM_VELOCITY = 5; …


7
即时图形用户界面-是或否?[关闭]
几年前,我一直在使用许多“保留的” GUI系统(以下是我的意思)进行应用程序开发,例如MFC,QT,Forms,SWING和多个Web-GUI框架。我总是发现大多数GUI系统的概念过于复杂和笨拙。与应用程序中的其他部分相比,大量的回调事件,侦听器,数据副本,从字符串到字符串的内容-转换(等等)始终是错误和头痛的来源。(即使“正确”使用了数据绑定/模型)。 现在我正在写电脑游戏:)。到目前为止,我使用的是一个GUI:Miyagi(不知名,但与所有其他系统基本相同的Idea。) 那太差了。 对于像游戏这样的实时渲染环境,我觉得“保留的” GUI系统已经过时了。用户界面通常不需要自动布局或动态调整窗口大小。相反,他们需要与不断变化的数据进行非常有效的交互(例如世界上模型的3D位置) 几年前,我偶然发现了“ IMGUI”,它基本上类似于即时图形模式,但是用于用户界面。我没有太在意,因为我仍在进行应用程序开发,而IMGUI本身似乎并不广泛也不成功。仍然,他们采用的方法似乎是如此性感和优雅,以至于让我想使用这种UI方式为下一个项目编写一些东西(我未能说服工作中的任何人:(...) 让我总结一下“保留”和“立即”的意思: 保留的GUI:在一个单独的初始化阶段,您将创建“ GUI控件”(如Labels,Buttons,TextBoxes等),并使用某种描述性(或编程性)方式将它们放置在屏幕上-始终在呈现任何内容之前。控件在内存中拥有大多数状态,例如X,Y位置,大小,边框,子控件,标签文本,图像等。您可以添加回调和侦听器,以了解事件并更新GUI控件中的数据。 即时GUI:GUI库由一次性“ RenderButton”,“ RenderLabel”,“ RenderTextBox” ...功能组成(编辑:不要被Render弄糊涂字首。这些功能还可以执行控件背后的逻辑,例如轮询用户输入,插入字符,在用户按住键时处理字符重复速度等...),您可以调用它们以“立即”呈现控件(doesn'不必立即将其写入GPU。通常会记住当前帧的GPU,并在以后将其分类。这些库不包含任何“状态”。如果要隐藏按钮...,请不要调用RenderButton函数。所有具有用户交互作用的RenderXXX函数(如按钮或复选框)都具有返回值,这些返回值指示例如用户是否单击了按钮。所以你的“ RenderGUI” 函数看起来像一个很大的if / else函数,您可以在其中调用或不调用RenderXXX函数,具体取决于游戏状态,并且所有数据更新逻辑(当按下按钮时)都将插入到流程中。所有数据存储都在gui的“外部”,并按需传递给Render函数。(当然,您可以将大功能分成几个功能,或使用一些类抽象来对gui的各个部分进行分组。我们不再像1980年那样编写代码了,对吗?)) 现在,我发现Unity3D实际上对其内置GUI系统使用了完全相同的基本方法。也可能有两种使用这种方法的GUI? 仍然..环顾四周时,似乎对保留的GUI系统有强烈的偏见?至少我没有在Unity3D中找到这种方法,并且原始的IMGUI社区似乎相当安静。 因此,有人同时使用这两种想法并有强烈的见解? 编辑:我对来自现实经验的观点最感兴趣。我认为IMGUI论坛中有很多关于直接GUI方法的“理论缺陷”的热烈讨论,但是我总是发现了解现实中的缺陷会更具有启发性。
38 gui 

6
为什么涉及奖励和统计信息时使用随机数?
许多游戏使用随机数来表示攻击伤害,金币战利品或产生的怪物类型。显而易见,随机数使您能够生成内容,使游戏更具可重玩性,但是我在谈论的是特定的东西。例如:在DOTA中,杀死怪物时,您会在x和y之间获得随机数量的黄金,而x和y永远不变。当您攻击任何东西时,您有机会在52-60之间的范围内造成伤害。如何使金滴静态变化,改变游戏规则? 我觉得随机数可以改善游戏玩法,但是我很难理解为什么。有谁知道为什么随机数与伤害或掠夺之类的东西一起使用时能使游戏玩法更好的原因?我希望得到的答案不会归因于好运。

2
XNA的SpriteBatch如何工作?
更准确地说,如果我需要在另一个API(例如OpenGL)中从头开始重新创建此功能,它将需要做什么? 我确实对某些步骤有一个大致的了解,例如它如何准备正交投影矩阵并为每个绘图调用创建一个四边形。 但是,我对批处理过程本身不太熟悉。所有四边形是否存储在同一顶点缓冲区中?是否需要索引缓冲区?如何处理不同的纹理? 如果可以的话,至少在使用默认的Deferred模式时,如果您能指导我完成从SpriteBatch.Begin()到SpriteBatch.End()的整个过程,将不胜感激。
38 xna  spritebatch 

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.