Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 事件侦听器赢得';我不会在AS3附近第二次工作_Actionscript 3 - Fatal编程技术网

Actionscript 3 事件侦听器赢得';我不会在AS3附近第二次工作

Actionscript 3 事件侦听器赢得';我不会在AS3附近第二次工作,actionscript-3,Actionscript 3,我卡住了!如果我需要更详细的说明,请留下评论,我会详细说明 我尝试创建一些代码,动态地将链接对象添加到stage,然后在正确的区域中删除,然后创建下一个,以此类推。信息在一个数组中循环,直到游戏完成并达到targetScore。如果计时器用完,游戏停止,调用win()或lose()函数,并显示重试按钮。在游戏停止,我尝试使用retry()函数重新启动程序之前,这一切都很正常。函数的作用是:再次创建棒球对象,然后让releaseToDrop()像第一次一样重复所有操作,从而尝试按程序启动时的状态重

我卡住了!如果我需要更详细的说明,请留下评论,我会详细说明

我尝试创建一些代码,动态地将链接对象添加到stage,然后在正确的区域中删除,然后创建下一个,以此类推。信息在一个数组中循环,直到游戏完成并达到targetScore。如果计时器用完,游戏停止,调用win()或lose()函数,并显示重试按钮。在游戏停止,我尝试使用retry()函数重新启动程序之前,这一切都很正常。函数的作用是:再次创建棒球对象,然后让releaseToDrop()像第一次一样重复所有操作,从而尝试按程序启动时的状态重置所有操作。根据我停止的位置,当我第二次到达同一位置时,clicktoDrag1()函数无法拾取当前对象。它可以位于从库中动态创建的8个对象中的任意1个对象上。当stage听到侦听器在*mouse_up*上的声音时,我可以单击并拖动该对象,但当它与数组(在retry()函数中重置)稍微不同步时,该对象就会崩溃,即使所有的trace语句都按应有的方式读取,被丢弃的目标也无法识别它。我知道这是一个很大的看虽然,我不知道这是否可以通过论坛解决,但任何一般提示将不胜感激

我通常保持代码简单,但我想让代码自行编写,直到事情变得太复杂为止

我以前从未发过帖子寻求帮助,但我已经给了这一切,如果无法修复,我将不得不重新开始并简化

提前感谢如果有人花时间看这篇文章,我会感到很谦卑,并希望更多地利用这个论坛,成为一名更好的程序员

都在时间线上,这是代码

import flash.display.MovieClip;
import flash.ui.Mouse;

var startPosX = 450;
var startPosY = 400;

//setup first clip
var baseball:MovieClip = new Baseball();
baseball.name = "baseball";

addChild(baseball);
baseball.buttonMode = true;
baseball.x = startPosX;
baseball.y = startPosY;

activity_txt.text = "Swinging a baseball bat";

//setup small clips
baseballSmall.visible = false;
golfSmall.visible = false;
swimSmall.visible = false;
boxingSmall.visible = false;
tennisSmall.visible = false;
dartsSmall.visible = false;
powerSmall.visible = false;
marathonSmall.visible = false;

theEnd.visible = false;
retry_btn.visible = false;

fast1.visible = false;
fast2.visible = false;
fast3.visible = false;
fast4.visible = false;
slow1.visible = false;
slow2.visible = false;
slow3.visible = false;
slow4.visible = false;

//setup vars
var counter:int = 0;
var sportCounter:int = 0;
var startingLife:int = 15;
var playerLife = startingLife;
var lifeBoost:int = 3;
var targetScore:int = 8;
var countdownTimer:Timer = new Timer(500,0);
var questionTimer:Timer = new Timer(250,2);
var score:int =  0; 

var smallArray = new Array("baseballSmall","golfSmall", "swimSmall", "boxingSmall","tennisSmall", "dartsSmall", "powerSmall", "marathonSmall");
var sportArray = new Array("baseball","Golf", "Swimming", "Boxing", "Tennis", "Darts", "PowerLifting", "Marathon");
var answersArray = new Array("fast", "fast", "slow", "fast", "fast", "slow", "slow", "slow");
var letArray = new Array("fast1", "fast2", "slow1", "fast3", "fast4", "slow2", "slow3", "slow4");
var activityTXTArray = new Array("Golf swing", "100m swim", "Boxing punch", "Tennis racquet swing", "Darts throw", "Power lifting", "Marathon");

var arraySmall:Array = smallArray;
var arrayLet:Array = letArray;
var arrayActivity:Array = activityTXTArray;

//var draggable = getChildByName(sportArray[0]);

