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

Save Number with Shared Object and Add to that Saved Number.

大家好,基本上我想要完成的是用共享对象保存一个数字,这个数字是玩家在游戏中收集的硬币,如果他们退出游戏又回来玩的话他退出时拥有的硬币数量仍会显示,如果玩家捡起更多硬币,他将能够增加该数量。我有这个工作了一点,但随后文本字段开始显示 "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。

第一次(或者更确切地说,每次创建新共享对象时)您将尝试将 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;
    }

此外,如果您不手动将值设置为数字变量,它将以 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();
}

然后将 sharedObjectCoins.data.tCoins 的所有其他实例替换为 var tCoins

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

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

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