0

我正在尝试在 Flex 中制作类似于 Shake&Fidget 的“游戏”。我将所有用户数据保存在 mysql 数据库中,并使用 ZendFramework (PHP) 检索数据。我想将我需要的所有用户和角色信息保存到 AS 类中,这样我就可以在每个视图中使用这些数据。

从数据库接收的数据是正确的。我能够将它加载到我的应用程序标签中,但每次我更改视图时,它都必须再次询问,所以我想制作这个课程以便只询问一次信息。

我会把文件贴在这里,这样就更清楚了。

ViewNavigatorAplication.mxml

<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                        xmlns:s="library://ns.adobe.com/flex/spark"
                        firstView="views.RotrHomeView"
                        persistNavigatorState="true">
<fx:Script>
    <![CDATA[
        import flash.net.registerClassAlias;

        import valueObjects.Character;

        registerClassAlias("Character", valueObjects.Character);
    ]]>
</fx:Script>

第一个视图进入登录屏幕,它工作正常。因此,我将转到加载并“尝试”显示字符数据的视图。

char_panel.mxml

<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:usersservice1="services.usersservice1.*"
    title="Character Sheet" 
    viewActivate="char_panel_viewActivateHandler()">
<fx:Script>
    <![CDATA[
        import mx.binding.utils.*;
        import mx.events.FlexEvent;
        import mx.rpc.events.ResultEvent;

        import valueObjects.Character;

        //[Bindable]protected var character:Character = new Character();

        public function updateStats():void{
            var str:int = parseInt(getGlobalStatsResult.lastResult.globalSTR) + parseInt(getCharacterStatsResult.lastResult.str);
            var dex:int = parseInt(getGlobalStatsResult.lastResult.globalDEX) + parseInt(getCharacterStatsResult.lastResult.dex);
            var intel:int = parseInt(getGlobalStatsResult.lastResult.globalINT) + parseInt(getCharacterStatsResult.lastResult.intel);
            var cha:int = parseInt(getGlobalStatsResult.lastResult.globalCHA) + parseInt(getCharacterStatsResult.lastResult.cha);
            var sta:int = parseInt(getGlobalStatsResult.lastResult.global_VIT) + parseInt(getCharacterStatsResult.lastResult.vit);              
            data.modStats(str,intel,cha,sta,dex)
            data.showStats(lb_show_str,lb_show_dex,lb_show_int,lb_show_cha,lb_show_vit);
            //character.showStats(lb_show_str,lb_show_dex,lb_show_int,lb_show_cha,lb_show_vit);

        }

        public function char_panel_viewActivateHandler():void{
            if(!data){
                data = new Character();
            }
            getCharacterStatsResult.token = usersService1.getCharacterStats("user01");
            getGearListResult.addEventListener(ResultEvent.RESULT,onResult);
            getGearListResult.token = usersService1.getGearList();
        }
        public function onStatsResult(event:ResultEvent):void{
            if(getGlobalStatsResult.lastResult.globalSTR != null){
                updateStats();
            }
        }

        public function onResult(event:ResultEvent):void{
            if(getGearListResult.lastResult[0].itemName != null){
                getGlobalStatsResult.addEventListener(ResultEvent.RESULT, onStatsResult);
                getGlobalStatsResult.token = usersService1.getGlobalStats("user01");

                currentState = "Character";

            }
        }
    ]]>
</fx:Script>
<s:states>
    <s:State name="Loading"/>
    <s:State name="Character"/>
</s:states>
<fx:Declarations>
    <s:CallResponder id="getCharacterStatsResult"/>
    <s:CallResponder id="getGearListResult"/>
    <s:CallResponder id="getGlobalStatsResult"/>
    <usersservice1:UsersService1 id="usersService1"/>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Label id="lb_show_str" includeIn="Character" x="119" y="46" text=""/>
<s:BusyIndicator includeIn="Loading" left="172" right="171" top="148" bottom="424"
                 horizontalCenter="0" verticalCenter="-138"/>
<s:Label id="lb_show_int" includeIn="Character" x="119" y="90"/>
<s:Label id="lb_show_cha" includeIn="Character" x="119" y="139"/>
<s:Label id="lb_show_vit" includeIn="Character" x="119" y="191"/>
<s:Label id="lb_show_dex" includeIn="Character" x="119" y="243"/>

