大家好,并提前感谢您的帮助。
我有一个测验,其中包含3个使用共享对象的类别,以及php中的xml。我没有抓住共享对象和xml方面。如果一个玩家只玩,测验很有效。但是如果我将其设置为使用externalinterface window.close注销,那么再次登录它会保留刚刚播放的那一轮之前的分数。实际得分在数据库中更新就好了。但是如果玩家登录共享对象还没有更新。如果浏览器关闭了一段时间,它会这样做。我认为它是从数据库而不是共享对象获取数据。
所以说...玩家1在新游戏中得分200 ... totalscore现在是400.得分提交到数据库。 玩家1退出。 播放器2登录。暂时没有播放。来自数据库的分数加载。 玩家2退出。 播放器1重新登录,但共享对象分数从之前加载,即200.即使我(想)正在使用xml加载分数...并在分数提交到数据库之前刷新共享对象!
PHP看起来像这样......
if ($todo == "login") {
$result = mysqli_query($connect, "SELECT * FROM $nameTable WHERE userpass = '$userpass'
AND username = '$username' ");
if (!$result) {
$msg = ((is_object($connect)) ? mysqli_error($connect) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false));
$string = 'valid=0&err=error query';
} else {
if (mysqli_num_rows($result)== 0) {
$string = 'valid=0&err=no result';
} else {
header('Content-Type: text/xml');
echo "<?xml version='1.0'?>";
//echo "<".$nameTable.">";
while ($data = mysqli_fetch_array($result))
{
echo "<player>";
echo "<username>".$data['username']."</username>";
echo "<userpass>".$data['userpass']."</userpass>";
echo "<userscore>".$data['userscore']."</userscore>";
echo "<cat1>".$data['cat1']."</cat1>";
echo "<cat2>".$data['cat2']."</cat2>";
echo "<cat3>".$data['cat3']."</cat3>";
}//end while
} //end if else result
} //end if else !result
} //end if else login
AS3登录用户就是这个......
else if(e.currentTarget.name == "login_btn")
{
var us:String = mc_now.loginuser.text;
var pa:String = mc_now.loginpass.text;
if(us.length > 0 && pa.length > 0 ) getXML(filePHP+"?todo=login&username="+us+"&userpass="+pa, "login");
positioningInterface(login, 0, 0);
}
AS3中的LoadUser就是这个......
function LoadUser(e:Event):void
{
trace("LoadUser: user is loaded")
xmlLoader.removeEventListener(Event.COMPLETE, LoadUser);
myxml = new XML(e.target.data);
//trace("len",myxml.username != undefined, myxml.length > 0);
if(myxml.username != undefined) {
positioningInterface(welcome, 0, 0);
welcome.username_txt.text = myxml.username;
welcome.msg1_txt.text = "Welcome Back";
welcome.msg2_txt.text = "We hope you are enjoying playing this quiz!";
welcome.displayscore.text = myxml.userscore;
mySO.data.registered = isRegistered = true;
nameActive = myxml.username;
TotalScore = myxml.userscore;
cat1 = myxml.cat1;
cat2 = myxml.cat2;
cat3 = myxml.cat3;
mySO.data.cat1 = cat1;
mySO.data.cat2 = cat2;
mySO.data.cat3 = cat3;
mySO.data.userSO = nameActive;
mySO.data.TotalScore = TotalScore; /// TotalScore is the sum of the category scores
mySO.flush();
trace("LoadUser",mySO.data.userSO)
} else
{
//if login failed, display login again, failed login text, clear text
positioningInterface(login, 0, 0);
login.loginuser.text = "Login Failed";
setTimeout(function() {login.loginuser.text = "";login.loginpass.text = "";}, 1000);
}
}
我认为getSO和fillSO是正确的。 varSend正在正常提交分数。 如上所述一切正常,直到玩家退出。我已经尝试在注销时清除共享对象,以便新玩家可以登录(工作正常),但如果第一个玩家在第二个玩家之后重新登录,则玩家1的SO没有更新。该死的东西不会更新分数!似乎有某种延迟。如上所述,如果浏览器关闭并且玩家登录,比如第二天,那么它将从数据库中加载正确的分数。我希望我有道理。我不知道我做错了什么。这让我疯狂!
如果有帮助,请添加更多信息......
首次启动游戏时以及界面初始化时检查共享对象...
function checkingSO()
{
if (mySO.data.registered || mySO.data.loggedOn)
{
isRegistered = mySO.data.registered = true;
getSO();
}
else
{
trace("checkso: SO is empty");
fillSO();
}
}
获取共享对象...
function getSO()
{
nameActive = mySO.data.userSO;
cat1 = mySO.data.cat1;
cat2 = mySO.data.cat2;
cat3 = mySO.data.cat3;
TotalScore = sumAllScore();
trace("getso |", "register:",isRegistered,"name:",mySO.data.userSO, "points cat:",cat1,cat2,cat3,cat4,cat5,cat6, "tot:",TotalScore);
}
填写共享对象......
function fillSO()
{
mySO.data.cat1 = cat1;
mySO.data.cat2 = cat2;
mySO.data.cat3 = cat3;
TotalScore = sumAllScore();
mySO.data.TotalScore = TotalScore;
mySO.flush();
trace("checkScore |", "register:",isRegistered,"name:",nameActive, "points cat:",cat1,cat2,cat3, "tot:",sumAllScore() ;
}
如前所述,我发现阵列确实令人困惑。我在分割数组中有类别,但我将它们分开,因为我不知道如何将数组放入数组中。 Akmozo的建议是我以前尝试过的,我认为这对我的问题是正确的。但我被卡住了!
答案 0 :(得分:0)
我认为缓存存在问题。在您的请求中添加nocache-pseudo-var:
getXML(filePHP+"?todo=login&username="+us+"&userpass="+pa+"&nocache="+Math.random(),"login");
答案 1 :(得分:0)
我认为您为所有用户使用相同的SharedObject
,这就是为什么您的数据总是被覆盖的原因。为避免这种情况,您可以为每个用户使用SharedObject
,如下所示:
var users:Array = [
{'_name': 'user_01', '_score': 123},
{'_name': 'user_02', '_score': 567}
]
var my_so:SharedObject;
for(var i:int = 0; i < users.length; i++){
var user_name:String = users[i]._name,
user_score:Number = users[i]._score;
my_so = SharedObject.getLocal(user_name);
// if we have already saved data for the current user
if(my_so.data.score){
trace('user name : ', user_name, ', user score : ', my_so.data.score);
// gives :
// user name : user_01 , user score : 123
// user name : user_02 , user score : 567
}
// set data in our SharedObject
my_so.data.score = user_score;
}
my_so.flush();
希望可以提供帮助。