2013-11-29 3 views
0

Я делаю простую настоящую и ложную игру с перетаскиванием.Почему клип поступил неправильно?

я сделать все объекты на сцене, как фрагмент ролика:

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

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

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

Скажите, что пользователь пропустил вопрос 2, затем ответьте на него правильно. Вопрос Пользователь вернется к ответу на вопрос 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

ответ

0
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, ваш код выполняется в порядке, на второй вопрос ответят неправильно, и non становится видимым, но следующий набор инструкций проверяет ответ на третий вопрос, и на него уже ответили правильно - oui становится видимым.

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

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

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

Тогда при обнаружении столкновения, вы проверяете элемент ouinon «S на 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.

+0

Большое спасибо Vesper. он отлично работал! спасибо, что спасли меня, спасибо.^_ ^ –

Смежные вопросы