As3如何删除或更新新级别的bitmapdata?

时间:2012-01-03 19:42:53

标签: actionscript-3 new-operator bitmapdata

我正在制作一个迷宫游戏。角色无法穿过迷宫的墙壁(因为角色的位图数据与墙壁的bmd之间存在碰撞检测)。当角色到达门时,下一个等级/框架应该出现一个新的迷宫(新界限)

对于下一个级别(下一帧),我用不同的墙壁制作了一个新的迷宫。但是第一个迷宫中的bitmapdata仍然是“活跃的”。因此,即使有一个新的迷宫,前面墙壁的位图数据也是看不见的,但仍然在舞台上绘制。

我的问题是: 我想改变每一帧的边界/迷宫,我怎样才能删除之前的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 个答案:

答案 0 :(得分:1)

在查看FLA之后,有一些问题。

  • 主要的是,虽然您切换了帧,但您没有重置指向bounds对象,door对象和char对象的指针。所以你仍然以编程方式与旧版本绑定,尽管不是在视觉上。
    • 我将声明放入名为setupFrame()的方法中,并使用onHitTest()方法调用它。
  • 我在onHitTest()中添加了一个检查,以确保在设置框架之前当前框架中存在bounds对象。如果没有,游戏就会停止。
  • 动作和角色层现在可以在整个游戏时间轴上延伸,因为它们可以重复使用。
  • char对象现在使用startPts数组中的点重新定位每个帧,而不是每次都重新创建它。
  • 在帧设置期间删除了事件侦听器,并在帧设置结束时添加它们。这可以防止可能的错误收听事件。

这是创建简单游戏引擎的一项非常好的工作。只是fyi,gamedev.stackexchange.com是一个致力于各个级别的游戏开发的地方,你可以在那里提出更多的理论问题。

HTH!