首页 > 解决方案 > 拖放阵列 AS3

问题描述

我正在尝试使用主要是数组在 Actionscript 3 中创建拖放游戏。在进入主游戏之前,我先在一个更简单的游戏上做这件事,因为我需要先知道代码是如何工作的。

更简单的游戏只是有两个正方形和两个圆圈。两个正方形在不同的阵列上,而两个圆圈在同一个阵列上。应该发生的是,当任何一个圆圈击中 (hitTestPoint) 右方格时,它们的 x 和 y 成为方格的中心。(就像它点击到中心一样)。并且当任一圆圈击中左侧方块时,它应该将圆圈返回到它们的最后位置(不必是它们的原始位置)。

这是代码:

包裹 {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.display.DisplayObject;
import flash.geom.Point;
import flash.events.Event;


public class MC_MAIN extends MovieClip
{

    var mc1:mc_circle;
    var mc2:mc_circle;
    var mc3:mc_square;
    var mc4:mc_square;
    var Shapes:Array;
    var Target:Array;
    var WTarget:Array;

    var newPlace:Point;

    public function MC_MAIN()
    {
        // constructor code

        init();
    }

    function init():void
    {
        Shapes = new Array  ;
        Target = new Array  ;
        WTarget = new Array  ;

        mc3 = new mc_square();
        mc3.height = 75;
        mc3.width = 75;
        mc3.x = 400;
        mc3.y = 200;
        Target.push(mc3);
        addChild(mc3);

        mc4 = new mc_square();
        mc4.height = 75;
        mc4.width = 75;
        mc4.x = 150;
        mc4.y = 200;
        WTarget.push(mc4);
        addChild(mc4);

        mc1 = new mc_circle();
        mc1.height = 25;
        mc1.width = 25;
        mc1.x = 100;
        mc1.y = 100;
        Shapes.push(mc1);
        addChild(mc1);

        mc2 = new mc_circle();
        mc2.height = 25;
        mc2.width = 25;
        mc2.x = 200;
        mc2.y = 200;
        Shapes.push(mc2);
        addChild(mc2);

        for (var i:int = 0; i<Shapes.length; i++)
        {
            Shapes[i].addEventListener(MouseEvent.MOUSE_DOWN, DRG);
            Shapes[i].addEventListener(MouseEvent.MOUSE_UP, SDRG);
        }
    }

    function DRG(e:MouseEvent):void
    {
        e.currentTarget.startDrag();
    }

    function SDRG(e:MouseEvent):void
    {
        e.currentTarget.stopDrag();

        for (var m:int = 0; m<Shapes.length; m++)
        {
            newPlace = new Point(Shapes[m].x,Shapes[m].y);
        }
        trace(newPlace);

        for (var a:int = 0; a<Target.length; a++)
        {
            for (var b:int = 0; b<Shapes.length; b++)
            {
                if (Target[a].hitTestPoint(Shapes[b].x,Shapes[b].y))
                {
                    Shapes[b].x = Target[a].x;
                    Shapes[b].y = Target[a].y;
                }
            }
        }

        for (var c:int = 0; c<WTarget.length; c++)
        {
            for (var d:int = 0; d<Shapes.length; d++)
            {
                if (WTarget[c].hitTestPoint(Shapes[d].x,Shapes[d].y))
                {
                    Shapes[d].x = newPlace.x;
                    Shapes[d].y = newPlace.y;
                }
            }
        }
    }
}

}

发生的情况是左侧方块的代码不起作用,但它们没有语法错误。当任一圆圈击中左侧方块时,什么都不会发生。

当我试图追踪圆圈的位置时,它只显示其中一个的 x & y 坐标。(我猜它正在跟踪索引为 0 的数组的第一个对象。我只是问我是否猜对了这部分。)

标签: arrays

解决方案


我有点难以遵循逻辑,并且有些点没有多大意义,例如:

for (var m:int = 0; m<Shapes.length; m++)
{
  newPlace = new Point(Shapes[m].x,Shapes[m].y);
}

newPlace将是最后一个shapein的位置Shapes,因此循环相当无用。

我想你需要的是这样的:

public class MC_MAIN extends MovieClip
{
  private leftSquares:Array;
  private rightSquares:Array;
  //more of the members from above
  private startPos:Point;

  //init the thing and add left and right squares
  //to there respective Array

  function DRG(e:MouseEvent):void
  {
    var t:DisplayObject = e.currentTarget;
    //save the starting position
    startPos = new Point(t.x,t.y);
    t.startDrag();
  }

  function SDRG(e:MouseEvent):void {
    var t:DisplayObject = e.currentTarget;

    //find all squares from the left
    //the target »hits«
    var leftHits:Array = leftSquares.filter(
     function (square:DisplayObject) {
       return square.hitTestPoint(t.x, t.y);
     });


    //same for the right
    var leftHits:Array = rightSquares.filter(
     function (square:DisplayObject) {
       return square.hitTestPoint(t.x, t.y);
     });

     //now you can apply the logic
     //based on the hit Test result
     //this way you can handle the case
     //if it hits both, to throw an error
     //or alike
     if(leftHits.length > 0) {
       //reset position
       t.x = startPos.x;
       t.y = startPos.y;
     }

     else if (rightHits.length > 0) {
       //set the position tp the desired item in rightHits
     }

     else {

     }
  }
}

请不要因为我的动作脚本技能很长时间没有使用过,所以上面的代码可能无法编译。这是为了说明这个想法。重要的是以下步骤:

1. Save the starting position, to be able to reset it
2. Sort the `squares` in respective lists for left and right
3. Hit test both and apply the logic.

推荐阅读