【问题标题】:Pure ActionScript 3.0 - Memory GamePure ActionScript 3.0 - 记忆游戏
【发布时间】:2010-12-28 10:24:39
【问题描述】:

我是 ActionScript 3.0 的初学者。我正在制作一个简单的记忆游戏,我使用的工具是带有 flexsdk 插件的 Eclipse。现在我已经完成了洗牌和显示图像,以及图像的封面。

我的想法是当点击图片时,封面将移除并显示其背后的图片。 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);
  }
 }

}

请帮我弄清楚。谢谢。

【问题讨论】:

  • 感谢 Chris 帮我修复格式 =)

标签: eclipse actionscript-3


【解决方案1】:

好吧,我并没有真正详细阅读您的代码,但是从查看它来看,您似乎使事情变得非常复杂。所以让我给你一个提示,我将如何做到这一点......

1) 首先我会创建一个扩展精灵或位图的“卡片”类,主要包含该卡片的图像、封面/蒙版的图像、一些动画方法,如隐藏/显示等,可能还有一个“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 属性并使用通用点击处理程序。由你决定。 b) 单击时,将卡片的 ID 推送到数组中。如果你确实把它们变成了一个类,它们的 id 现在应该是 c1、c2 等,你可以这样做

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

6) 现在您必须确保 holder 数组一次只能保存两个值。然后进行检查。我正在编写一个带有许多假定函数和值的半伪代码:

//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 中删除卡片,但何时执行此操作由您自己决定;)

【讨论】:

    【解决方案2】:

    就我个人而言,我发现这个问题更多地与你洗牌的方式有关,因为它使识别什么牌变得更加困难。

    例如,假设您不是洗牌您的嵌入资产,而是首先创建您的卡片,以他们添加的图像命名它们,然后创建一个卡片数组(或向量)并洗牌该数组(或向量),识别这些卡片会相当容易,因为您只需要比较它们的 name 属性。

       //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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多