2016-02-25 2 views
0

Я сделал карточку с карточками, в которой есть 24 изображения карт, из которых пользователь должен найти 7 изображений, чтобы выиграть. Я начинаю actioncript 3, весь код находится на фреймах вместо файлов документов или классов. Все 24 изображения карт являются мувиклипами, на наборе из 7 изображений я сделал кнопку со вторым состоянием на том же слое с изображением победы. Все карты создаются динамически из библиотеки, а не на стадии. Моя проблема в том, что я когда-либо пробовал до сих пор, потому что последний код для победы не имел успеха, я очень отчаянный, помогите мне ..... Я не могу сделать два мувиклипа для общения через переменные.AS3 нужна помощь, если кнопка 1 мувиклипа && button2 другого мувиклипа нажата, а затем gotoAndPlay

enter image description here

Основной график кадр 6 имеет этот код

import flash.display.MovieClip; 
import flash.events.MouseEvent; 
import flash.events.*; 
import flash.ui.Mouse; 
import flash.utils.Timer; 
import flash.utils.getTimer; 
import flash.text.*; 
import flash.display.Stage; 

var objImage1:logo1 = new logo1; 
var objImage2:pic2 = new pic2; 
var objImage3:pic3 = new pic3; 
var objImage4:logo2 = new logo2; 
var objImage5:pic5 = new pic5; 
var objImage6:pic6 = new pic6; 
var objImage7:pic7 = new pic7; 
var objImage8:logo3 = new logo3; 
var objImage9:pic9 = new pic9; 
var objImage10:pic10 = new pic10; 
var objImage11:logo4 = new logo4; 
var objImage12:pic12 = new pic12; 
var objImage13:pic13 = new pic13; 
var objImage14:pic14 = new pic14; 
var objImage15:pic15 = new pic15; 
var objImage16:logo5 = new logo5; 
var objImage17:pic17 = new pic17; 
var objImage18:logo6 = new logo6; 
var objImage19:pic19 = new pic19; 
var objImage20:pic20 = new pic20; 
var objImage21:logo7 = new logo7; 
var objImage22:pic22 = new pic22; 
var objImage23:pic23 = new pic23; 
var objImage24:pic24 = new pic24; 
var sourceDeck:Array =[objImage1,objImage2,objImage3,objImage4,objImage5,objImage6,objImage7,objImage8,objImage9,objImage10,objImage11,objImage12,objImage13,objImage14,objImage15,objImage16,objImage17,objImage18,objImage19,objImage20,objImage21,objImage22,objImage23,objImage24]; 
var shuffledDeck:Array = new Array(); 
var xValues:Array =["121","321","521","731","937","1136","120","320","520","732","938","1138","120","321","520","730","938","1135","121","322","520","732","938","1135"]; 
var yValues:Array =["173","173","173","173","173","173","346","346","346","346","346","346","534","534","534","534","534","534","716","716","716","716","716","716"]; 

function placeCards():void 
{ 
for (var i:int = 0; i<sourceDeck.length; ++i) 
{ 
    addChild(sourceDeck[i]); 
    sourceDeck[i].x = int(xValues[i])+20; 
    sourceDeck[i].y = int(yValues[i]); 
} 
} 
placeCards(); 
function removeCards():void 
{ 
for (var i:int=0; i<sourceDeck.length; ++i) 

{ 
    removeChild(sourceDeck[i]); 

} 
} 
    function shuffleCards():void 
{ 
while(sourceDeck.length >0) 
{ 
    var r:int=Math.floor(Math.random()*sourceDeck.length); 
    shuffledDeck.push(sourceDeck[r]); 
    sourceDeck.splice(r,1); 
} 
} 
function placeShuffledCards():void 
{ 
for (var i:int=0; i<shuffledDeck.length; ++i) 
{ 
    addChild(shuffledDeck[i]); 
    shuffledDeck[i].x = int(xValues[i]); 
    shuffledDeck[i].y = int(yValues[i]); 

} 
} 


function showShuffledCards():void 

{ 
removeCards(); 
shuffleCards(); 
placeShuffledCards(); 

} 
showShuffledCards(); 
foo(); 

