0

我有一个纯 ActionScript 3 的问题,但我准备的简化测试用例在 Flex 4 中以获得更好的可见性(源代码如下):

在此处输入图像描述

由于 Flash Player 11 / AIR 3 原生支持 JSON,我决定将使用 XML 与服务器通信的多人游戏迁移到 JSON。

但是我有一个令人沮丧的问题,给定两个对象,例如

                { 9013: [
                    "OK305894249541",
                    "OK151358069597",
                    "OK515549948434",
                ] },
                { 8991: [
                    "OK253525117889",
                    "OK529081480134",
                ] },

我不知道如何创建一个 ActionScript 函数,它会为第一个对象报告 3,为第二个对象报告 2?

上例中的“9013”和“8991”是游戏号码。

“OKxxxx”字符串代表玩家。

当一个游戏有 3 个玩家时,它是“满的”,否则是“空的”。

这是我非常简单的TestCase.mxml

<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    creationComplete="init(event)">

    <fx:Declarations>
        <s:RadioButtonGroup id="_filter" change="handleRadio(event);" />
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;

            [Bindable]
            private var _games:ArrayCollection = new ArrayCollection();

            [Bindable]
            private var _all:uint = 0;

            [Bindable]
            private var _vac:uint = 0;

            [Bindable]
            private var _full:uint = 0;

            private function vacantGame(obj:Object):Boolean {
                // XXX how to implement?
                // XXX return true if obj has less than 3 players
                return true;
            }

            private function fullGame(item:Object):Boolean {
                // XXX how to implement?
                // XXX return true if obj has exactly 3 players
                return true;
            }

            private function init(event:FlexEvent):void {
                var i:uint;

                _games.source = OBJ['games'];

                _all = _games.length;

                _vac = 0;
                for (i = 0; i < _games.length; i++)
                    if (vacantGame(_games[i]))
                        _vac++;

                _full = 0;
                for (i = 0; i < _games.length; i++)
                    if (fullGame(_games[i]))
                        _full++;
            }

            private function handleRadio(event:Event):void {
                switch (_filter.selection) {
                    case _allBtn:
                        _games.filterFunction = null; 
                        break;
                    case _vacBtn:
                        _games.filterFunction = vacantGame;
                        break;
                    case _fullBtn:
                        _games.filterFunction = fullGame;
                        break;
                }
                _games.refresh();
            }

            private const OBJ:Object = {
                lobby: [
                    "OK108900197210",
                    "OK266559712237",
                    "DE6577",
                    "DE7981",
                    "OK225312168135",
                    "OK20629248715",
                    "DE7880",
                ],
                games: [
                    { 0: [] },
                    { 9012: [
                        "VK48058967",
                        "MR14315189992643135976",
                        "OK10218913103",
                    ] },
                    { 9013: [
                        "OK305894249541",
                        "OK151358069597",
                        "OK515549948434",
                    ] },
                    { 8991: [
                        "OK253525117889",
                        "OK529081480134",
                    ] },
                    { 8937: [
                        "OK304672497140",
                        "VK90145027",
                        "OK338360548262",
                    ] },
                    { 9005: [
                        "OK40798070412",
                        "DE7979",
                        "OK531589632132",
                    ] },
                    { 9010: [
                        "OK357833936215",
                    ] },
                ]
            };
        ]]>
    </fx:Script>

    <s:HGroup verticalAlign="baseline">
        <s:Label text="Games:" />
        <s:RadioButton id="_allBtn" group="{_filter}" label="All: {_all}" selected="true" />
        <s:RadioButton id="_vacBtn" group="{_filter}" label="Vacant: {_vac}" />
        <s:RadioButton id="_fullBtn" group="{_filter}" label="Full: {_full}" />
    </s:HGroup>
</s:Application>
4

1 回答 1

1

正确的答案是重新考虑你的数据结构。放下周围的数组,反正所有游戏都有一个唯一的ID。

但如果你坚持如上使用它,你可以做到以下几点:

private function vacantGame(obj:Object):Boolean{
    for( var gameNumber : String in obj ){
        var players : Array = obj[ gameNumber ]
        return players.length < 3
    }
    return false;
}

更好的方法:

games: {
    0: [],
    9012: [
        "VK48058967",
        "MR14315189992643135976",
        "OK10218913103",
    ],
    9013: [
        "OK305894249541",
        "OK151358069597",
        "OK515549948434",
    ],
    ...
}

然后

for( var gameNumber : String in OBJ.games ){
    var players : Array = OBJ.games[ gameNumber ];
    if( players.length < 3 ){
        //vacant
    }else{
        //full
    }
}
于 2012-02-23T18:47:20.963 回答