sharedObject使用/加载数据的问题

时间:2014-01-13 00:53:18

标签: actionscript-3 shared-objects

我的代码的主要目标是创建一个3x3网格,当您单击该网格中的单元格时,即使关闭fla并再次加载它,也无法再次单击它。 像商店的第一行是升级的第1级,列是其他级别。

enter image description here

它还有2-3个其他的东西 - >网格的每个单元格都有4个鼠标状态。

同样在FLA的第一次加载时,您可以创建3x3网格,并且只能单击第一行中的元素。(如果之前没有Speed1,则无法获得速度2。)

因此,只有在之前单击过同一列的第一个元素时,才能单击列的第二个元素。 对于列的第3个元素也是如此 - >只有在之前点击了第二个时才能点击它。

但是我第二次加载fla后遇到了逻辑问题。 更具体一点:

它正在更改之前点击的元素上的mouseOver / out状态(这很好(因为我想看到)),但它只是让我点击第一行。而且因为我加载 clickedBefore 按钮并从中删除 mouseEvent.CLICK ,如果我没有点击它们的第一个负载,我就无法点击它们中的一些。

我有2个课程:主要

import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.getDefinitionByName;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.Bitmap;
import flash.display.SimpleButton;
import flash.net.SharedObject;

public class Main extends Sprite
{
    private var elementRow:int = 0;
    private var elementCol:int = 0;
    private var myClassImage_Arr:Array = new Array();//this contains the different mouseState Images in Class data.
    private var myBitmapNames_Arr:Array = ["speed1_", "speed2_", "speed3_", 
                                        "time1_", "time2_", "time3_",
                                        "turbo1_", "turbo2_", "turbo3_",];
    //------------------------------------------
    private var index:int = 0;
    private var col:int = 3;
    private var row:int = 3;
    //------------------------------------------
    private var savedData:SharedObject = SharedObject.getLocal("ZZZ_newWAY_nextButton+imageChange_7");
    private var buttonThatHaveBeenClicked_Arr:Array = [];
    private var myButtons_Arr:Array = [];


    public function Main():void
    {
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
    }


    private function init(e:Event = null):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, init);

        for (var i:int = 0; i < col; i++)
        {
            var lastRowElement:BitmapButton = null;

            for (var j:int = 0; j < row; j++)
            {
                for (var k:int = 0; k < 4; k++)//4states of mouse
                {
                    var cls:Class = Class(getDefinitionByName(myBitmapNames_Arr[index] + k));
                    myClassImage_Arr.push(cls);
                }

                var myImage_mc = new BitmapButton(myClassImage_Arr[0 + (index * 4)],
                                                 myClassImage_Arr[1 + (index * 4)],
                                                 myClassImage_Arr[2 + (index * 4)],
                                                 myClassImage_Arr[3 + (index * 4)], i, j);

                myImage_mc.x = 100 + i * (myImage_mc.width + 10);
                myImage_mc.y = 100 + j * (myImage_mc.height + 10);

                myImage_mc.name = "myImage_mc" + index;
                this.addChild(myImage_mc);
                myButtons_Arr.push(myImage_mc)

                myImage_mc.mouseEnabled = false;
                myImage_mc.mouseChildren = false;
                myImage_mc.buttonMode = false;

                myImage_mc.addEventListener("send_SOS", onCustomClick);

                if ( lastRowElement == null )
                {
                    myImage_mc.mouseEnabled = true;
                    myImage_mc.mouseChildren = true;
                    myImage_mc.buttonMode = true;
                }
                else
                {
                    lastRowElement.next_1 = myImage_mc;
                }

                lastRowElement = myImage_mc;

                index++;
            }
        }

        if(savedData.data.myArray == undefined) trace("                               1st time loading this game\n")

        else if(savedData.data.myArray != undefined)
        {
            trace("                               Game was played before\n")

            buttonThatHaveBeenClicked_Arr = savedData.data.myArray;
            var savedData_length:int = savedData.data.myArray.length;

            trace("Buttons that have been clicked before:  "  + buttonThatHaveBeenClicked_Arr + "\n");

            for (var m:int = 0; m < myButtons_Arr.length; m++)
            {
                var myButtons_ArrName:String = myButtons_Arr[m].name

                for (var p:int = 0; p < savedData_length; p++)
                {
                    if(myButtons_ArrName == savedData.data.myArray[p])
                    {
                        myButtons_Arr[m].alpha = 0.9
                        myButtons_Arr[m].buttonMode = false;
                        myButtons_Arr[m].removeEventListener("send_SOS", onCustomClick);
                        myButtons_Arr[m].myInsideBtn.upState = myButtons_Arr[m].image3
                        myButtons_Arr[m].myInsideBtn.overState = myButtons_Arr[m].image4
                    }
                }
            }
        }
    }

    private function onCustomClick(ev:Event):void
    {
        trace(ev.target.name);

        if (ev.target is BitmapButton)
        {
            var btn:BitmapButton = ev.currentTarget as BitmapButton;

            if (btn.next_1 != null)
            {
                btn.next_1.mouseEnabled = true;
                btn.next_1.mouseChildren = true;
                btn.next_1.buttonMode = true;
            }
            btn.mouseChildren = false;
            btn.buttonMode = false;
            btn.removeEventListener("send_SOS", onCustomClick);

            buttonThatHaveBeenClicked_Arr.push( btn.name );
            savedData.data.myArray = buttonThatHaveBeenClicked_Arr;
            savedData.flush();
            savedData.close();
        }
    }
}

}

