2013-07-23 32 views
0

目前我正在創建一個重新創建馬里奧級別的項目,我的問題是,當我沒有硬編碼bottomLimit(場地,目前設置爲400)時,馬里奧最終只會落空。Actionscript 3.0與數組創建邊界

另一件我不能弄清楚的是我如何移動我的隱形塊,創建地板邊界以適應地板。所選的水平是超級馬里奧兄弟3的要塞級別,如果這有助於描繪我正在試圖用它做什麼。

有幾個.as文件給我的代碼,我會把我的麻煩文件與我的碰撞代碼一起。

package { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.ui.Keyboard; 
import flash.events.KeyboardEvent; 
import flash.media.Sound; 


public class FortressMap extends MovieClip 
{ 
    private var _mario:SmallMario; 
    private var vx:Number = 0; 
    private var vy:Number = 0; 
    private var _ceiling:Array = new Array(); 
    private var _floor:Array = new Array(); 
    public const accy:Number = 0.20; 
    public const termv:Number = 15; 
    public var onGround:Boolean; 
    public var bottomLimit:Number; 

    public function FortressMap() 
    { 
     addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

     _mario = new SmallMario(); 
     addChild(_mario); 
     _mario.x = 50; 
     _mario.y = 400; 

     //Creating the blocks for the floor 
     createFloor(16, 416); 

     //Creating the blocks for the ceiling 
     createCeiling(16, 352); 
} 

    private function createFloor(xPos:Number, yPos:Number):void 
    { 
     var floor:Floor = new Floor(); 
     addChild(floor); 
     floor.x = xPos; 
     floor.y = yPos; 
     floor.height = 16; 
     _floor.push(floor); 
     floor.visible = false; 
    } 

    private function createCeiling(xPos:Number, yPos:Number):void 
    { 
     var ceiling:Ceiling = new Ceiling(); 
     addChild(ceiling); 
     ceiling.x = xPos; 
     ceiling.y = yPos; 
     ceiling.height = 16; 
     _ceiling.push(ceiling); 
     ceiling.visible = false; 
    } 

    private function addedToStageHandler(event:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 
     addEventListener(Event.ENTER_FRAME, frameHandler); 
     addEventListener(Event.REMOVED_FROM_STAGE, removeStageHandler); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 
    } 

    private function frameHandler(event:Event):void 
    { 

     _mario.x += vx; 
     _mario.y += vy; 


     if (_mario.x < 16) 
     { 
      _mario.x = 16; 
     } 

     vy += accy; 

     for (var i:int = 0; i < _ceiling.length; ++i) 
     { 
      Collision.block(_mario, _ceiling[i]); 
     } 
     for (var j:int = 0; j < _floor.length; ++j) 
     { 
      Collision.block(_mario, _floor[j]); 
     } 

     bottomLimit = 400; 

     if(_mario.y >= bottomLimit) 
     { 
      _mario.y = bottomLimit; 
      vy = 0; 
      onGround = true; 

     } 
     else 
     { 
      onGround = false; 
     }   
    } 

    private function keyDownHandler(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT) 
     { 
      vx = -5; 
      return; 
     } 
     if (event.keyCode == Keyboard.RIGHT) 
     { 
      vx = 5; 
      return; 
     } 
     if (event.keyCode == Keyboard.UP) 
     { 
      if(onGround == true) 
      { 
       vy = -5; 
       trace("My people need me!"); 
      } 
      return; 
     } 
     if (event.keyCode == Keyboard.DOWN) 
     { 
      //vy = 5; 
      return; 
     } 
    } 

    private function keyUpHandler(event:KeyboardEvent):void 
    { 
     if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT) 
     { 
      vx = 0; 
      return; 
     } 
     if (event.keyCode == Keyboard.UP || event.keyCode == Keyboard.DOWN) 
     { 
      //vy = 0; 
      return; 
     } 
    } 

    private function removeStageHandler(event:Event):void 
    { 
     removeEventListener(Event.ENTER_FRAME, frameHandler); 
     removeEventListener(Event.REMOVED_FROM_STAGE, removeStageHandler); 
     stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler); 
     stage.removeEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 
    } 
} 

