1

皆さんこんにちは!

ActionScript 3.0 で、hitTestObject に小さな問題があります。キャラクターがプラットフォームにヒットしたかどうかを確認したい (単純なプラットフォーム ゲームを作成しています)。アクションスクリプト用にエクスプロートされたプラットフォームオブジェクトがあり、これを子から配列に追加します。この時点まではすべてうまくいき、私はそれらをステージなどに置くことができます.

私のキャラクターがプラットフォームにヒットしたかどうかをチェックするサイクルを書きましたが、正しく動作しません。私のキャラクターは最初のプラットフォームを通過して落下し、最後のプラットフォームにぶつかったときに落下が止まります. (したがって、配列の最後の部分ではうまく機能します。)

そして今、これが私のコードのこの部分です。誰かが私を助けてくれることを願っています。:)

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


     }
  }

事前にご協力いただきありがとうございます。

4

1 に答える 1

0

元のコードを使用して、プラットフォームごとに次のことを行います。

  • 衝突が発生した場合は、速度をゼロに設定します。
  • そうでない場合は、速度を 1.1 に設定します。

これを順番に行うため、プラットフォーム 1 と衝突し、2 または 3 と衝突しない場合は次のようになります。

  1. 1 と衝突すると、速度が 0 に設定されます。
  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 に答える