我的问题有点模糊,所以让我详细说明一下。我是一名初学程序员,正在开发我的第一个Flash游戏,就问题而言,这是一个像马里奥这样的横向滚动平台游戏。然而,与传统的平台游戏不同,等级将无限期地持续,直到玩家死亡或退出游戏。该级别是基于区块的,将通过一个数组自动生成,该数组指定每个图块中的对象(如果没有对象,则为0)。为了确保我的游戏不会因过多的物体而自动崩溃,我会在玩家前进的过程中生成更多的地图(通过创建对象的新实例),这样当玩家向右移动时,地图就会在边缘生成的屏幕。
现在回到手头的问题,我猜测一旦玩家到达游戏中的某个点,它将开始减速,因为正在创建越来越多的对象。 我假设这个问题的解决方案是在播放器进展时移除屏幕左侧的实例,但问题是我需要玩家能够回到关卡。
所以我的问题是:我怎样才能删除'或者从内存中删除实例,这样我的游戏就不会慢下来,但是当玩家移动到该实例所在位置(或者是)的某个附近时,还可以恢复实例。
注意:目前除玩家外,我在游戏中唯一的对象是“墙”。对象的所有实例都存储在' Wallarray'我目前仅用于引用Wall实例进行冲突检测的数组
答案 0 :(得分:0)
请参阅我的评论,但无论哪种方式,它都可能是相同的答案。阅读SharedObject类,并使用SharedObjects进行一些简单的实验,将有关对象的信息写入磁盘,并重新读取该信息。
答案 1 :(得分:0)
我的建议是将游戏模型从其视角中分离出来。您将整个级别模型存储在一个单独的类和一个视图中,该视图将可见模型的部分呈现在舞台上。渲染引擎将删除屏幕外的可视对象,并创建可见的可视对象。您的模型将发送一些事件以通知您有关其更改的视图。希望这会有所帮助。
答案 2 :(得分:0)
我建议您使用对象池:当您的对象不再可见时,您可以将它们放在临时数组中,当您需要新对象时,而不是创建新对象,您可以从此数组中获取一个。
这里是他的游泳池对象的一个例子:
package
{
public class Pooled extends MovieClip
{
/** the array containg objects created and not used **/
protected static var _pool :Vector.<Pooled>;
/** the number of objects in the pool **/
protected static var _nbItems :int;
public function Pooled()
{
}
/** a function to dispose the object **/
public function dispose():void
{
// do what you want here for release memory
}
/** the function to call to release the object and return it to the pool **/
public function release():void
{
// do what you want here, stop animations, remove from parent, remove listeners ...
// put it in the pool
_pool[_nbItems++] = this;
}
/** a static function to initialize the object and to create the pool **/
public static function init():void
{
_pool = new Vector.<Pooled>();
_nbItems = 0;
}
/** a static function to get an object from the pool **/
public static function get():Pooled
{
var a :Pooled;
if( _nbItems > 0 )
{
a = _pool.pop();
_nbItems--;
}
else
{
a = new Pooled();
}
return a;
}
/** a static function to destroy objects and the pool **/
public static function dispose():void
{
for( var i:int = 0; i<_nbItems; ++i ) _pool[i].dispose();
_pool.length = 0;
_pool = null;
}
}
}
您必须首先调用静态init方法来创建池数组。
之后使用new Pooled();
而不是使用Pooled.get();
创建对象,如果可用,它将从池返回项目,如果没有,它将创建一个新项目。
如果您不再需要对象,可以调用release()
函数,对象将被移动到池中。
使用此技术,内存中的最大对象将同时是最大显示对象。当池包含对象时,您可以避免创建新对象的时间。
希望这可以帮到你。