function foo():void { 
    var x:int = 2; // you can use variables as you would normally 

    // do something here 

    var timer:Timer = new Timer(5000); 
    var afterWaiting:Function = function(event:TimerEvent):void { 
    timer.removeEventListener(TimerEvent.TIMER, afterWaiting); 
    timer = null; 
    // 5 seconds have passed, now do something more 


    objImage1.gotoAndPlay(10); 
    objImage2.gotoAndPlay(10); 
    objImage3.gotoAndPlay(10); 
    objImage4.gotoAndPlay(10); 
    objImage5.gotoAndPlay(10); 
    objImage6.gotoAndPlay(10); 
    objImage7.gotoAndPlay(10); 
    objImage8.gotoAndPlay(10); 
    objImage9.gotoAndPlay(10); 
    objImage10.gotoAndPlay(10); 
    objImage11.gotoAndPlay(10); 
    objImage12.gotoAndPlay(10); 
    objImage13.gotoAndPlay(10); 
    objImage14.gotoAndPlay(10); 
    objImage15.gotoAndPlay(10); 
    objImage16.gotoAndPlay(10); 
    objImage17.gotoAndPlay(10); 
    objImage18.gotoAndPlay(10); 
    objImage19.gotoAndPlay(10); 
    objImage20.gotoAndPlay(10); 
    objImage21.gotoAndPlay(10); 
    objImage22.gotoAndPlay(10); 
    objImage23.gotoAndPlay(10); 
    objImage24.gotoAndPlay(10); 
    // the scope is retained and you can still refer to the variables you 
    // used earlier 
    x += 2; 
} 
timer.addEventListener(TimerEvent.TIMER, afterWaiting); 
    timer.start(); 

} 

на каждом из семи кнопок, каждая из которых находится внутри фрагмента ролика у меня есть этот код:

import flash.display.Sprite; 
import flash.text.*; 
import flash.display.MovieClip; 
import flash.events.MouseEvent; 
var success:Boolean = false; 
var butpic1:SimpleButton; 
butpic1.enabled = true; 
addChild(butpic1); 

butpic1.addEventListener(MouseEvent.CLICK, clickpics); 

function clickpics(event:MouseEvent):void { 
gotoAndPlay(1); 
var myTextBox:TextField = new TextField();  
    myTextBox.text = "Σωστό Συνέχισε!"; 
myTextBox.border = true;  
    myTextBox.borderColor = 0x000000; 
myTextBox.width = 180;  
myTextBox.height = 87;  
myTextBox.x = -77;  
myTextBox.y = -126; 
var myFormat:TextFormat = new TextFormat(); 
myFormat.color = 000000;  
    myFormat.size = 24; 
myFormat.align = TextFormatAlign.CENTER 
myTextBox.background = true;  
myTextBox.backgroundColor = 0xFFF000; 
myTextBox.setTextFormat(myFormat); 
    addChild(myTextBox); 

/*var Success=true;*/ 
//MovieClip(parent).Success2(); 
//trace(event.target.name); 
var success=true; 
if(MovieClip(root).butpic3 && butpic1 == success) 
    { 

    MovieClip(root).gotoAndPlay("win"); 
    } 
//checking(); 
//trace(event.target); 
//MovieClip(this.parent).success2(); 
//checking(); 
//MovieClip(root).check(); 
//trace("click: " + event.currentTarget.name); 
} 
//trace(MovieClip(root).but.butpic2); 
/*function checking():void 
{ 
if(butpic1 && MovieClip(root).butt.butpic3) 
    { 
    MovieClip(parent).gotoAndPlay("win"); 
    } else { 
MovieClip(parent).gotoAndPlay("win"); 
} 
}*/ 

/*function checking():void 
{ 
if(MovieClip(root).Symbol1 && MovieClip(root).button2) 
    { 

    MovieClip(parent).gotoAndPlay("win"); 
    } 
}*/ 

ответ

1

Я должен предупредить вас, что включение кода в MovieClips является устаревшим подходом, и его следует избегать. Ввод кода в разные рамки неизменно вызывает больше головных болей. Однако, прочитав свой код, я считаю, что это должно ответить на ваш вопрос.

Обратите внимание, что большинство пояснений содержится в комментариях к коду, поэтому читайте дальше.

import flash.text.*; 
import flash.display.Stage; 