//setup bonus bar
bonusBar.gotoAndStop(2);
bonusBar.x = timeBar.x;
bonusBar.y = timeBar.y - timeBar.height;
bonusBar.height = timeBar.height/startingLife * lifeBoost;

playerLife = startingLife;
timeBar.height = playerLife * (300/startingLife);   

/* listeners */
countdownTimer.addEventListener(TimerEvent.TIMER, timerTick);
countdownTimer.start();
retry_btn.addEventListener(MouseEvent.CLICK, retry);
baseball.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
stage.addEventListener(MouseEvent.MOUSE_UP, releaseToDrop);


function clickToDrag1(event:MouseEvent):void
{   
    var draggable = getChildByName(sportArray[sportCounter]);
    trace("the counter name is "+ sportArray[sportCounter]);
    trace("the baseball name is "+ baseball.name);
    trace("the draggable name is "+ draggable.name);
    trace("the answer array is "+ answersArray[counter]);
    trace("the sport array is "+ sportArray[sportCounter]);
    this.setChildIndex(draggable,this.numChildren-1);
    draggable.startDrag();
}

function releaseToDrop(event:MouseEvent):void
{
        //get current obj name from sportArray
    var draggable = getChildByName(sportArray[sportCounter]);
        //check if this obj is dropped on the Fast or Slow MovieClip
    if(draggable.hitTestObject(getChildByName(answersArray[counter])))
    {           
            //move on to the next F/S answer
        counter++;
        score++;

        var tick = new Tick();
        addChild(tick);     
        tick.x = 370;
        tick.y = 200;

        activity_txt.text = activityTXTArray.shift();

        playerLife += lifeBoost;
        timeBar.height = playerLife * (300/startingLife);
        bonusBar.gotoAndPlay(2);        

        var smallName = getChildByName(smallArray.shift());
        smallName.visible = true;

        var letters = getChildByName(letArray.shift());
        letters.visible = true;

            //remove the drag listenter on the current object (name assigned via sportArray)
        draggable.removeEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
            //stage.removeEventListener(MouseEvent.MOUSE_UP, releaseToDrop);
            //remove the current object
        removeChild(getChildByName(sportArray[sportCounter]));
            //delete ref
        var deleteRef = getChildByName(sportArray[sportCounter]);
        deleteRef = null;
            //move on to the next one
        sportCounter++;
            //add a new object
        var obj:Class = getDefinitionByName(sportArray[sportCounter]) as Class;
        var myMclip = new obj();
            //name it
        myMclip.name = sportArray[sportCounter];
            //var clipName = getChildByName(sportArray[0]);
        myMclip.x = myMclip.y = 400;
        myMclip.buttonMode = true;
        trace("myClip name "+myMclip.name);
        addChild(myMclip);
            //add listener to new obj (is this removed via draggable?)
        myMclip.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
        //stage.addEventListener(MouseEvent.MOUSE_UP, releaseToDrop);
    }
    else{
        draggable.x = startPosX;
        draggable.y = startPosY;
        draggable.stopDrag();
        var cross = new Cross();
        addChild(cross);
        cross.x = 370;
        cross.y = 200
    }   
}


function timerTick(e:TimerEvent):void {
    //removes from 40(life) every half a second
    playerLife -= 1;
    //bar height = % of whats left of life
    timeBar.height = playerLife * (300/startingLife);
    bonusBar.y = timeBar.y - timeBar.height;

    if(playerLife == 0) {                                       
        loseGame(); 
    } else if(playerLife>0 && score > targetScore-1) {
        winGame();
    }
}


function loseGame():void
{
    var removeCurrent = getChildByName(sportArray[sportCounter]);
    removeCurrent.visible = false;  
    hideStuff();
    theEnd.visible = true;
    theEnd.end_txt.text = "sorry you lost"
    retry_btn.visible = true;
    //baseball.removeEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
    //stage.removeEventListener(MouseEvent.MOUSE_UP, releaseToDrop);
    //baseball = null;
    trace(baseball);    
}

function winGame():void
{
    var removeCurrent = getChildByName(sportArray[sportCounter]);
    removeCurrent.visible = false;
    hideStuff();
    theEnd.visible = true;
    theEnd.end_txt.text = "You've won!"
    retry_btn.visible = true;
    baseball.removeEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
    //stage.removeEventListener(MouseEvent.MOUSE_UP, releaseToDrop);
}

