让我们往大的方面想。假设你想要整合一款完整的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中整个继承游戏的新手,所以也许我错过了一些明显的东西。
处理这些类的最好方法是什么?离开他们吗?删除它们吗?通过函数实例化?它有明显的不同吗?
我希望我已经清楚地说明了我希望完成的任务。谢谢你!我不太确定你在问什么,但是
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()
。如果你正在创造许多怪物,那么尽可能拖延创造这些怪物是有价值的。但最终,性能将取决于许多因素,唯一可靠的方法是测试它并亲自尝试。
问题真多!让我们试着一个一个地走。
我应该加载和卸载资源吗?
我相信游戏引擎将资源从磁盘加载到内存。在浏览器JavaScript中,你不能从磁盘读取,你必须从网络读取,这很慢。所以只有加载/卸载,如果你有严重的内存使用问题(使用浏览器工具来检查)。
如果我将它们都声明为变量,那么游戏中的所有怪物都位于全局变量
如果你说function UglyMonster
是不同的,它不是。它也在全球范围内。如果您希望保持全局作用域的整洁,请将代码包装在一个立即调用的函数表达式中:
(function(){}(
// your code here
));
是否有一种方法来声明变量而不实际构造它们?
不确定你的意思,但你可以定义对象字面量:
var Monster = {
attack : function() { },
eyes : 5
};
您也可以从任何对象继承Object.create
:
var UglyMonster = Object.create(Monster);
处理这些类的最好方法是什么?离开他们吗?删除它们吗?通过函数实例化?它有明显的不同吗?
我不知道你在问什么!:)