包 { 進口flash.display.Sprite;

public class Collision 
{ 
    static public var collisionSide:String = ""; 

    public function Collision() 
    { 
    } 
    static public function block(r1:Sprite, r2:Sprite):Boolean 
    { 
     var isBlocked:Boolean; 
     //Calculate the distance vector 
     var vx:Number 
      = (r1.x + (r1.width/2)) 
      - (r2.x + (r2.width/2)); 

     var vy:Number 
      = (r1.y + (r1.height/2)) 
      - (r2.y + (r2.height/2)); 

     //Check whether vx 
     //is less than the combined half widths 
     if(Math.abs(vx) < r1.width/2 + r2.width/2) 
     { 
      //A collision might be occurring! Check 
      //whether vy is less than the combined half heights 
      if(Math.abs(vy) < r1.height/2 + r2.height/2) 
      { 
       //A collision has ocurred! This is good! 

       //Find out the size of the overlap on both the X and Y axes 
       var overlap_X:Number 
       = r1.width/2 
        + r2.width/2 
        - Math.abs(vx); 

       var overlap_Y:Number 
       = r1.height/2 
        + r2.height/2 
        - Math.abs(vy); 

       //The collision has occurred on the axis with the 
       //*smallest* amount of overlap. Let's figure out which 
       //axis that is 

       if(overlap_X >= overlap_Y) 
       { 
        //The collision is happening on the X axis 
        //But on which side? _v0's vy can tell us 
        if(vy > 0) 
        { 
         collisionSide = "Top"; 

         //Move the rectangle out of the collision 
         r1.y = r1.y + overlap_Y; 
         //r1 is being blocked 
         isBlocked = true; 
        } 
        else 
        { 
         collisionSide = "Bottom"; 

         //Move the rectangle out of the collision 
         r1.y = r1.y - overlap_Y; 
         //r1 is being blocked 
         isBlocked = true; 
        } 
       } 
       else 
       { 
        //The collision is happening on the Y axis 
        //But on which side? _v0's vx can tell us 
        if(vx > 0) 
        { 
         collisionSide = "Left"; 

         //Move the rectangle out of the collision 
         r1.x = r1.x + overlap_X; 
         //r1 is being blocked 
         isBlocked = true; 
        } 
        else 
        { 
         collisionSide = "Right"; 

         //Move the rectangle out of the collision 
         r1.x = r1.x - overlap_X; 
         //r1 is being blocked 
         isBlocked = true; 
        } 
       } 
      } 
      else 
      { 
       //No collision 
       collisionSide = "No collision"; 
       //r1 is not being blocked 
       isBlocked = false; 
      } 
     } 
     else 
     { 
      //No collision 
      collisionSide = "No collision"; 
      //r1 is not being blocked 
      isBlocked = false; 
     } 
     return isBlocked; 
    } 
} 

}

回答

0

我想你想要做的是設置bottomlimit,而不是硬編碼數400,是否正確?

我會做更改createFloor方法:

private function createFloor(xPos:Number, yPos:Number):void 
{ 
    var floor:Floor = new Floor(); 
    addChild(floor); 
    floor.x = xPos; 
    floor.y = yPos; 
    floor.height = 16; 
    _floor.push(floor); 
    floor.visible = false; 

    // set bottom limit here 
    bottomLimit = yPos; 
} 

...那麼你不會需要將其設置爲400

然而,另一種選擇是改變你的if語句:

if(_mario.y >= Floor(_floor[0]).y) 
    { 
     _mario.y = Floor(_floor[0]).y; 
     vy = 0; 
     onGround = true; 

    } 
    else 
    { 
     onGround = false; 
    }  

...然後你可以完全擺脫bottomLimit變量 (假設我理解你的代碼,並且地磚總是在botto mLimit)

+0

在添加了任何一個後,他在經過yPos調整之後,仍然只落地到地板的yPos,他不再經過。現在由於某種原因,他拒絕跳躍,直到他離開之前所述的樓層,所以在這種情況下,我調整了「createFloor(16,400);」當他從16開始移過線時,他將允許自己跳躍。 –