2012-01-03 64 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