function retry(e:MouseEvent):void
{
    playerLife = startingLife;
    timeBar.height = playerLife * (300/startingLife);

    score = 0;
    counter = 0;
    sportCounter = 0;

    countdownTimer.reset();
    countdownTimer.start();

    var baseball:MovieClip = new Baseball();
    baseball.name = "baseball";
    trace("the type is "+baseball);
    trace("the name is " + baseball.name);
    addChild(baseball);
    baseball.buttonMode = true;
    baseball.x = startPosX;
    baseball.y = startPosY; 

    baseball.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag1);
    //stage.addEventListener(MouseEvent.MOUSE_UP, releaseToDrop);

    activity_txt.text = "Swinging a baseball bat";

    smallArray = arraySmall;
    letArray = arrayLet;
    activityTXTArray = arrayActivity;

    retry_btn.visible = false;
    theEnd.visible = false;
    showStuff();
    smallArray = new Array("baseballSmall","golfSmall", "swimSmall", "boxingSmall","tennisSmall", "dartsSmall", "powerSmall", "marathonSmall");
var sportArray = new Array("baseball","Golf", "Swimming", "Boxing", "Tennis", "Darts", "PowerLifting", "Marathon");
var answersArray = new Array("fast", "fast", "slow", "fast", "fast", "slow", "slow", "slow");
var letArray = new Array("fast1", "fast2", "slow1", "fast3", "fast4", "slow2", "slow3", "slow4");
var activityTXTArray = new Array("Golf swing", "100m swim", "Boxing punch", "Tennis racquet swing", "Darts throw", "Power lifting", "Marathon");
}

function showStuff():void
{
    activity_txt.visible = true;
    fast.visible = true;
    slow.visible = true;
    timeBar.visible = true;
    bonusBar.visible = true;
}

function hideStuff():void
{
    fast1.visible = false;
    fast2.visible = false;
    fast3.visible = false;
    fast4.visible = false;
    slow1.visible = false;
    slow2.visible = false;

    baseballSmall.visible = false;
    golfSmall.visible = false;
    swimSmall.visible = false;
    boxingSmall.visible = false;
    tennisSmall.visible = false;
    dartsSmall.visible = false;

    activity_txt.visible = false;
    fast.visible = false;
    slow.visible = false;
    timeBar.visible = false;
    bonusBar.visible = false;
}

OP已解决问题,如图所示:

我并没有在游戏结束时移除这个物体,我把它藏起来了,所以当它再次出现时,一个复制品就被创造出来了。我把它拿走了,而不是藏起来,效果很好。在舞台上有两个视频片段会产生一些奇怪的拖放行为,这有点让人泄气。“这不是‘我的’答案。MAngoPop在评论中回答了这一问题,但忘记将其作为答案添加。”


这只是一个猜测,但可能是在
This.setChildIndex(draggable,This.numChildren-1)行中将numChildren索引设置为另一个负1?因此,如果第一轮1是1,那么负1=0,那么在下一轮(重播)中,它将被设置为-1,结果是…?嗨,谢谢,我尝试了,但问题仍然存在。我开始认为,当游戏停止时,它不会删除应用于当前舞台上对象的当前侦听器,因此当它在第二次出现时,会出现某种冲突。事件侦听器是在releaseToDrop()函数中添加和删除的,所以我想我必须正确地删除它?我会设法解决这个问题,并向你汇报!这听起来确实很容易理解。对于这一点,您可以尝试在游戏中的几个点跟踪函数(尽管我不知道您可以期望什么样的输出),或者将行
stage.addEventListener(MouseEvent.MOUSE_UP,releaseToDrop)
在clickToDrag1函数的末尾,而不是在它的外部(在`draggable.startDrag();`之后,右大括号之前)。另外,我假设您的EventListener放在主函数的内部?因为你所有的变量,它们的属性和函数调用都不在任何函数或类中。我并没有在游戏结束时移除这个物体,我把它藏起来了,所以当它再次出现时,一个复制品就被创造出来了。我把它拿走了,而不是藏起来,效果很好。舞台上有两个视频片段,造成了一些奇怪的拖拽行为,这有点让人泄气。再次感谢,您的想法激发了解决方案+谢谢你,沃尔特。你可能想考虑把这个标记为社区维基,因为一些用户可能会否决你的“信用”(虽然没有特别的规则反对你所做的)。有关此特定答案的讨论,请参阅@Cyborgx37。没问题。当人们不将答案作为“答案”发布时,我很恼火。当它在2012年被解决时,它在搜索结果中显示为未解决。我不知道有什么方法可以向人们传达关于这件事的信息,否则我会向MangoPop发送信息。谢谢你的提示。我更新了它并将其作为wiki进行了检查。您可以对该问题留下评论,该评论将在用户下次登录时显示为通知。不过,并不是所有的用户都非常活跃,也不是所有的用户都愿意更新他们的Q/A。您所做的是正确的方法,但请记住要将非原创作品归因于。