2012-01-03 70 views
0

我在做一個迷宮遊戲。角色不能穿過迷宮的牆壁(因爲從角色的位圖數據和牆壁的bmd之間的碰撞檢測)。當字符到達一個門,一個新的水平/幀應該用新的迷宮(新邊界)As3如何刪除或更新一個新的級別bitmapdata?

對於下一級(下一個幀)出現,我由具有不同壁的新的迷宮。但是第一個迷宮的位圖數據仍然是「活躍的」。所以即使有一個新的迷宮,以前牆壁的位圖數據也是不可見的,但仍然在舞臺上繪製。

我的問題給你: 我想改變邊界/迷宮的每一幀,我如何刪除以前的位圖數據,使角色不會走過下一個迷宮的界限?或者有可能從不同的'邊界'創建一個數組?

stop(); 
var isRight:Boolean=false; 
var isLeft:Boolean=false; 
var isUp:Boolean=false; 
var isDown:Boolean=false; 
var speed:int = 10; 

var mazeRect:Rectangle = bounds.getBounds(this); 
var charRect:Rectangle = char.getBounds(this); 
var boundsBmpData = new BitmapData(mazeRect.width, mazeRect.height, true, 0); 
var charBmpData = new BitmapData(charRect.width, charRect.height, true, 0); 

boundsBmpData.draw(bounds); 
charBmpData.draw(char); 

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
stage.addEventListener(Event.ENTER_FRAME, moving); 



    function keyPressed(event:KeyboardEvent):void 
     { 
      if(event.keyCode==39){ 
      isRight=true} 
      if(event.keyCode==37){ 
      isLeft=true} 
      if(event.keyCode==38){ 
      isUp=true} 
      if(event.keyCode==40){ 
      isDown=true} 
     } 

    function keyReleased(event:KeyboardEvent) 
     { 
      if(event.keyCode==39){ 
      isRight=false} 
      if(event.keyCode==37){ 
      isLeft=false} 
      if(event.keyCode==38){ 
      isUp=false} 
      if(event.keyCode==40){ 
      isDown=false} 
     } 



    function moving(e: Event): void 
     { 
       var newx: Number = char.x - (isLeft ? speed : 0) + (isRight ? speed : 0); 
       var newy: Number = char.y - (isUp ? speed : 0) + (isDown ? speed : 0); 
       if(!boundsBmpData.hitTest(new Point(bounds.x, bounds.y), 
             255, 
             charBmpData, 
             new Point(newx, newy), 
             255)) 
       { 
       char.x = newx; 
       char.y = newy; 
       } 

       if(char.hitTestObject(door)) 
         { 
         onHitTest(); 
         } 

     } 

    function onHitTest() : void 
     { 
      nextFrame(); 

     } 
+1

我不知道如何設置FLA文件。如果沒有看到時間線和「邊界」和「門」對象,就很難分辨出發生了什麼。 – iND 2012-01-06 17:37:12

+0

@iND我正在製作時間軸(動作),第一幀動畫片段:角色,邊界和門。繪製字符和邊界的位圖。第二幀是相同的,除了它應該爲新的邊界繪製一個新的位圖。如果可以,我可以上傳FLA? – Opoe 2012-01-06 18:51:32

+0

你可以把一個鏈接到FLA文件。否則,你可以將它發送到我的垃圾郵件:[email protected]。 – iND 2012-01-06 19:12:21

回答

1

看FLA之後,出現了一些問題。

  • 的主要原因之一是,雖然你交換框架,你沒有重置指針指向bounds對象,該對象doorchar對象。所以你仍然以編程的方式與舊的聯繫在一起,儘管不是在視覺上。
    • 我把聲明放到一個名爲setupFrame()的方法中,並從你的onHitTest()方法中調用它。
  • 我在onHitTest()中添加了一個檢查,以確保在設置幀之前在當前幀中存在bounds對象。否則,遊戲停止。
  • 的行動和炭層,現在整個遊戲時間軸延長,因爲他們被重用。
  • char對象現在重新定位使用startPts陣列中發現的點的每個幀,而不必每次重新創建它。
  • 框架安裝過程中去除的事件監聽器,並且在所述框架安裝結束添加它們。這可以防止可能的錯誤傾聽事件。

這是在創建一個簡單的遊戲引擎相當不錯的工作。只是fyi,gamedev.stackexchange.com是一個致力於各種遊戲開發的地方,你可以在那裏提出更多的理論問題。

HTH!

+0

真的很有幫助,非常感謝你的時間!同樣清楚的解釋和感謝您的建議。 – Opoe 2012-01-10 13:26:42

+0

NP。很高興我能幫上忙。 – iND 2012-01-10 15:51:07

2

也許嘗試調用舊的BitmapData的dispose(),然後創建一個新的?

+0

這假定不重複使用圖像,例如「回放」功能,或者用於保存特別好的隨機迷宮等。我認爲需要更清晰的流程和目標。 – iND 2012-01-08 07:38:03

+0

是的。很高興看到fla +問題導致部分找出問題所在。 – 3vilguy 2012-01-08 18:34:07