Actionscript 3 sharedObject使用/加载数据的问题

Actionscript 3 sharedObject使用/加载数据的问题,actionscript-3,shared-objects,Actionscript 3,Shared Objects,我的代码的主要目标是创建一个3x3网格,当您从该网格中单击一个单元时,即使关闭fla并再次加载,也无法再次单击该单元。 类似于一个商店,第一行是升级的级别1,列是其他级别 它还可以做2-3件其他事情->网格的每个单元格都有4个鼠标属性 此外,在FLA的第一次加载时,您可以创建3x3网格,并且只能单击第一行中的元素。(如果在此之前没有Speed1,则无法获得Speed 2。) 因此,只有在同一列的第一个元素之前被单击过时,才能单击该列的第二个元素。 这同样适用于列的第三个元素->只有在之前单击了

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

它还可以做2-3件其他事情->网格的每个单元格都有4个鼠标属性

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

因此,只有在同一列的第一个元素之前被单击过时,才能单击该列的第二个元素。 这同样适用于列的第三个元素->只有在之前单击了第二个元素时才能单击它

但是在第二次加载fla后,我的逻辑出现了问题。 更具体地说:

它正在更改以前单击过的元素上的鼠标覆盖/移出状态(这很好(因为我想看到)),但它只允许我单击第一行。由于我加载了clickedBefore按钮并删除了MouseeEvent。单击它们,如果我在佛罗里达州的第一批货中没有点击,我就不能点击其中的一些

我有两门课:主课

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();
        }
    }
}
}

我也会用zip把它上传到这个链接上。
如果有人认为他会帮忙,但代码被弄糟了,也可以上传。如果我正确地阅读了你的代码,我会诚实地说你的问题是顺序性的。无论出于何种原因,活动行和非活动行的设置都是在数据实际被解释为按钮状态之前进行的。因此,当计算机决定是否使其他行可单击时,会将所有按钮视为关闭,然后更新按钮的状态

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

为了解决您的特定问题,您需要首先使用SharedObject获取按钮的数据(这显然是可行的),然后更新其他按钮是否可单击


编程的“软技能”提示:当你遇到问题时,抓起一张纸、一支铅笔,像电脑一样通读代码。是电脑。写下变量及其变化时的值。标记何时调用函数。这样您会发现很多错误。

好的,我会尝试将它们拆分,使其更具可读性。希望到时候我能找到解决方案。10X在决定将什么放入什么函数中时,神奇的词语是“可重用性”。想想如何编写函数,以便在需要完成任务的任何时候都可以使用它。从我的观点来看:D我只会在加载游戏时使用一次->这就是将所有代码放入init()函数的原因。但是是的,它是相当混乱的,就是这样。我实际上指的是可以大量重用的函数,比如评估哪些应该是可点击的,哪些不应该是可点击的。我想你至少可以在三个地方使用这个函数。
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");
    }
}