定义矩形如何

时间:2014-06-27 10:57:26

标签: actionscript-3

我正在尝试开发一款游戏。在我的项目中,我有一个movieclip,它是游戏的角色。我还有5个按钮(左上向下并停止),以便用户可以移动。游戏是为了android。在我的图书馆里,我有一个方形,有50 x 50的dimnesions。我已经用不同的实例填充了这个方块的副本,所以角色可以移动它们。游戏的重点是用户移动角色和HitTestObject()函数,他删除了他正在行走的方格。我使用了一个计时器,所以如果5秒结束并且玩家没有完成一个缺失方块的矩形,则方块再次出现。但是如果他做的话一个矩形(假设他通过移除8个方格来实现)这个矩形内的方块也必须消失。我需要找到一种方法来查看玩家何时完成这个矩形。我也认为我的方法符合我想要的要做的就是选秀,而且有更好的选秀权。

提前致谢!

我想我可能还没有很好地解释我的问题。这就是我的错误!每当角色接触到一个正方形时,它就会消失。如果在5秒钟内,角色还没有完成#&# 34;矩形"当我说矩形时,我指的是方形的矩形。例如,如果4个方格缺失(不是连续)它的矩形,或者如果8个方格或12个等...

    import flash.utils.Timer;

stop();
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

var hunterxspeed:Number=0;
var hunteryspeed:Number=0;
var timerformove:Timer=new Timer(30);
var timerforblocks:Number=0;
var simpletimer:Number=0;
var rectanglearray:Array = new Array();
var sumvertical:int=0;
var sumhorizontal:int=0;
var i:int=0;


moveup.addEventListener(TouchEvent.TOUCH_TAP, fl_TapHandler_2);

function fl_TapHandler_2(event:TouchEvent):void
{
    hunteryspeed = -4;
    hunterxspeed = 0;
    rectanglearray[0] = 0;
    rectanglearray[1] = -1;
    sumvertical+=rectanglearray[0]+rectanglearray[1];
    i++;
}


movedown.addEventListener(TouchEvent.TOUCH_TAP, fl_TapHandler_3);

function fl_TapHandler_3(event:TouchEvent):void
{
    hunteryspeed = 4;
    hunterxspeed = 0;
    rectanglearray[0] = 0;
    rectanglearray[1] = 1;
    sumvertical+=rectanglearray[0]+rectanglearray[1];
    i++;

}


moveright.addEventListener(TouchEvent.TOUCH_TAP, fl_TapHandler_4);

function fl_TapHandler_4(event:TouchEvent):void
{
    hunterxspeed = 4;
    hunteryspeed = 0;
    hunter.scaleX = 2/4;
    rectanglearray[2] = 1;
    rectanglearray[3] = 0;
    sumhorizontal+= rectanglearray[2] +rectanglearray[3];
    i++;
}

moveleft.addEventListener(TouchEvent.TOUCH_TAP, fl_TapHandler_5);

function fl_TapHandler_5(event:TouchEvent):void
{
    hunterxspeed = -4;
    hunteryspeed = 0;
    hunter.scaleX = -(2/4);
    rectanglearray[2] = -1;
    rectanglearray[3] = 0;
    sumhorizontal+= rectanglearray[2] + rectanglearray[3];
    i++;
}


stopmove.addEventListener(TouchEvent.TOUCH_TAP, fl_TapHandler_6);

function fl_TapHandler_6(event:TouchEvent):void
{
    hunterxspeed = 0;
    hunteryspeed = 0;
}

