Array上的ActionScript 3.0 HitTestObject

时间:2012-12-16 12:49:51

标签: actionscript-3

大家下午好!

我在使用hitTestObject的ActionScript 3.0中遇到了一个小问题。 如果我的角色遇到一个平台(我正在制作一个简单的平台游戏),我想chechk。 我有一个针对动作脚本exproted的平台对象,我将childs frim添加到一个数组。 在此之前一切顺利,我可以把它们放在舞台上等等。

如果我的caharacter击中平台但是它无法正常工作,我已经写了一个循环来chechk。我的角色落在第一个平台上,只有当它击中最后一个平台时才停止下降。 (因此,对于数组中的最后一个,它运行良好。)

现在这部分来自我的代码,我希望有人可以帮助我。 :)

import flash.events.Event;
import flash.geom.Rectangle;

stop();
var vy:Number=0;
var gv:Number=1;
var sebesseg:Number=4;
var jumped:Boolean=false;
var stay:Boolean=false;

var level:Array=new Array  ;

var gravity:Number=2;

var velocity:Number=1.1;

var platform0:MovieClip=new platform  ;
level.push(addChild(platform0));
level[0].x=200;
level[0].y=450;
var platform1:MovieClip=new platform  ;
level.push(addChild(platform1));
level[1].x=700;
level[1].y=650;
var platform2:MovieClip=new platform  ;
level.push(addChild(platform2));
level[2].x=1000;
level[2].y=800;

stage.addEventListener(Event.ENTER_FRAME, cameraFollowCharacter);

function cameraFollowCharacter(evt:Event) {
root.scrollRect=new Rectangle(PORK1_mc.x-(stage.stageWidth/2)+320,PORK1_mc.y-(stage.stageHeight/2)-50,stage.stageWidth,stage.stageHeight);
}




stage.addEventListener(KeyboardEvent.KEY_DOWN,gomb);
function gomb(k:KeyboardEvent):void {
    trace(k);
    if (k.keyCode==37) {
        if (sebesseg==2) {
            sebesseg=sebesseg+0;
         } else {
            sebesseg-=1;
         }
    } else if (k.keyCode==39) {
        sebesseg+=1;
    } else if (k.keyCode==Keyboard.ESCAPE) {
        stop();
        root.scrollRect=new Rectangle    (stage.x,stage.y,stage.stageWidth,stage.stageHeight);

        gotoAndStop(2);

    } else if (k.keyCode==Keyboard.F1 && stay==false) {
        stage.frameRate=0;
        stay=true;
    } else if (k.keyCode==Keyboard.F1 && stay==true) {
        stage.frameRate=24;
        stay=false;
    }

   }


stage.addEventListener(Event.ENTER_FRAME, megy);
function megy(e:Event):void {
   PORK1_mc.x+=sebesseg;

   gravity*=velocity;
   PORK1_mc.y+=gravity;
   //trace(velocity);

}

这一部分是问题,HITTESOBJECT仅适用于最后的平台

PORK1_mc.hitPork_mc这是我的角色(hitPork_mc是一个不可见的矩形,用于更好的HitTestObject。所以当我写下我的角色时,直到最后一个,它落在最后一个并且停止下降,所以对于最后一个平台在阵列中它完美地运作。 我不想在我的代码上做很多改变,只在hitTest部分改变它的可能性。

 this.addEventListener(Event.ENTER_FRAME, handleEnterFrame);

 function handleEnterFrame(e:Event):void {
     for (var i:int = 0; i < level.length; i++) {



        if (level[i].hitTestObject(PORK1_mc.hitPork_mc)) {
            velocity=0;

        } else {

            velocity=1.1;
            gravity=4;
        }


     }
  }

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用原始代码,您可以为每个平台执行以下操作:

  • 如果发生碰撞,请将速度设置为零。
  • 如果不是,请将速度设置为1.1。

由于您按顺序执行此操作,以下是当您与平台1发生碰撞而不是2或3时发生的情况:

  1. 与1的碰撞将您的速度设置为零。
  2. 与2的碰撞将您的速度设定为1.1。
  3. 与3的碰撞将你的速度设定为1.1。
  4. 由于这些在同一帧中连续发生,最终结果是你的角色永远不会停止,除非碰撞是在平台3上。

    通过在将速度设置为零后返回,您将脱离循环,从而防止您的碰撞工作被撤消。你正在做的事情会起作用,但你也可以采用另一种不那么简洁但可能更有意义的方式:

    function handleEnterFrame(e:Event):void 
    {
      var collided:Boolean = false; //This will record if you collided or not.
    
      for (var i:int = 0; i < level.length; i++) 
      {
        if (level[i].hitTestObject(PORK1_mc.hitPork_mc)) 
        {
          collided = true;
        } 
      }
    
      if(collided) velocity = 0;
      else
      {
        velocity=1.1;
        gravity=4;
      }
    }
    

    请注意,这里我们没有在for循环中应用速度和重力,因为我们不希望它发生在我们可能碰撞的每个对象上。相反,在我们确定是否与任何物体发生碰撞之后,我们设置了一次。

    这也有助于表明你在每一帧都没有碰撞时设置重力,即使你似乎没有将它设置为零的任何点;我怀疑这是你要解决的问题。