1

大家下午好!

我在使用 hitTestObject 的 ActionScript 3.0 中有一个小问题。我想检查我的角色是否击中平台(我正在制作一个简单的平台游戏。)。我有一个用于操作脚本的平台对象,我将子对象添加到数组中。直到此时一切顺利,我可以将它们放在舞台上等。

如果我的字符碰到平台但它不能正常工作,我已经写了一个循环来检查。我的角色从第一个平台跌落,只有在撞到最后一个平台时才停止跌落。(所以对于数组中的最后一个,它运行良好。)

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

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);

}

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

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;
        }


     }
  }

提前感谢您的每一个帮助!

4

1 回答 1

0

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

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

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

  1. 与 1 的碰撞会将您的速度设置为零。
  2. 与 2 的碰撞将您的速度设置为 1.1。
  3. 与 3 的碰撞将您的速度设置为 1.1。

由于这些都在同一帧中连续发生,因此最终结果是您的角色永远不会停止,除非与平台 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 循环中应用速度和重力,因为我们不希望它发生在我们可能碰撞的每个对象上。相反,我们在确定是否与任何对象发生碰撞后设置一次。

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

于 2012-12-18T16:54:01.390 回答