电影剪辑出错的原因?

时间:2013-11-29 08:14:53

标签: actionscript-3 movieclip flash-cs3

我在这里做一个简单的真假拖拽游戏。

我将舞台上的所有对象制作为影片剪辑:

问题(q1,q2,q3),
放下目标(q1Match,q2Match,q3Match)
拖动对象(回答)例如。问题1的q1a1和q1a2,以及
回答正确和错误的答案(oui,non)。

用户可以在回答后转到下一个问题,跳过问题并返回回答之前未回答的问题。

当用户返回回答之前未回答的问题时,我遇到了问题。

假设用户跳过问题2然后正确回答问题3。 用户返回回答问题2.当用户拖动错误以放弃目标时,响应将显示“oui”影片剪辑,说明这是正确的答案。好像它带有回答问题3的记忆。

import flash.display.MovieClip;
import flash.events.MouseEvent;

oui.visible = false;
non.visible = false;

q1.visible = true;
q2.visible = false;
q3.visible = false;

q1Match.visible = true;
q2Match.visible = false;
q3Match.visible = false;

q1a1.visible = true;
q1a2.visible = true;

q2a1.visible = false;
q2a2.visible = false;

q3a1.visible = false;
q3a2.visible = false;

back_btn.visible = false;

var num:int = 0;

nx_btn.addEventListener(MouseEvent.CLICK, nextQuestion);

function nextQuestion(event:MouseEvent):void{
switch (num){   

case 0: 

oui.visible = false;
non.visible = false;

q1.visible = false;
q1Match.visible = false;

q1a1.visible = false;
q1a2.visible = false; 

q2.visible = true;  
q2Match.visible = true;

q2a1.visible = true;
q2a2.visible = true; 

back_btn.visible = true;
back_btn.buttonMode = true;

break;

case 1:

oui.visible = false;
non.visible = false;

q2Match.visible = false;
q2.visible = false;

q2a1.visible = false;
q2a2.visible = false; 

q3.visible = true;
q3Match.visible = true; 

q3a1.visible = true;
q3a2.visible = true; 

break;

case 2:

oui.visible = false;
non.visible = false;

q3.visible = false;
q3Match.visible = false;

q3a1.visible = false;
q3a2.visible = false; 

gotoAndStop(3);
break;
}
num++;
} 

back_btn.addEventListener(MouseEvent.CLICK, prevQuestion); 

function prevQuestion(event:MouseEvent):void{

switch (num){

case 0:

oui.visible = false;
non.visible = false;

back_mc.visible = false;

break;

case 1: 

oui.visible = false;
non.visible = false;

q2.visible = false;
q2Match.visible = false;

q2a1.visible = false;
q2a2.visible = false;

q1.visible = true;
q1Match.visible = true;

q1a1.visible = true;
q1a2.visible = true;

back_mc.visible = false; 

break;

case 2:

oui.visible = false;
non.visible = false;

q3.visible = false;
q3Match.visible = false;

q3a1.visible = false;
q3a2.visible = false;

q2.visible = true;
q2Match.visible = true;

q2a1.visible = true;
q2a2.visible = true;

back_mc.visible = true;
back_mc.buttonMode = true;

break;
}
num--;
}

var dragArray:Array = [q1a1, q1a2, q2a1, q2a2, q3a1, q3a2];
var matchArray:Array = [q1Match, q2Match, q3Match];

var currentClip:MovieClip;
var startX:Number;
var startY:Number;

for(var i:int = 0; i < dragArray.length; i++) {
dragArray[i].buttonMode = true;        
dragArray[i].addEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);       

function item_onMouseDown(event:MouseEvent):void {
    currentClip = MovieClip(event.currentTarget);
    startX = currentClip.x;
    startY = currentClip.y;
    addChild(currentClip);
    currentClip.startDrag();
    stage.addEventListener(MouseEvent.MOUSE_UP, stage_onMouseUp);
}