/*You need a reference to each of these library instances, but you were creating 
two references to them; (1) a variable, and (2) an array entry. You can create 
this data once, thinking of each object as a individual "card", and add any 
additional data to it together in the same place. Most importantly, this 
structure allows us to use array.sortOn().*/ 
var deck:Array = [ 
    {"img":new logo1, "valid":true}, 
    {"img":new pic2, "valid":false}, 
    {"img":new pic3, "valid":false}, 
    {"img":new logo2, "valid":true}, 
    {"img":new pic5, "valid":false}, 
    {"img":new pic6, "valid":false}, 
    {"img":new pic7, "valid":false}, 
    {"img":new logo3, "valid":true}, 
    {"img":new pic9, "valid":false}, 
    {"img":new pic10, "valid":false}, 
    {"img":new logo4, "valid":true}, 
    {"img":new pic12, "valid":false}, 
    {"img":new pic13, "valid":false}, 
    {"img":new pic14, "valid":false}, 
    {"img":new pic15, "valid":false}, 
    {"img":new logo5, "valid":true}, 
    {"img":new pic17, "valid":false}, 
    {"img":new logo6, "valid":true}, 
    {"img":new pic19, "valid":false}, 
    {"img":new pic20, "valid":false}, 
    {"img":new logo7, "valid":true}, 
    {"img":new pic22, "valid":false}, 
    {"img":new pic23, "valid":false}, 
    {"img":new pic24, "valid":false} 
]; 

/*You mentioned you were having difficulty getting your MovieClips to communicate 
with eachother and track the success of valid clicks to "win". You can see we've 
added a property "valid" which let's us know if it's a valid option for "winning". 
We'll later add the state of it's "success".*/ 

// Because your locations were explicit pairs, it's also a good idea to keep these 
// together, if nothing more than for maintainability & legibility. 
var locs:Array = [ 
    {"x":121, "y":173}, 
    {"x":321, "y":173}, 
    {"x":521, "y":173}, 
    {"x":731, "y":173}, 
    {"x":937, "y":173}, 
    {"x":1136, "y":173}, 
    {"x":120, "y":346}, 
    {"x":320, "y":346}, 
    {"x":520, "y":346}, 
    {"x":732, "y":346}, 
    {"x":938, "y":346}, 
    {"x":1138, "y":346}, 
    {"x":120, "y":534}, 
    {"x":321, "y":534}, 
    {"x":520, "y":534}, 
    {"x":730, "y":534}, 
    {"x":938, "y":534}, 
    {"x":1135, "y":534}, 
    {"x":121, "y":716}, 
    {"x":322, "y":716}, 
    {"x":520, "y":716}, 
    {"x":732, "y":716}, 
    {"x":938, "y":716}, 
    {"x":1135, "y":716} 
]; 

// Nulling of the timer & removal of the event listener wasn't strictly necessary. 
// Simply use the second argument of Timer(millisecondDelay, repeatCount). 
var timer:Timer = new Timer(5000, 1); 

init(); 
function init():void { 
    // Here, we've replaced your foo() with an initialization function where all 
    // one-time stuff gets done. 
    timer.addEventListener(TimerEvent.TIMER, afterWaiting); 
    timer.start(); 

    // Rather than checking within each card, we'll add the checks from the main stage. 
    // This also means you can get rid of the code inside the clips. 
    for each (var card:Object in deck) { 
     card.img.butpic1.addEventListener("click", checkCard); 
    } 

    showShuffledCards(); 
} 


function showShuffledCards():void { 
    removeCards(); 
    shuffleCards(); 
    placeCards(); 
} 

function removeCards():void { 
    for (var i:int = 0; i < deck.length; i++) { 
     // Ensure it needs to be removed, before attempting it. 
     if (deck[i].img.parent != null) { 
      removeChild(deck[i].img); 
     } 
    } 
} 

function shuffleCards():void { 
    /*Rather than keeping two arrays, and the shuffle only working once, we can 
    use sortOn() the existing array by changing the value of the property we're 
    sorting with. This effectively shuffles the deck, and allows us to shuffle 
    indefinitely.*/ 
    for each (var card:Object in deck) { 
     card.order = Math.random(); 
    } 

    deck.sortOn("order", Array.DESCENDING | Array.NUMERIC); 
} 

function placeCards():void { 
    // placeShuffledCards was doing the same thing as this function, 
    // so we simply use this one. 
    for (var i:int = 0; i < deck.length; i++) { 
     addChild(deck[i].img); 
     deck[i].img.x = locs[i].x + 20; 
     deck[i].img.y = locs[i].y; 
    } 
} 

