使用共享对象保存号码并添加到该已保存号码。

时间:2015-01-29 23:13:50

标签: actionscript-3 save flash-cs6 shared-objects

嘿大家所以我基本上想要完成的是用共享对象保存一个数字,玩家在游戏中收集硬币,如果玩家退出游戏并再次回来玩游戏的数量他退出时所拥有的硬币仍会显示,如果玩家拿到更多硬币,他将能够增加这笔金额。我有一点工作,但文本字段开始显示“NAN”。

以下是我如何设置它。

变量private var nCoins:Number;

在构造函数中我有:

sharedObjectCoins = SharedObject.getLocal("CoinsData");

        nCoins = 0 + sharedObjectCoins.data.tCoins;

        if (sharedObjectCoins.data.tCoins == null)
        {
             sharedObjectCoins.data.tCoins = nCoins;

        }else 
         {
               trace("Save data found."); // if we did find data...
               loadDataTimeAttack(); // ...load the data
         }

在游戏Enter.Frame循环中,我有一个函数saveDataCoins,其设置如下:

    private function saveDataCoins():void 
    {

        if (nCoins > sharedObjectCoins.data.tCoins )
        {
            sharedObjectCoins.data.tCoins = nCoins; 
        }


        coinsGraphic.coinsText.text = " " + sharedObjectCoins.data.tCoins;
        sharedObjectCoins.flush();

    }

不确定你是否需要在硬币和玩家之间进行hitTest的功能,但这里是:

private function checkPlayerHitCoins():void 
    {

        for (var i:int = 0; i < aCoinsArray.length; i++)
            {
                //get current point in i loop
                var currentCoins:mcCoin = aCoinsArray[i];

                //test if  player is hitting current point
                if(player.hitTestObject(currentCoins))
                {

                    nCoins += 1;
                    updatecoinsTextScore();
                    updateCoinsPauseScreen();
                    //Add points sound effects
                   var coinsSEffect:Sound = new coinsSound();
                   coinsSEffect.play();

                    //remove point on stage
                    currentCoins.destroyCoins();
                    //remove points from array
                    aCoinsArray.splice(i, 1);
                    trace("Hit:  " + aCoinsArray.length);
                }
            }
    }

如果有人可以帮助我,请指出我做错了。这段代码工作完美一次,当我关闭屏幕并回来重新测试它时,文本字段显示NAN,当我点击测试硬币时,NAN有时会切换到一个数字,然后返回到NAN。

1 个答案:

答案 0 :(得分:1)

第一次(或者更确切地说,每次创建新的共享对象时),您将尝试将undefined添加到0,这将导致运行时错误或NaN

在尝试添加值之前,您需要检查该值是否存在。

    if(sharedObjectCoints.data && sharedObjectCoins.data.tCoins && !isNaN(sharedObjectCoins.data.tCoins)){
         nCoins = Number(sharedObjectCoins.data.tCoins); //there's not point in adding 0
         trace("Save data found."); // if we did find data...
         loadDataTimeAttack(); // ...load the data
    }else{
         sharedObjectCoins.data.tCoins = nCoins;
    }

此外,如果您不手动将值设置为数字var,它将从NaN开始。例如,var nCoins:Number将为NaN,直到您将其设置为某个内容。

也就是说,像这样直接使用sharedObject是一种非常草率的编码程序的方法。实际上你应该只使用共享对象来加载和保存值,其间的所有内容都使用强类型变量。

var nCoins:int = 0;
var tCoins:int = 0;

sharedObjectCoins = SharedObject.getLocal("CoinsData");
if(sharedObjectCoins.data && sharedObjectCoins.data.tCoins && !isNaN(sharedObjectCoins.data.tCoins){
    tCoins = int(sharedObjectCoins.data.tCoins);
}else{
    //no shared object, use default value for tCoins
    tCoins = 0; //or whatever it should start off as.
}

然后编写保存功能

private function saveSharedObject():void {
    sharedObjectCoins.data.tCoins = tCoins;
    sharedObjectCoins.flush();
}

然后用var sharedObjectCoins.data.tCoins

替换tCoins的所有其他实例

出于性能目的,最好不要每帧刷新共享对象。

此外,共享对象可能会或可能不会实际保存,具体取决于用户首选项,可用存储空间等。不应依赖它们来保留关键数据。

您可以使用AsyncErrorEvent.ASYNC_ERROR来监听共享对象的问题我相信(自从我使用AS3共享对象以来已经有一段时间了)