2015-06-21 2 views
1

Я делаю карточную игру «слюну», и я стараюсь иметь сразу три карты на сцене, чтобы перетащить ее в кучу. Поэтому мой вопрос заключается в том, как я могу иметь несколько экземпляров одного и того же объекта на сцене, но иметь возможность назначать каждой карте разные кадры и т. Д. Вот код, чтобы понять его контекст.Добавление нескольких экземпляров одного и того же объекта на сцену

«cardArray» имеет 53 кадра, 52 из которых имеют лицевую сторону карты, 53-й - это «колода».

//variables, constants 
var cardDeck:Array = new Array(); 
var timer:Timer = new Timer(2000); 
var j:int = 0; 
var card:MovieClip = new CardArray(); 
var cardInDeck:Boolean; 
const deckSize:int = 52; 

//events: 
card.addEventListener(MouseEvent.MOUSE_DOWN,fDown); 
card.addEventListener(MouseEvent.MOUSE_UP,fUp); 
startRandomise(); 

//This is where the unshuffled "deck" is created - values loaded into the array. 
function createDeck():void 
{ 
    var i:int; 
    for(i =0; i<deckSize; i++) 
    { 
     cardDeck[i] = i+1; 
    } 
} 

function randomizeDeck(a : *, b : *):int 
{ 
    return (Math.random()>.5) ? 1 : -1; 

} 

//Grab the value from the (presumably) current frame of the card 
function convertCard(cardNo:int):int 
{ 
    var deckPos:int; 
    if (cardNo <= deckSize/4) 
    { 
     deckPos = cardNo; 
    } 
    else if (cardNo > deckSize/4 && cardNo <= deckSize/2) 
    { 
     deckPos = cardNo -13; 
    } 
    else if (cardNo > deckSize/2 && cardNo <=deckSize*3/4) 
    { 
     deckPos = cardNo -deckSize/2; 
    } 
    else if (cardNo >39) 
    { 
     deckPos = cardNo -39; 
    } 
    return deckPos; 
} 

btn.addEventListener(MouseEvent.MOUSE_UP,showArray); 
function showArray(event:MouseEvent):void 
{ 
    if(j<deckSize /2) 
    { 
     addChild(card); 

     card.gotoAndStop(cardDeck[j]); 
     trace(cardDeck[j]+","+deckCompare[j]); 
     j++;   
    } 
    if(cardInDeck) 
    { 
     card.x = 200; 
     card.y = 200; 
     cardInDeck+false; 
    } 
} 



function fDown(evt:MouseEvent) 
{ 
    card.startDrag(); 
} 

function fUp(evt:MouseEvent) 
{ 
    stopDrag(); 
    if(card.hitTestObject(deck)) 
    { 
     trace("deck: "+convertCard(deck.currentFrame)); 
     trace("card: "+convertCard(card.currentFrame)); 
     if(convertCard(card.currentFrame) == convertCard(deck.currentFrame)+1 || convertCard(card.currentFrame) == convertCard(deck.currentFrame)-1 || convertCard(card.currentFrame) == 13 && convertCard(deck.currentFrame) == 1 || convertCard(card.currentFrame) == 1 && convertCard(deck.currentFrame) == 13 || convertCard(deck.currentFrame) == 14) 
     { 
      deck.gotoAndStop(card.currentFrame); 
      removeChild(card); 
      cardInDeck=true; 
     } 
     else 
     { 
      card.x = 200; 
      card.y = 200; 
     } 
    } 
    else 
    { 
     card.x = 200; 
     card.y = 200; 
    } 
} 


function startRandomise():void 
{ 
    createDeck(); 
    cardDeck.sort(randomizeDeck); 
    cardDeck.sort(randomizeDeck); 
    trace("random: "+cardDeck); 
    trace("deckCompare: "+deckCompare); 
    card.x = 200; 
    card.y = 200; 
    deck.gotoAndStop(53); 
} 
+0

Вы должны появляться каждый раз, когда новый объект «CardArray» и произвольно выберите кадр этой новой карты. – akmozo

+0

@ajar - вы поняли это? – BadFeelingAboutThis

ответ

0

Чтобы иметь несколько карт, вам нужно создать экземпляр более одной карты. Я ничего не знаю об игре в карточной игре и не понимаю цели многих ваших функций, но вы хотите что-то сделать в этих строках:

Создайте функцию, которая генерирует (создает экземпляр) новую карта:

function createCard(faceFrame):MovieClip { 
    var tmpCard:MovieClip = new CardArray(); //this creates a new instance of a card 
    tmpCard.addEventListener(MouseEvent.MOUSE_DOWN, cardMouseDown); //make the card call the mouse down function when that event is triggered 
    tmpCard.gotoAndStop(faceFrame); //assign the card it's face (frame) 
    addChild(tmpCard); //add the card to the screen 

    return tmpCard; 
} 

Затем в вашей мыши вниз обработчиком (я переименовал его, чтобы быть более ясным, что есть), вы можете сделать следующее на карту, которая была мышь сбитого:

function cardMouseDown(evt:MouseEvent) { 
    //the events currentTarget property is reference to the item that you attached the listener to, so in this case the card who triggered the mouse down 
    card = evt.currentTarget as MovieClip; //assign the current clicked card to the global card variable (so we can access it in the mouse up function) 
    card.startDrag(); 

    //add the mouse up listener on the stage, since there are cases where you can drag so fast that the mouse isn't over the item it's dragging (and then if you were to release the mouse at that moment it wouldn't dispatch the event) 
    stage.addEventListener(MouseEvent.MOUSE_UP, stageMouseUp); 
} 

Тогда ваш функция mouse up будет выглядеть примерно так:

function stageMouseUp(evt:MouseEvent) { 
    //remove the mouse up listener from the stage 
    stage.removeEventListener(MouseEvent.MOUSE_UP, stageMouseUp); 

    card.stopDrag(); 
    if(card.hitTestObject(deck)) 
    { 
    ......//rest if the code 

Похоже, вы хотели бы сгенерировать новую карту в функции showArray у вас есть? Так что-то вроде этого:

function showArray(event:MouseEvent):void 
{ 
    var newCard:MovieClip = createCard(cardDeck[j]); 
    j++ 

    newCard.y = newCard.x = 200; 

    trace(cardDeck[j]+","+deckCompare[j]);    
} 

Как и в стороне, вы должны рассмотреть вызов объектных карт что-то более разумным, как Card вместо CardArray, так как это не массив ...

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