Почему видеоклип не получился?

Я делаю простую игру с верным и ложным перетаскиванием.

я делаю все объекты на сцене как мувиклип:

вопросы (q1, q2, q3),
отбросить цель (q1Match, q2Match, q3Match)
перетащить объект (ответ) например. q1a1 и q1a2 для вопроса 1 и
ответ за правильный и неправильный ответ (оу, не).

После ответа пользователь может перейти к следующему вопросу, пропустить вопрос и вернуться, чтобы ответить на предыдущий вопрос без ответа.

У меня проблема, когда пользователь возвращается, чтобы ответить на предыдущий вопрос без ответа.

Скажем, пользователь пропустил вопрос 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 ответ

Решение
var index:int = dragArray.indexOf(currentClip);
var matchClip:MovieClip = MovieClip(matchArray[index]); 

Это подразумевает, что matchArray а также dragArray должна быть одинаковой длины, в то время как у вас есть matchArray длиной 3 и dragArray длины 6. В самом начале поменяй matchArray к этому:

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

Затем ваши массивы соответствуют правильному клипу из набора ответов в соответствии с набором.

Фактическая ошибка происходит из-за того, что ваш код не возвращает a3q2 вернуться на исходное место после перетаскивания его в соответствие q3match, но вместо того, чтобы поместить его прямо q3match, Затем, когда вы обрабатываете MOUSE_UP событие, ваш код выполняется по порядку, на 2-й вопрос ответили неправильно и non становится видимым, но следующий набор утверждений сверяется с третьим вопросом, и на него уже дан правильный ответ - oui становится видимым

Чтобы это исправить, вам нужно только проверить столкновение для currentClip а также matchClip, так что будет проверен только текущий вопрос. Тогда вам нужно соответствовать currentClip на то, является ли ответ, данный этим клипом, правильным или неправильным, если он правильный, пусть он будет больше совпадения с клипом, если неправильный, поместите его обратно. Обратите внимание, что ваш currentClip не возвращается на свое место, если вы перестанете перетаскивать его, но не поместите его поверх совпадающего клипа, это может немного испортить вашу программу (не обязательно так).

Лучшим подходом к исправлению вашего кода будет создание ouinon массив Boolean сопоставление типов dragArray для значений правильного / неправильного ответа - false неправильно, true правильно. В вашем случае массив будет выглядеть так:

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 ifs, поскольку это заменяет все из них, и посмотрите, как вы можете работать только с данными, полученными из event.target,

Другие вопросы по тегам