至于 AS 类:

字符.as

package valueObjects{
import mx.data.ChangedItems;
import mx.messaging.channels.StreamingAMFChannel;

import spark.components.Label;
import spark.skins.spark.StackedFormHeadingSkin;

[Bindable]
public class  Character
{
    private var _name:String;
    private var _stats:FinalStats;
    private var _gear:GearList;

    public function Character()
    {
        this._stats = new FinalStats();
        this._gear = new GearList();
    }
    public function modStats(str:int,intel:int,cha:int,sta:int,dex:int):void{
        this._stats.modStr(str);
        this._stats.modInt(intel);
        this._stats.modCha(cha);
        this._stats.modVit(sta);
        this._stats.modDex(dex);
    }
    public function getStats():Array{
        var aStats:Array;
        aStats["str"]=this._stats.getStr();
        aStats["int"]=this._stats.getInt();
        aStats["cha"]=this._stats.getCha();
        aStats["sta"]=this._stats.getVit();
        aStats["dex"]=this._stats.getDex();
        return aStats;
    }
    public function setName(charName:String):void{
        this._name = charName;
    }
    public function getName():String{
        return this._name;
    }
    public function showStats(lbSTR:Label, lbDEX:Label, lbINT:Label, lbCHA:Label, lbVIT:Label):void{
        lbSTR.text = "" + this._stats.getStr();
        lbDEX.text = "" + this._stats.getDex();
        lbINT.text = "" + this._stats.getInt();
        lbCHA.text = "" + this._stats.getCha();
        lbVIT.text = "" + this._stats.getVit();
    }
}}

FinalStats.as

package valueObjects{

public class FinalStats
{
    private var str:int = 0;
    private var intel:int = 0;
    private var cha:int = 0;
    private var sta:int = 0;
    private var dex:int = 0;
    public function FinalStats()
    {
    }

    public function getStr():int{
        return this.str;
    }
    public function modStr(x:int):void{
        this.str+=x;
    }
    public function getDex():int{
        return this.dex;
    }
    public function modDex(x:int):void{
        this.dex+=x;
    }
    public function getInt():int{
        return this.intel;
    }
    public function modInt(x:int):void{
        this.intel+=x;
    }
    public function getCha():int{
        return this.cha;
    }
    public function modCha(x:int):void{
        this.cha+=x;
    }
    public function getVit():int{
        return this.sta;
    }
    public function modVit(x:int):void{
        this.sta+=x;
    }
}

}

最后一个 GearList.as

package valueObjects{
import mx.data.ChangedItems;
import mx.messaging.channels.StreamingAMFChannel;

import spark.components.Label;
import spark.skins.spark.StackedFormHeadingSkin;

public class GearList
{
    private var _headID:String;
    private var _shoulderID:String;
    private var _chestID:String;
    private var _bracersID:String;
    private var _glovesID:String;
    private var _pantsID:String;
    private var _bootsID:String;
    private var _main_handID:String;
    private var _off_handID:String;

    public function GearList()
    {
    }

    public function showStats(lbHead:Label, lbShoulder:Label, lbChest:Label, lbBracer:Label, lbGlove:Label, lbPants:Label, lbBoots:Label, lbMainHand:Label, lbOffHand:Label):void{
        lbHead.text = ""+this._headID;
        lbShoulder.text = ""+this._shoulderID;
        lbChest.text = ""+this._chestID;
        lbBracer.text = ""+this._bracersID;
        lbGlove.text = ""+this._glovesID;
        lbPants.text = ""+this._pantsID;
        lbBoots.text = ""+this._bootsID;
        lbMainHand.text = ""+this._main_handID;
        lbOffHand.text = ""+this._off_handID;
    }

    public function getOff_handID():String
    {
        return _off_handID;
    }

    public function setOff_handID(value:String):void
    {
        _off_handID = value;
    }

    public function getMain_handID():String
    {
        return _main_handID;
    }

    public function setMain_handID(value:String):void
    {
        _main_handID = value;
    }

    public function getBootsID():String
    {
        return _bootsID;
    }

    public function setBootsID(value:String):void
    {
        _bootsID = value;
    }

    public function getPantsID():String
    {
        return _pantsID;
    }

    public function setPantsID(value:String):void
    {
        _pantsID = value;
    }

    public function getGlovesID():String
    {
        return _glovesID;
    }

    public function setGlovesID(value:String):void
    {
        _glovesID = value;
    }

    public function getBracersID():String
    {
        return _bracersID;
    }

    public function setBracersID(value:String):void
    {
        _bracersID = value;
    }

    public function getChestID():String
    {
        return _chestID;
    }

    public function setChestID(value:String):void
    {
        _chestID = value;
    }

    public function getShoulderID():String
    {
        return _shoulderID;
    }

    public function setShoulderID(value:String):void
    {
        _shoulderID = value;
    }

    public function getHeadID():String
    {
        return _headID;
    }

    public function setHeadID(value:String):void
    {
        _headID = value;
    }

}}

