在某个时候,引擎必须专门研究游戏知识。我将在这里切线。
在RTS中获取资源。一场比赛可以有Credits
和Crystal
另一个Metal
与Potatoes
您应该正确使用OO概念并最大程度地利用。代码重用。显然,Resource
这里存在一个概念。
因此,我们认为资源具有以下优势:
- 主循环中的一个钩子,用于自己增加/减少
- 一种获取当前金额的方法(返回
int
)
- 一种任意减法/加法的方法(玩家转移资源,购买...)
注意,这个a的概念Resource
可能表示游戏中的击杀或得分!它不是很强大。
现在让我们考虑一个游戏。我们可以通过交易几美分并在输出中添加小数点来获得某种货币。我们不能做的是“瞬时”资源。就像说“电网发电”
假设您InstantResource
使用类似的方法添加了一个类。您现在(开始)使用资源污染引擎。
问题
让我们再次以RTS为例。假设玩家向Crystal
其他玩家捐赠了一些东西。您想要做类似的事情:
if(transfer.target == engine.getPlayerId()) {
engine.hud.addIncoming("You got "+transfer.quantity+" of "+
engine.resourceDictionary.getNameOf(transfer.resourceId)+
" from "+engine.getPlayer(transfer.source).name);
}
engine.getPlayer(transfer.target).getResourceById(transfer.resourceId).add(transfer.quantity)
engine.getPlayer(transfer.source).getResourceById(transfer.resourceId).add(-transfer.quantity)
但是,这确实很混乱。这是通用的,但是很混乱。尽管已经加上了resourceDictionary
,这意味着现在您的资源必须有名称!而且是每位玩家,因此您不再拥有团队资源。
这是“太多”的抽象(我不会承认这是一个出色的例子),相反,您应该达到一个点,即您接受游戏拥有玩家和水晶,然后就可以拥有(例如)
engine.getPlayer(transfer.target).crystal().receiveDonation(transfer)
engine.getPlayer(transfer.source).crystal().sendDonation(transfer)
使用类Player
和类CurrentPlayer
where CurrentPlayer
的crystal
对象时,对象将自动在HUD上显示用于转移/发送捐赠的东西。
这会污染晶体,捐赠晶体,HUD上当前玩家的信息以及所有这些污染引擎。它既更快又更容易读取/写入/维护(这很重要,因为它并不明显更快)。
结束语
资源案例并不出色。希望您仍然明白这一点。如果有什么可以证明“资源不属于引擎”的话,那么具体游戏需要什么以及适用于所有资源概念的东西就完全不同了。您通常会发现3(或4)个“图层”
- “核心”-这是引擎的教科书定义,它是带有事件挂钩的场景图,它处理着色器和网络数据包以及播放器的抽象概念
- “ GameCore”-这对游戏类型来说是通用的,但并非对所有游戏都通用-例如RTS中的资源或FPS中的弹药。游戏逻辑开始渗入此处。这就是我们较早的资源概念所在的地方。我们添加了对大多数RTS资源有意义的这些内容。
- “ GameLogic”非常适合制作的实际游戏。您会发现名称为
creature
或ship
或的变量squad
。使用继承你会得到跨越所有3层类(例如Crystal
是 Resource
它是 GameLoopEventListener
说)
- “资产”对任何其他游戏都没有用。以半衰期2中的Combine AI脚本为例,它们不会在具有相同引擎的RTS中使用。
用旧引擎制作新游戏
这很常见。阶段1是淘汰第3层和第4层(如果游戏是完全不同的类型,则淘汰第2层)假设我们是从旧的RTS制作RTS。我们仍然有资源,只是没有晶体和东西-因此第2层和第1层的基类仍然有意义,可以丢弃第3层和第4层引用的所有晶体。我们照做。但是,我们可能会对其进行检查以作为我们想要做的参考。
第1层的污染
这可能发生。抽象和性能是敌人。例如,UE4提供了许多优化的组合案例(因此,如果您希望X和Y有人编写了可以非常快地同时执行X和Y的代码-它知道这两者都在做),因此结果确实很大。这还不错,但是很费时间。第1层将决定诸如“如何将数据传递到着色器”以及如何对事物进行动画处理之类的事情。为您的项目做最好的选择永远是件好事。只是尝试为未来做计划,重用代码是您的朋友,继承有意义的代码。
分类层
最后(我保证)不要太怕分层。引擎是固定功能管道的古老术语,引擎在图形上几乎以相同的方式工作(因此有很多共同点),可编程管道将其抛在脑后,因此“第1层”受到污染开发人员想要达到的任何效果。AI是引擎的显着特征(由于无数种方法),现在它是AI和图形。
您的代码不应归档在这些层中。甚至著名的虚幻引擎都有许多不同的版本,每个版本都针对不同的游戏。只有很少的文件(可能不是类似的数据结构)会保持不变。这可以!如果您要制作另一个新游戏,则需要30分钟以上的时间。关键是要计划,知道要复制和粘贴哪些位以及剩下什么。