2012-12-16 51 views
1

大家下午好!陣列上的ActionScript 3.0 HitTestObject

我在使用hitTestObject的ActionScript 3.0中遇到了一個小問題。 如果我的角色碰到了一個平臺(我正在製作一個簡單的平臺遊戲),我想選擇。 我有一個平臺對象exproted爲動作腳本,並且我將這個孩子添加到一個數組中。 直到這一切一切順利,我可以把他們放在舞臺上等

我已經寫了chechk週期如果我caharacter擊中平臺,但它不能正常工作。我的角色落在了第一個平臺上,只有當它碰到最後一個平臺時才停下來。 (所以對於陣列中的最後一個,效果很好。)

現在這裏是我的代碼的這一部分,我希望有人能幫助我。 :)

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僅適用於THE LAST平臺

PORK1_mc.hitPork_mc這是我的性格(hitPork_mc是爲了更好的HitTestObject一種無形的矩形。所以,我寫我的焦炭。直到最後一個,他落在最後一個並停止下降,所以對於陣列中的最後一個平臺它完美地工作。 我不想在我的代碼上改變很多,只有在hitTest部分if它的可能性。

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


    } 
    } 

感謝您提前給予的幫助!

+0

大家好! 我今晚解決了這個問題。我已經提出了這個詞:返回if在velocity = 0;它完美的工作,但我仍然不明白爲什麼現在它的作品。 – user1907809

回答

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

注意,這裏我們不是爲循環應用的速度和重力裏面,因爲我們不我們不希望它發生在我們可能碰撞的每個物體上。相反,在我們確定是否與任何對象發生碰撞後,我們將其設置一次。

這也有助於表明,即使看起來沒有任何點將其設置爲零,您仍然可以設置每幀不會碰撞的重力;我懷疑這是你想解決的問題。

+0

謝謝你的回答。現在我明白了什麼是問題,爲什麼我可以使用return關鍵字。 – user1907809