应用冻结AS3

时间:2016-10-01 07:07:44

标签: actionscript-3 flash

我需要咨询代码。我正在写业余的“游戏”,一切都还在,但我有一个问题,主框架,代码可能太长,调试器中一定长度的闪光冻结。

具体来说,我有很多MovieClip框架,它改变了它们的可见性,然后任何一个计时器和某些类型的条件if / else语句和函数鼠标点击替换按钮。我知道它写的不是很好,但我是业余编程。如果你帮我找到一些可以帮助我减少应用程序复杂性的东西,我会很高兴,所以我被迫在目标之前退出。也许我可以写那样的东西。停止程序冻结。感谢。

以下是主框架的示例代码:

import flash.events.MouseEvent;
import flash.events.Event;
flash.utils.Timer;
import flash.events.TimerEvent;
if (pavelON == true) {
            pavel2.visible = true;
    } else {
            pavel2.visible = false;
    }
if (petrON == true) {
            petr2.visible = true;
    } else {
            petr2.visible = false;
    }
if (martinON == true) {
            martin2.visible = true;
    } else {
            martin2.visible = false;
    }
if (zdencaON == true) {
            zdenca2.visible = true;
    } else {
            zdenca2.visible = false;
    }
if (danON == true) {
            dan2.visible = true;
    } else {
            dan2.visible = false;
    }
if (paziON == true) {
            pazi2.visible = true;
    } else {
            pazi2.visible = false;
    }
var countDownDec:Number = 1;
var totalSecs = 0;
var countDownSecs = totalSecs;
cas.text = countDownSecs;
var time:Timer = new Timer(countDownDec*1000);
time.addEventListener(TimerEvent.TIMER, tick);
function tick(e:TimerEvent):void {
    if (countDownSecs == 120) {
            trace("count down complete");
            time.stop();
            countDownSecs = totalSecs;
    } else {
            countDownSecs = countDownSecs + countDownDec;
            cas.text = countDownSecs;
    }
}
stage.addEventListener(Event.ENTER_FRAME, startTimer);
function startTimer(e:Event):void {
            if(time.running == true) {
                    } else {
                    cas.text = totalSecs;
                    time.start();
            }
    }
var mcnm:Number = 2;
var mcnf:Number = 0;
var mcnt:Number = 0;
var hm:Number = 0;
mcnmt.text = mcnm.toString();
mcnft.text = mcnf.toString();
mcntt.text = mcnt.toString();
hmt.text = hm.toString();
pavel2.stop();
petr2.stop();
martin2.stop();
zdenca2.stop();
dan2.stop();
pazi2.stop();
pavel_prace.visible = false;
petr_prace.visible = false;
martin_prace.visible = false;
zdenca_prace.visible = false;
dan_prace.visible = false;
pazi_prace.visible = false;
upozorneni.visible = false;
var pavel2ON:Boolean = false;
var petr2ON:Boolean = false;
var martin2ON:Boolean = false;
var zdenca2ON:Boolean = false;
var dan2ON:Boolean = false;
var pazi2ON:Boolean = false;
upozorneni.zavrit.addEventListener(MouseEvent.CLICK,zavriClick);
function zavriClick(event:MouseEvent):void{
    upozorneni.visible = false;}
pavel2.addEventListener(MouseEvent.CLICK,pavelClick);
function pavelClick(event:MouseEvent):void{
        if ((pavel2ON == false)&&(mcnm > 0)){
                pavel_prace.visible =true;

因为它是文本有限长度的贡献,所以代码就在这里: http://www.filedropper.com/code_4

我附上了一个可以看到该功能的SWF文件。 https://ulozto.cz/!ab4C1i5yTJKG/kollmorgen3-swf(传球:“pomoc”) 故意结束了括号,因为没有它们现在它会冻结。我不知道Adobe Flash CS5.5的限制。

1 个答案:

答案 0 :(得分:0)

我不知道是什么导致它冻结,但你也要求帮助简化代码(这将使其更容易阅读并最终找到问题)所以试试这个:

将类似的元素添加到数组中,然后遍历该数组以执行类似的操作:

var cArray:Array = new Array();
cArray.push(petr2);
cArray.push(pavel2);
//...etc.
// then you can loop through them when needed
for (var i:int=0; i<cArray.length; i++){
    cArray.addEventListener(MouseEvent.CLICK,click);

    if (cArray[i]._on == true){
        cArray[i].visible = true;
    } else {
        cArray[i].visible = false;
    }
    cArray[i].stop();
}
function click(me:MouseEvent):void{
    if (me.target._on == //etc... hopefully you get the gist by now

您需要在名为_on的角色类中添加一个属性才能使其生效。

但是我猜测你并没有使用自定义类,你现在可能应该学会这样做,让自己变得轻松自如。但是你可以看到我用一个简单的数组和循环以及一个click函数替换了一堆重复代码。这对于可读性和可维护性都是有利的(想象一下添加一个新角色......你只需要将他添加到阵列中并完成...你不必更新所有其他位代码)

作为一个不太简单但可能更易于访问的方法(不需要自定义类),您可以使用这样的关联值数组:

var cArray:Array = new Array();
cArray.push({character:pavel2, status:"on"});

然后您可以通过执行pavel2._on来更改cArray[i].status = "off"的状态,并通过执行来访问pavel2cArray[i].character