如果您还在这里,您将受到我的尊重:D 当我尝试时,我收到以下错误。我已经尝试在 char_panel.mxml 中使用 Character::modStats(...) 而不是 data.modStats 我将把错误日志放在这个日志下面。

使用 data.modStats(...) 时的错误日志

TypeError:错误 #1006:modStats 不是函数。在意见::char_panel/updateStats()[C:\Users\Zebrah\Rotr\Rotr\src\views\char_panel.mxml:23] 在意见::char_panel/onStatsResult()[C:\Users\Zebrah\Rotr\ Rotr\src\views\char_panel.mxml:39] 在 flash.events::EventDispatcher/dispatchEventFunction() 在 flash.events::EventDispatcher/dispatchEvent() 在 mx.rpc::CallResponder/result()[E:\dev \4.5.1\frameworks\projects\rpc\src\mx\rpc\CallResponder.as:122] 在 mx.rpc::AsyncToken/http://www.adobe.com/2006/flex/mx/internal:: applyResult()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncToken.as:239] 在 mx.rpc.events::ResultEvent/http://www.adobe.com /2006/flex/mx/internal::callTokenResponders()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\events\ResultEvent.as:207] 在 mx.rpc::AbstractOperation /http://www.adobe。

使用 Character::modStats(...) 的错误日志

错误:错误 #1034:类型强制失败:无法将 valueObjects::Character$ 转换为命名空间。在意见::char_panel/updateStats()[C:\Users\Zebrah\Rotr\Rotr\src\views\char_panel.mxml:23] 在意见::char_panel/onStatsResult()[C:\Users\Zebrah\Rotr\ Rotr\src\views\char_panel.mxml:39] 在 flash.events::EventDispatcher/dispatchEventFunction() 在 flash.events::EventDispatcher/dispatchEvent() 在 mx.rpc::CallResponder/result()[E:\dev \4.5.1\frameworks\projects\rpc\src\mx\rpc\CallResponder.as:122] 在 mx.rpc::AsyncToken/http://www.adobe.com/2006/flex/mx/internal:: applyResult()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\AsyncToken.as:239] 在 mx.rpc.events::ResultEvent/http://www.adobe.com /2006/flex/mx/internal::callTokenResponders()[E:\dev\4.5.1\frameworks\projects\rpc\src\mx\rpc\events\ResultEvent.as:207] 在 mx.rpc::

在此先感谢任何到目前为止在此帮助中哭泣的人:D 我会感谢您提出的任何建议。

4

2 回答 2

0

好的,所以它不适用于数据的原因是那个事件,尽管你说

data = new Character();

data 实际上仍然是一个对象(现在看起来像一个字符)。让它发挥作用

var myChar:Character = Character(data); // cast it to a Character and it now knows the method
myChar.modStats()

另一个调用不起作用的原因是您调用它的方式:

Character::modStats(...)

这就是说在命名空间 Character 中寻找一个名为 modStats 的方法。而是调用这个

character.modStats()

它会起作用。

于 2013-01-09T21:35:39.287 回答
0

先生,您是我的个人英雄:D,我刚刚尝试过,它显示了数据。

我更改了 Character.AS 中角色的构造函数,如下所示:

public function Character(obj:Object)
    {
        this._stats = new FinalStats();
        this._gear = new GearList();
    }

我不完全确定这是否正确,但正如您在回答中提到的那样:

var myChar:Character = Character(data);  

我想我将不得不使用该数据对象来初始化 myChar ......我对吗?好吧,稍后当我有时间时,我会尝试添加新的视图和按钮来浏览视图并查看数据是否存在:D

于 2013-01-10T08:01:18.063 回答