所以,让我们在这里思考一下。让我们假设你有一个完整的MMO,你想要放在一起。当然,这涉及来自怪物,物品,spritesheets,tilemaps,对话,角色等的大量资源。在典型的游戏引擎中,您可以基于某些任意指示符(例如地图)加载或卸载这些资源或"区"。
这是否有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中整个继承游戏的新手,所以也许我错过了一些明显的东西。
处理这类浮动类的最佳方法是什么?离开他们?删除它们?通过函数实例化?它有明显的区别吗?
我希望我已经清楚地说明了我希望实现的目标。谢谢!
答案 0 :(得分: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()
。如果你正在创造许多怪物,那么尽可能长时间地阻止创造这些怪物可能是有价值的。最后,性能取决于许多事情,唯一可靠的方法是测试它并自己尝试。
答案 1 :(得分:1)
这是很多问题!让我们一个接一个地去。
我相信游戏引擎会将资源从磁盘加载到内存。在浏览器JavaScript中,您无法从磁盘读取,您必须从网络中读取,而且速度很慢。因此,如果您遇到严重的内存使用问题,请仅加载/卸载(使用浏览器工具检查)。
如果你说function UglyMonster
不同,那就不是了。它也在全球范围内。如果要保持全局范围干净,请将代码包装在一个立即调用的函数表达式中:
(function(){}(
// your code here
));
不确定您的意思,但您可以定义对象文字:
var Monster = {
attack : function() { },
eyes : 5
};
您还可以使用Object.create
var UglyMonster = Object.create(Monster);
我不知道你在这里问的是什么! :)