使用SharedObject / AS3加载影片剪辑

时间:2014-01-23 18:48:48

标签: actionscript-3 flash shared-objects

好的,所以我正在开展一个问答游戏。我有自己的影片剪辑中的每个问题(我知道这不是首选的方法,但这是我最熟悉的,压缩的项目时间轴有点强迫我的手。)

因为玩家只能玩一次游戏(涉及到奖品),所以我试图实施一个“保存/加载”系统,允许玩家在他们离开的地方继续拾取,以防他们的浏览器崩溃,他们不小心关闭了游戏窗口等。我已经有SO设置来接受保存数据。例如,我在Q1场景的第1帧上有以下代码:

var currentLevel = "Q1"; //first time the var is defined. "Q1" is the name of the scene
answersSO.data.currentLevel = currentLevel;
answersSO.flush();

我在电影的第一个场景的第1帧上有以下代码:

function checkProgress() {
if(answersSO.data.currentLevel != undefined) {
    currentLevel = answersSO.data.currentLevel;
    MovieClip(this.root).gotoAndPlay(1, currentLevel);
} else {
    gotoAndPlay(2);
}
}

checkProgress();

首先,我要说我是AS的真正小结。我测试游戏直到Q1场景,然后关闭窗口。我重新启动游戏,它立即跳过场景1的所有内容并进入场景2(这是游戏的介绍,而不是Q1)。没有错误。

我要做的是将一些数据保存到currentLevel变量,并将该变量保存到SO。在游戏开始时,脚本应检查SO中是否有任何数据。如果没有,则没有保存数据 - 正常进行。如果数据,请加载它并播放播放器所在的最后记录的场景。

我无法弄清楚(1)如何使这个工作和(2),不太重要,为什么没有错误抛出。

EDIT!

这是我更新的代码:

stop();

import flash.net.SharedObject;

var answersSO:SharedObject = SharedObject.getLocal("PWFGame"); //DECLARE SO VARIABLE
var currentProgress = "";

//CHECK SO FOR PROGRESS
checkProgress();

function checkProgress() {
if(answersSO.data.currentLevel == null) {
    nameField.text = "Enter Name Here";
    gotoAndPlay(2);
} else {
    currentProgress = answersSO.data.currentLevel;
    MovieClip(this.root).gotoAndPlay(1, currentProgress);
}
}

可以正常工作,但else语句中的最后一行表现得很奇怪。它完全跳过第一个场景并播放第1帧的下一个场景(称为“简介”)。即使我将currentProgress更改为"Q1",它也会做同样的事情。为什么这行代码在其他地方工作而不在这里呢?

2 个答案:

答案 0 :(得分:0)

用户可以删除SharedObjects。玩家可以删除该文件并重新开始。 如果有登录名,则应使用服务器端脚本(php,asp等)将该数据存储在服务器上。

因此,在开头添加一个检查,让用户在他的名字尚未存储在服务器上时播放。比在游戏开始时将这个列表格式称为flash。

对于浏览器崩溃,您只能在游戏结束时存储数据。因此,当您刷新页面时,您可以再次启动它。

如果没有用户名,你应该得到其他数据,但它并不是那么简单,因为IP可能会改变,更多重要的数据无法通过Flash播放器检索(你可以用桌面应用程序来做到这一点)与AIR)。

在...... .gotoAndPlay(1,currentLevel);

记住第一个值是场景,第二个值是帧。

纳迪亚

答案 1 :(得分:0)

好的,经过多次挖掘,我发现第1帧gotoAndPlay()可能会导致问题。我将更新的代码块(见上文)移到了第2帧,一切正常。