【问题标题】:AS3 Shared Object not flushing correctly and XML/PHPAS3 共享对象未正确刷新和 XML/PHP
【发布时间】:2015-06-18 05:30:19
【问题描述】:

大家好,提前感谢您的帮助。

我有一个使用共享对象和 php 中的 xml 的 3 个类别的测验。我没有掌握共享对象和 xml 方面。如果一个玩家只玩,测验效果很好。但是,如果我将其设置为使用 externalinterface window.close 注销然后再次登录,它会保留刚玩过的那一轮之前的分数。实际分数在数据库中更新得很好。但是如果玩家重新登录共享对象并没有更新。如果浏览器关闭一段时间,它会这样做。我认为它是从数据库中获取数据,而不是从共享对象中获取数据。

所以说...玩家 1 在新游戏中得分 200 ...总分现在是 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 的建议是我之前尝试过的,我认为这是解决我的问题的正确方法。但是我卡住了!

【问题讨论】:

  • 嗯...到目前为止,我收到的 2 个回复都是关于纠正我的语法的!我会告诉陪审团,这些“编辑”在说英语和写英语方面没有我那么多经验。请停止并停止!我想回答我的问题。谢谢。

标签: php mysql xml actionscript-3


【解决方案1】:

我认为缓存有问题。在您的请求中添加一个 nocache-pseudo-var:

getXML(filePHP+"?todo=login&username="+us+"&userpass="+pa+"&nocache="+Math.random(),"login");

【讨论】:

  • 遗憾的是,这不起作用安德烈。它从数据库中得到正确的分数没有问题,所以这部分是固定的。但是当新一轮开始时,它也会清除数据,即当用户登录然后玩游戏时,所有类别分数和总分都重置为零。那里的任何人......请在这方面花费数周时间,我需要一个解决方案!
  • 你能显示跟踪输出吗? mySO 初始化在哪里?
【解决方案2】:

我认为您为所有用户使用相同的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();

希望能有所帮助。

【讨论】:

  • 谢谢 akmozo。是的,制作一个数组是有道理的。但是如何将其合并(或替换)到现有代码中?我是否要将您的代码添加到 LoadUser?对不起,我是一个真正的菜鸟。
  • 另外,让我对数组感到困惑的是,当示例与已知数据一起给出时,例如您给出了实际分数。但是在数据未知的情况下如何写数组呢?非常感谢您的帮助。
  • @WhizzBangQuizzes 这里最重要的是如何使用SharedObjects,忘记数组,你的代码中不需要它,我只是用来存储我的用户。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多