BitmapButton

import flash.display.Bitmap;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.events.Event;

public class BitmapButton extends Sprite
{
    public var next_1:BitmapButton = null;
    //-----------------------------------
    public var myInsideBtn:SimpleButton = new SimpleButton();

    private var image1:Bitmap;
    private var image2:Bitmap;
    public var image3:Bitmap;
    public var image4:Bitmap;

    public var imageIsInRow:int;
    public var imageIsInCol:int;

    public function BitmapButton(active_OutState:Class, active_OverState:Class, notActive_OutState:Class, notActive_OverState:Class,col:int,row:int)
    {
        image1 = new Bitmap (new active_OutState() );
        image2 = new Bitmap (new active_OverState() );
        image3 = new Bitmap (new notActive_OutState() );
        image4 = new Bitmap (new notActive_OverState() );

        imageIsInRow = row;
        imageIsInCol = col;

        myInsideBtn.upState = image1;
        myInsideBtn.overState = image2;
        myInsideBtn.downState = myInsideBtn.upState;
        myInsideBtn.hitTestState = myInsideBtn.overState;
        addChild( myInsideBtn );

        myInsideBtn.addEventListener(MouseEvent.CLICK, onClick);
    }

    private function onClick(ev:MouseEvent):void
    {
        myInsideBtn.upState = image3;
        myInsideBtn.overState = image4;

        var myNewEvent:Event = new Event("send_SOS");
        this.dispatchEvent(myNewEvent);
        trace("CLICK from inside the button");
    }
}

}

ill也会将其上传到此链接Grid_with_sharedObject并附带拉链。 并且如果有人决定他会提供帮助但是代码要搞砸了,还上传Grod_before_Using_sharedObject

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读您的代码,我会诚实地说您的问题是顺序的。无论出于何种原因,在数据实际被解释为按钮状态之前,就会发生活动和非活动行的设置。因此,当计算机决定是否使其他行可单击时,计算机会将所有按钮视为关闭,然后更新按钮的状态。

我认为解决此问题的最简单方法是将Main()函数拆分为几个子函数,例如updateButtons()用于更改行/按钮是否可点击的函数,和loadData()函数来自SharedObject的加载。在Main()中,将调用放到这些函数中。这将使Main()更易于使用,并且您可以在必要时多次调用函数。

要解决您的特定问题,您需要使用SharedObject FIRST(显然正在工作)获取按钮的数据,然后更新其他按钮是否可点击。

编程的“软技能”提示:遇到问题时,抓一张纸,一支铅笔,然后按照计算机的方式读取代码。是电脑。记下变量及其值的变化。标记何时调用函数。你会发现很多错误。