Чистый ActionScript 3.0 - игра памяти - PullRequest
1 голос
/ 28 декабря 2010

Я новичок в ActionScript 3.0. Я делаю простую игру памяти, я использую Eclipse с плагином flexsdk. Прямо сейчас я сделал перемешивание и отображение изображений, а также обложку изображений.

Моя идея заключается в том, что при нажатии на изображение крышка будет удалена и покажет изображение позади нее. После того, как 2 обложки исчезнут, игра сравнит и проверит, совпадают ли выбранные изображения или нет, если совпадение сохранится, оба изображения сохранятся, в противном случае обложка появится снова и игра продолжится. Если все изображения совпадают, появится выигрышная строка.

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

package  {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import myclasses.Cover;

 public class Prototype extends Sprite {
  protected static const WIDTH:int=3;
  protected static const HEIGHT:int=2;
  protected static const SPACINGX:int=100;
  protected static const SPACINGY:int=74;
  protected static const OFFSETX:int=96;
  protected static const OFFSETY:int=100;
  protected static const SIZE:Number=100;
  protected static const COLOUR:uint=0x999999;

  [Embed(source="images/pic1.jpg")]
  protected static const PIC1:Class;

  [Embed(source="images/pic2.jpg")]
  protected static const PIC2:Class;

  [Embed(source="images/pic3.jpg")]
  protected static const PIC3:Class;

  protected var imagesList:Array=[PIC1,PIC1,PIC2,PIC2,PIC3,PIC3];
  protected var X:int;
  protected var Y:int=27;
  protected var count:int;
  //protected var firstTap:Class;
  //protected var secondTap:Class;

  public function Prototype() {
   var shuffled:Array = shuffleList(imagesList.length);
   for(var i:int; i<imagesList.length; i++) {
    //var colour:uint;
    //colour=0x999999;
    var j:int = shuffled[i];
    var thing:Sprite=new Sprite();
      thing.addChild(new imagesList[j]());
      thing.x=X;
      thing.y=Y;
      addChild(thing);
      new Cover(this,X,Y,SIZE,COLOUR);
      X=X+SPACINGX+OFFSETX;
      count++;
      if(count == WIDTH){
       Y=Y+SPACINGY+OFFSETY;
       X=0;
      }
      addEventListener(MouseEvent.MOUSE_DOWN,selectImages);
   }
  }
  public function selectImages(event:MouseEvent):void {
            //(P/S: this is not the actual code)
   var target:Sprite = Sprite(event.target)    
   if(firstTap == null){
    firstTap = ;    //1st selected image
    removeChild(target);
   }else if(secondTap == null){
    secondTap = ;   //2nd selected image
    if(firstTap == secondTap){
     firstTap = null;
     secondTap = null;
    }else{
     //firstTap = ; //cover back
     //secondTap = ; //cover back
     secondTap = null;
     firstTap = ;    //selected another image
    }
   }
  }

  protected function shuffleList(n:Number):Array {
      var startList:Array = new Array(n);
      var endList:Array = new Array(n);
      var i:Number, j:Number;

      for (i=0; i<n; i++) {
       startList[i] = i;
      }

      for (i=0; i<n; i++) {
       j = Math.floor(Math.random()*startList.length);
       endList[i] = startList.splice(j,1)[0];
      }
      return(endList);
  }
 }

}

Пожалуйста, помогите мне разобраться. Спасибо.

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Ну, я на самом деле не детально рассмотрел ваш код, но, глядя на него, кажется, вы делаете вещи действительно сложными.Итак, позвольте мне дать вам подсказку, как бы я это сделал ...

1) Сначала я бы сделал класс 'card', который расширяет спрайт или растровое изображение, в основном содержащее изображение этой карты, изображениеcover / mask, некоторые методы анимации, такие как hide / show и т. д., и, возможно, переменная 'id', чтобы распознать ее позже, хотя в этом нет необходимости.Вы также можете избавиться от имеющегося массива, и в этом случае пропустите шаг 2.

2) Теперь вставьте две копии каждой карты в массив.пример [new card('c1'),new card('c1'),new card('c2'),new card('c2'),.....].

3) Теперь пришло время, когда вы сделали его наиболее сложным, то есть перемешивание массива.Давайте напишем специальную функцию для этого, не так ли?

function shuffleArr(arr):Array
{
   var len:int = arr.length();
   for(var i:int=0; i<len; i++)
   {
      //Swap the value at i with a random value within the array;
      var tmp_pos:int = Math.floor(Math.random()*len);
      while(tmp_pos==i)
      {
         tmp_pos = Math.floor(Math.random()*len);
      }
      var tmp_var:card = arr[tmp_pos];
      arr[tmp_pos] = arr[i];
      arr[i] = tmp_var; 
   }
}

4) Теперь, когда массив перемешан, вам просто нужно выложить их в сетку.

for(var row:int=0; row<6; row++)
{
  for(var col:int=0; col<6; col++)
  {
    card_arr[i].x = card_arr[i].width*cols+5;
    card_arr[i].y = card_arr[i].height*row+5;
    stage.addChild(card[i]);
  }
}

5) Теперь вам нужно проверить, нет ли у пользователя клика, и выполнить действие, и есть много способов сделать это, но я расскажу об одном из них ... a) Дайте картам обработчик события щелчка, это легко сделать, если картыкласс, или вы можете посмотреть в event.target свойство и использовать общий обработчик кликов.тебе решать.б) Нажмите на кнопку, нажмите идентификатор карты в массиве.Если вы сделали их в классе, их идентификаторы должны быть, c1, c2 и т. Д., И вы можете сделать это

holder_arr.push(this);
this.removeCover();

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

//Insert
if(holder_arr.length()==2)
{
  //flip back the cards and empty the array
  holder_arr[0].showCover();
  holder_arr[1].showCover();
  holder_arr = [];
}
holder_arr.push(this);
...
..

7) Для проверки создайте функцию и запускайте ее каждый раз при нажатии на карту, а также по окончании таймера,перевернуть карты.

function checkCards()
{
  if(holder_arr.length==2)
  {
     if(holder_arr[0].id==holder_arr[1].id)
     {
       //the cards match
       holder_arr[0].vanishAnim();
       holder_arr[1].vanishAnim();
       holder_arr=[];
     }
     else
     {
       holder_arr[0].showCover();
       holder_arr[1].showCover();
       holder_arr=[];
     }
  }
}

Очевидно, вы тоже удалите карты из фактического card_arr, но когда это сделать, решать вам;)

0 голосов
/ 28 декабря 2010

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

Скажем, например, что вместо перетасовки ваших встроенных ресурсов вы сначала создавали свои карты, называли их после добавляемого ими изображения, затем создавали массив (или вектор) карт и перемешивали этот массив (или вектор)), идентификация карт будет довольно простой, поскольку вам нужно будет только сравнить их имя свойства.

   //PSEUDO CODE
   - create Array ( Vector ) of embed assets [PIC1, PIC2 , PIC3]
   - create cards and use Array ( Vector ) index to identify 
   each card with the name property
   - create a set of six cards
   - shuffle set 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...