2013-02-21 47 views
0

好吧,繼承人我的問題,這將需要一點解釋。檢查AS3中所有場景對象的字符命中測試

對於課堂上正在開發的AS3街機遊戲。這所大學有一個街機,機器上的操作系統由我們的老師開發,並提供一個軟件開發工具包。它沒什麼特別的,所以大部分都很簡單。我只想指出這一點,主要是因爲SDK沒有提供ENTER_FRAME事件和循環函數Im,而是使用一個名爲update()的覆蓋函數來執行每幀更新。

好吧,以避開我的問題。我有一個名爲GameState的文檔類,它在本質上處理遊戲。在這堂課中,我設置了世界和角色。現在它只有2座山,2座城堡,3座島嶼和角色。

private function initWorld():void 
    { 
     trace("World has initiated"); 
     addChild(hazardArea) 
     positionElement(hazardArea, 0, 560); 

     addChild(mountainSideRight); 
     positionElement(mountainSideRight, 730, 200) 

     addChild(mountainSideLeft); 
     positionElement(mountainSideLeft, 0, 200); 

     addChild(castleOne); 
     positionElement(castleOne, 5, 160); 

     addChild(castleTwo); 
     positionElement(castleTwo, 765, 160); 

     addIslands(); 
    } 

position元素只是一個函數,用於設置MC i添加到舞臺的x和y座標。現在,香港專業教育學院還設立了一個覆蓋上的AddChild,這樣每次我加一個孩子它保存成一個陣列以後可以訪問舞臺:

override public function addChild(object:*):void 
    { 
     super.addChild(object); 
     worldObjects.push(object); 
    } 

確定和三個島嶼通過addIsland看起來像這樣說:

private function addIslands():void 
    { 
     var island:Array = Islands.getIslandCords(); 
     for (var x:int = 0; x < DiceNumbers.NUM_ISLS; x++) 
     { 
      addChild(island[x].mc); 
      positionElement(island[x].mc, island[x].x, island[x].y); 

     } 
    } 

羣島僅僅是找到一個位置我的3個島嶼一堆數學和東西的一類...其實並不重要返回的數組包含的一個實例僅有3對象moveclip和它的x和y座標。

我也有一個單獨的角色類,代表我的矮人(我的遊戲中的角色)。那裏有什麼怪異的類不同的是,我有一個重力系統,看起來像這樣:

var gravity:Number = 2; 
public var moveX:Number = 300; 
public var moveY:Number = 50; 
public var xSpeed:Number = 0; 
public var ySpeed:Number = 2; 
public static const playerSpeed:Number = 3; 
public var friction:Number = .75; 

,然後update()函數,我提到的一樣EVENT_FRAME循環的作品,有這個在它:

public function update():void 
{ 
    xSpeed *= friction; 
    moveX += xSpeed; 
    moveY += ySpeed 
    theDwarf.y += gravity; 

    this.x = moveX; 
    this.y = moveY; 

    updateControls(); 
} 

theDwarf是我的矮人電影剪輯的實例,updateControls爲我的矮人提供了移動功能。

好的....所以最後在update()函數下我的GameState類中,我調用了我的碰撞類,並將場景中的所有對象都傳遞給它。在這一類我檢查了衝突

public function checkCollision(listOfObjects:Vector.<MovieClip>):void 
    { 

     for (var i:int = 0; i < worldObjects.length; i++) { 
      if(worldObjects[i] is Player){ 

       var objOne:MovieClip = worldObjects[i];    
       for (var j:int = 0; j < worldObjects.length; j++){ 
        if (j == i){ 
         // elimates self comparisons. 
        } 
        else{ 
         var objTwo:MovieClip = worldObjects[j]; 
         checkIntersect(objOne, objTwo) 
        } 
       } 
      } 
     } 
    } 

private function checkIntersect(player:MovieClip, objTwo:MovieClip):void 
    { 
     if(player.hitTestObject(objTwo)){ 
      player.ySpeed = -1; 
     } 
     else{ 
      player.ySpeed = 2; 
     } 
    } 

,我的問題是這樣的:這funcion檢查我的球員對舞臺上的每一個對象。所以儘管我的矮人在一個島上登陸,但他並沒有擊中其他兩個島,所以ySpeed一直保持重置爲2.如果我擺脫了其他聲明,我的矮人重力永遠不會回到2,他再也不會跌倒。我找不到解決方案......我很努力想找到解決這個問題的辦法,我很困難......我希望我的矮人掉下來,除非他在我的一個島嶼或一座山上。我希望我已經足夠清楚地解釋我的問題,現在已經變成一個巨大的帖子......:D謝謝!

+0

如果你碰到物體,你必須打破循環,所以它不會做進一步的檢查,並可能重置球員的速度。 – Urosan 2013-02-21 10:33:30

回答

0

爲了更好地從之前解釋我的意見,你必須改變那些過去2個功能是這樣的:

public function checkCollision(listOfObjects:Vector.<MovieClip>):void 
{ 

    OuterLoop: for (var i:int = 0; i < worldObjects.length; i++) { 
     if(worldObjects[i] is Player){ 

      var objOne:MovieClip = worldObjects[i];    
      for (var j:int = 0; j < worldObjects.length; j++){ 
       if (j == i){ 
        // elimates self comparisons. 
       } 
       else{ 
        var objTwo:MovieClip = worldObjects[j]; 
        player.ySpeed = checkIntersect(objOne, objTwo) 
        if (player.ySpeed == -1) 
         break OuterLoop; 
       } 
      } 
     } 
    } 
} 

private function checkIntersect(player:MovieClip, objTwo:MovieClip):int 
{ 
    if(player.hitTestObject(objTwo)){ 
     return -1; 
    } 
    else{ 
     return 2; 
    } 
} 

這也可以做的更好的方法。但這是解決您的問題的最快捷方式。

+0

謝謝!你的例子並不適用於我玩家是checkIntersect的一個私有屬性,雖然它可能只是改變爲objOne,但並不存在於checkCollision中,但即便如此,我測試了這一點,而我的矮人根本沒有跌落。然而!感謝你的邏輯,我只是​​以不同的方式實現它,checkIntersect返回一個布爾值,如果沒有命中則返回false,如果命中則返回true。然後在checkCollision中,我創建了一個名爲hit的布爾變量,然後將checkIntersect返回給它,並創建一個類似的if條件,如果爲TRUE,我只返回該函數。似乎工作到目前爲止! – 2013-02-21 11:08:44

+0

另外,如果你有時間,我會對如何以更好的方式完成這項工作感興趣。 – 2013-02-21 11:11:04