2

所以,让我们在这里想大一点。假设你有一个完整的 MMO 想要组合在一起。自然,这涉及到来自生物、物品、精灵表、瓷砖地图、对话、角色等的大量资源。在典型的游戏引擎中,您会根据一些任意指示符加载或卸载这些资源,例如地图或“区”。

有这个的Javascript版本吗?例如,当游戏循环运行时,您是否能够做到。

(伪代码)

If playerPosition = theRightPlace {
    Load Resources for Next Zone
    Unload Resources for Previous Zone
}

这样做有性能提升吗?还是应该只加载游戏的所有资源并完成它?假设在某些区域我有一个类 UglyMonster,而在另一个区域我有 UglierMonster。

我可以通过 John Resig 的经典继承类结构实例化这两个类(在我点击这个对话启动器之前我一直在使用它,这对于这种程序很方便)

var UglyMonster = Monster.extend({
    Stuff why it is ugly;
    Make a position!
    Attack player!!!
});

var Monster1 = new UglyMonster();

或功能

function UglyMonster(name, position) {
    Create Ugly Monster!!!! Attack player!
    Stuff why it is ugly
}

var Monster1 = new UglyMonster('Fred', 100);

如果我将它们都声明为变量,那么游戏中的所有怪物都坐在全局变量中,不是吗?有没有办法在不实际构造变量的情况下声明变量?我是 Javascript 中整个继承游戏的新手,所以也许我遗漏了一些明显的东西。

处理这些浮动的类的最佳方法是什么?离开他们?删除它们?通过函数实例化?它有明显的不同吗?

我希望我已经足够清楚地说明了我希望实现的目标。谢谢!

4

2 回答 2

2

我不完全确定你在问什么,但是

function UglyMonster(name, position) {
   ...
}

var UglyMonster = function (name, position) {
    ...
}

是等价的表达式。函数是 Javascript 中的对象。在这两种情况下,这些函数都保存为变量并作为属性附加到全局对象上。

这两种方法不会有任何明显的性能差异。

据,直到...为止

有没有办法在不实际构造变量的情况下声明变量?

您可以声明一个变量而不定义它。只是var x;。或者您可以声明一个类构造函数,而无需立即实例化该类的对象。您刚刚定义了一个实际上还没有运行的函数。

更新

关于如何在 javascript 中读取函数的更多背景知识。

当 javascript 引擎解释一个新的作用域时,它首先将代码中的所有变量声明提升到当前作用域(全局作用域或当前函数)的顶部。这些变量然后“存在”但未定义。然后它处理函数声明,因为它们默认移动到顶部。

所以下面的代码

var x = 3+2;

var UglyMonster = function (name, position) {
    ...
}

function UglyMonster2(name, position) {
   ...
}

被解释为好像是这样写的:

var UglyMonster, UglyMonster2,x;

UglyMonster2 = function(name, position) {
   ...
}

x = 3+2;

UglyMonster = function (name, position) {
    ...
}

重要的是要注意在这个例子中实际上没有运行任何函数。它们刚刚被定义。在您运行之前,不会运行任何函数,也不会创建 UglyMonster 的实例

new UglyMonster(). 如果你正在创造许多怪物,那么尽可能长时间地推迟创造这些怪物可能是有价值的。但最终,性能将取决于很多事情,唯一确定的方法就是测试它并自己尝试一下。

于 2013-03-27T03:29:24.180 回答
1

这是很多问题!让我们一一尝试。

我应该加载和卸载我的资源吗?

我相信游戏引擎将资源从磁盘加载到内存中。在浏览器 JavaScript 中,您无法从磁盘读取,必须从网络读取,这很慢。因此,只有在您遇到严重的内存使用问题时才加载/卸载(使用浏览器工具检查)。

如果我将它们都声明为变量,那么游戏中的所有怪物都位于全局变量中

如果你说function UglyMonster的是不同的,那不是。它也在全球范围内。如果您想保持全局范围的清洁,请将您的代码包装在立即调用的函数表达式中:

(function(){}(
    // your code here
));

有没有办法在不实际构造变量的情况下声明变量?

不确定你的意思,但你可以定义对象文字:

var Monster = {
    attack : function() {  },
    eyes : 5
};

您还可以从任何对象继承Object.create

var UglyMonster = Object.create(Monster);

处理这些浮动的类的最佳方法是什么?离开他们?删除它们?通过函数实例化?它有明显的不同吗?

我不知道你在这里问什么!:)

于 2013-03-27T03:37:13.470 回答