function stage_onMouseUp(event:MouseEvent):void {
stage.removeEventListener(MouseEvent.MOUSE_UP, stage_onMouseUp);
currentClip.stopDrag();
var index:int = dragArray.indexOf(currentClip);
var matchClip:MovieClip = MovieClip(matchArray[index]); 

oui.visible = false;
non.visible = false;

if(q1a1.hitTestObject(q1Match)) {
        q1a1.x = q1Match.x;
        q1a1.y = q1Match.y;
        q1a1.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);
        q1a2.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);  
        q1a1.buttonMode = false;
        q1a2.buttonMode = false;

        oui.visible = true;
        non.visible = false;
}

if(q1a2.hitTestObject(q1Match)){
        q1a2.x = startX;
        q1a2.y = startY;

        non.visible = true;
        oui.visible = false;
    }

if(q2a2.hitTestObject(q2Match)) {
        q2a2.x = q2Match.x;
        q2a2.y = q2Match.y;
        q2a1.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);
        q2a2.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);      
        q2a1.buttonMode = false;
        q2a2.buttonMode = false;

        oui.visible = true;
        non.visible = false;
    }

    if(q2a1.hitTestObject(q2Match)){
        q2a1.x = startX;
        q2a1.y = startY;

        non.visible = true;
        oui.visible = false;
    }

if(q3a2.hitTestObject(q3Match)) {
        q3a2.x = q3Match.x;
        q3a2.y = q3Match.y;
        q3a1.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);
        q3a2.removeEventListener(MouseEvent.MOUSE_DOWN, item_onMouseDown);
        q3a1.buttonMode = false;
        q3a2.buttonMode = false;

        oui.visible = true;
        non.visible = false;
    }

    if(q3a1.hitTestObject(q3Match)){
        q3a1.x = startX;
        q3a1.y = startY;

        non.visible = true;
        oui.visible = false;
    }
}

请帮忙! T_T

1 个答案:

答案 0 :(得分:0)

var index:int = dragArray.indexOf(currentClip);
var matchClip:MovieClip = MovieClip(matchArray[index]); 

这意味着matchArraydragArray应该具有相同的长度,而您有matchArray长度为3且dragArray长度为6。首先,更改matchArray对此:

var matchArray:Array = [q1Match, q1Match, q2Match, q2Match, q3Match, q3Match];

然后您的数组匹配来自答案集的匹配集的正确剪辑。

实际错误来自您的代码在拖动它以匹配a3q2之后没有将q3match返回到原始位置,而是将其放在q3match上方。然后,当您处理MOUSE_UP事件时,您的代码按顺序执行,第二个问题被错误地回答并且non变得可见,但是下一组语句检查第三个问题将被回答,它是已经正确回答 - oui变得可见。

要解决此问题,您只需检查currentClipmatchClip的冲突,以便仅检查当前问题。然后你需要匹配currentClip以确定此剪辑给出的答案是正确还是错误,如果正确,让它超过匹配剪辑,如果错误,则将其放回。请注意,如果您停止拖动currentClip但未将其放在匹配剪辑上,则ouinon不会返回其位置,这可能会破坏您的程序(不一定如此)。

修复代码的最佳方法是为Boolean数组匹配dragArray匹配false数据,以获取正确/错误答案的值 - true错误,{ {1}}是对的。在你的情况下,数组将是这样的:

var ouinon:Array = [true, false, true, false, false, true];

然后,当您检测到碰撞时,检查您已收到的ouinon处的index元素,并根据其结果进行操作。

if (ouinon[index]) {
    currentClip.x=matchClip.x;
    currentClip.y=matchClip.y;
    oui.visible=true;
    non.visible=false;
} else {
    currentClip.x=startX;
    currentClip.y=startY;
    non.visible=true;
    oui.visible=false;
}

将其替换为6 if,而不是替换所有这些event.target,并查看如何仅对{{1}}派生的数据进行操作。