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