function afterWaiting(event:TimerEvent):void { 
    // Rather than explicityly name each object, because we have them in a fancy 
    // array, we can write the command once, and call it on each card in the deck. 
    for each (var obj:MovieClip in deck) { 
     obj.gotoAndPlay(10); 
    } 
} 

function checkCard(e:Event):void { 
    // Search the deck for this card. 
    var successCount = 0; 
    for each (var card:Object in deck) { 
     if (e.currentTarget == card.img && card.valid) { 
      // If the card clicked is valid for winning, 
      // add the text and update its status. 
      card.img.gotoAndPlay(1); 

      var myTextBox:TextField = new TextField();  
      myTextBox.text = "Σωστό Συνέχισε!"; 
      myTextBox.border = true;  
      myTextBox.borderColor = 0x000000; 
      myTextBox.width = 180;  
      myTextBox.height = 87;  
      myTextBox.x = -77;  
      myTextBox.y = -126; 
      var myFormat:TextFormat = new TextFormat(); 
      myFormat.color = 000000;  
      myFormat.size = 24; 
      myFormat.align = TextFormatAlign.CENTER 
      myTextBox.background = true;  
      myTextBox.backgroundColor = 0xFFF000; 
      myTextBox.setTextFormat(myFormat); 
      card.img.addChild(myTextBox); 

      card.success = true; 
     } 

     // While we're looping through the deck, we'll also count up the number 
     // of successful clicks. 
     if (card.hasOwnProperty("success") && card.success == true) { 
      successCount++; 
     } 
    } 

    // If the count of successful clicks is 7, go to the "win" frame. 
    if (successCount == 7) { 
     gotoAndPlay("win") 
    } 
} 

Добавление

Поскольку вы еще не писал много вопросов, тем не менее, вы не можете быть знакомы с StackOverflow по правилам/привычками. При публикации кода, пожалуйста, обновите свой вопрос этим контентом. Его легче читать и можно отформатировать (в отличие от комментариев).

Как отлаживать

Beyond Пометив «Разрешить отладку» в параметрах публикации & проведение контрольно-Shift-Enter, чтобы запустить в режиме отладки, все, что вам нужно сделать, это ознакомиться с кадрами доступных; в частности «Стек вызовов», «Переменные», «Вывод» и редактор синтаксиса.

Code break

В этом случае, вы можете увидеть программу остановленной в функции init() на линии 90. Окно «Output» говорит нам о том, что что-то не существует, и от того, что перечислено на 90, что Должны быть card, img, logo1, или checkCard.

Теперь мы знаем, что существуют первые два, а последний существует, но логотип1 (и конкретно в этом месте) не существует. Слева вы видите переменные, доступные для текущей области кода в этот момент времени выполнения программы. Мы можем копать внутри card и найти img недвижимость, и отсюда мы действительно можем подтвердить, что нет logo1 собственности внутри img. Довольно просто, как только вы знаете, как работают окна, верно? :)

Как вы уже сообщали вам документ (и я повторю, потому что вы относительно новичок в SO), я позволил вам исправить ваш файл fla.Я также сделал еще один шаг, чтобы показать вам, где вы можете взять свой код, удалить код фрейма и полностью создать свою функциональность/пользовательский интерфейс из кода с нулевыми встроенными изображениями. Вы можете download it from Dropbox.

memory game

+0

Мое плохое, что должно быть объявление переменной до того, как: 'для каждого (вар OBJ: MovieClip в колоде) {' – Atriace

+0

спасибо за вашу помощь есть ошибка Scene 1, Layer «действия» , Frame 6, Строка 139 \t 1084: Синтаксическая ошибка: ожидается перед двоеточием. ошибка в этой строке: для каждого (obj: MovieClip в колоде) { –

+0

возникли эти ошибки TypeError: Ошибка # 1009: не удается получить доступ к свойству или методу ссылки на нулевой объект. \t в game_fla :: MainTimeline/INIT() [game_fla.MainTimeline :: frame6: 92] \t на game_fla :: MainTimeline/frame6() [game_fla.MainTimeline :: frame6: 82] \t в flash.display :: MovieClip/gotoAndPlay() \t at game_fla :: MainTimeline/clickstart() [game_fla.MainTimeline :: frame1: 5] –

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