0

Shake&Fidget に似た Flex で「ゲーム」を作ろうとしています。すべてのユーザー データを 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 クラスについては、次のとおりです。

Character.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 試してみると、次のエラーが表示されます。data.modStats の代わりに Character::modStats(...) を使用して char_panel.mxml で試しました。エラー ログをこの下に置きます。

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] at 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$ を Namespace に変換できません。ビューで::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] at 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::

このヘルプをここまで読んでくれたすべての人に感謝します。

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 に答える