【问题标题】:why the movie clip went wrong?为什么电影剪辑出错了?
【发布时间】:2013-11-29 08:14:52
【问题描述】:

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

我将舞台上的所有物体都制作成影片剪辑:

问题(q1,q2,q3),
删除目标(q1Match, q2Match, q3Match)
拖动对象(答案)例如。问题 1 的 q1a1 和 q1a2,以及
正确和错误答案的响应(oui,非)。

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

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

假设用户跳过问题 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

【问题讨论】:

    标签: actionscript-3 movieclip flash-cs3


    【解决方案1】:
    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,但未将其放在匹配剪辑上,则您的 currentClip 不会返回其位置,这可能会稍微破坏您的程序(不一定如此)。

    修复代码的最佳方法是创建一个Boolean 类型的ouinon 数组,以匹配dragArray 的正确/错误答案值 - false 是错误的,true 是正确的。在您的情况下,数组将如下所示:

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

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

    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 个ifs,因为这会替换所有这些,看看如何只对来自event.target 的数据进行操作。

    【讨论】:

    • 非常感谢 Vesper。它工作得很好!谢谢你救了我,谢谢。 ^_^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2017-02-14
    • 2011-10-27
    相关资源
    最近更新 更多