timerformove.addEventListener(TimerEvent.TIMER,huntermove);
    function huntermove(e:TimerEvent) :void
    {
        if (hunter.y > stage.stageHeight-160)
        {
            hunter.y = stage.stageHeight-161;
            hunteryspeed = 0;
        }
        if (hunter.y < 20)
        {
            hunter.y = 21;
            hunteryspeed = 0;
        }
        if (hunter.x > stage.stageWidth-30)
        {
            hunter.x = stage.stageWidth-31;
            hunterxspeed = 0;
        }
        if (hunter.x < 30)
        {
            hunter.x = 31;
            hunterxspeed = 0;
        }
        hunterlegs.y = hunter.y+20;
        hunterlegs.x = hunter.x;
        hunter.y += hunteryspeed;
        hunter.x += hunterxspeed;



        if(timerforblocks==5000)
        {
            simpletimer+=50;
        }
        if(simpletimer>timerforblocks)
        {
            simpletimer=0;
            timerforblocks=0;
        }


        if(hunterlegs.hitTestObject(grass))
        {
            timerforblocks=5000;
            grass.x=grass.x-100;
        }
        if(hunterlegs.hitTestObject(grass1))
        {
            timerforblocks=5000;
            grass1.x=grass1.x-100;

        }
        if(hunterlegs.hitTestObject(grass2))
        {
            timerforblocks=5000;
            grass2.x=grass2.x-200;
        }
        if(hunterlegs.hitTestObject(grass12))
        {
            timerforblocks=5000;
            grass12.x=grass12.x-300;
        }
        if(hunterlegs.hitTestObject(grass22))
        {
            timerforblocks=5000;
            grass22.x=grass22.x-300;
        }
        if(hunterlegs.hitTestObject(grass21))
        {
            timerforblocks=5000;
            grass21.x=grass21.x-300;
        }
        if(hunterlegs.hitTestObject(grass20))
        {
            timerforblocks=5000;
            grass20.x=grass20.x-300;
        }
        if(hunterlegs.hitTestObject(grass10))
        {
            timerforblocks=5000;
            grass10.x=grass10.x-300;
        }
        if(sumvertical==0 && sumhorizontal==0 && i==4)
        {
            grass.x=2000;
            grass1.x=2000;
            grass2.x=2000;
            grass12.x=2000;
            grass22.x=2000;
            grass21.x=2000;
            grass20.x=2000;
            grass10.x=2000;
        }

    }
timerformove.start();

所有对象都在第一帧中。 我将草命名为第一个方格,然后我用不同的实例将其复制到100或更少。 猎人是我的角色。

1 个答案:

答案 0 :(得分:0)

矩形有4个角,角色最终到原点。

您可以尝试将数组保存在存储角色移动的位置。例如,如果角色向上移动,则存储{x: 0, y: -1},如果向左移动,则存储{x: 1, y: 0}

然后,当需要检查有效的矩形时,逐步查看移动列表并跟踪角落(方向改变的位置)并检查是否满足以下条件:

  • 所有水平移动的总和为0
  • 所有垂直移动的总和为0
  • 角落的总和为4

这将检查角色是否最终处于它最初开始的相同位置,以及它的移动是否形成有效的矩形。

如果不符合标准,请对阵列进行相同的检查,但从位置编号2开始。等等。

这样,您将在角色的移动过程中检查是否在任何阶段形成了一个有效的矩形(即使矩形只是角色总移动的一部分)。它还将验证任何大小的矩形。

这是一个可能清除事物的例子:

enter image description here

在第一种情况下,当水平和垂直计数器都为0时,角点数为4.这是一个有效的矩形。

在第二种情况中,当水平和垂直计数器都为0时,角点数为6.这不是矩形。


编辑以回复后续问题:

这有点棘手,因为看起来这个角色能够自由移动。如果你有一个角色一次一步地穿过网格的游戏,上面描述的系统变得微不足道。

虽然系统仍然适用,但您需要查看正在使用“square”的顺序。您仍然可以通过跟踪要击中的最后一个方格以及它在网格中的位置来制作相同的移动阵列。

例如,如果我们遵循第一个例子的模式,则按以下顺序吃掉正方形:

  • Square 1:[2,4]
  • 方形2:[1,4] - &gt;从上一个位置减去:[1-2,4 4-4] = [ - 1,0] &lt; - 将此添加到移动数组
  • Square 3:[1,3] - &gt;从上一个位置减去:[1-1,3-4] = [0,-1] &lt; - 将此添加到移动数组
  • Square 4:[1,2] - &gt;从上一个位置减去:[1-1,2-3] = [0,-1] &lt; - 将此添加到移动数组
  • ...
  • Square 12:[3,4] - &gt;从上一个位置减去:[3-4,4-4] = [ - 1,0] &lt; - 将此添加到移动数组
  • Square 13:[2,4] - &gt;从上一个位置减去:[2-3,4 4-4] = [ - 1,0] &lt; - 将此添加到移动数组

现在,您将拥有与上例中相同的移动数组。