As3 Как удалить или обновить bitmapdata для нового уровня? - PullRequest
0 голосов
/ 03 января 2012

Я играю в лабиринт.Персонаж не может пройти сквозь стены лабиринта (из-за обнаружения столкновения между растровыми данными персонажа и bmd со стен).Когда персонаж достигает двери, должен появиться следующий уровень / рамка с новым лабиринтом (новые границы)

Для следующего уровня (следующего кадра) я создал новый лабиринт с разными стенами.Но растровые данные из первого лабиринта все еще «активны».Поэтому, несмотря на то, что появился новый лабиринт, растровые данные с предыдущих стен невидимы, но все же нарисованы на сцене.

Мой вопрос к вам: я хочу изменить границы / лабиринт каждый кадр, как я могу удалить предыдущие растровые данные, чтобы персонаж не проходил границы следующего лабиринта?Или можно сделать массив из разных «границ»?

    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();

        }

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Может быть, попробуйте сначала вызвать dispose () для старого BitmapData, а затем создать новый?

1 голос
/ 10 января 2012

После просмотра FLA было несколько проблем.

  • главное, что, хотя вы переключали кадры, вы не сбрасывали указатели на объект bounds, объект door и объект char.Таким образом, вы все еще были привязаны к старым программно, но не визуально.
    • Я поместил объявления в метод с именем setupFrame() и вызвал его из вашего onHitTest() метода.
  • Я добавил проверку в onHitTest(), чтобы сделатьУбедитесь, что объект bounds существует в текущем кадре, прежде чем настраивать его.Если нет, игра останавливается.
  • Слои действий и персонажей теперь распространяются на всю игровую временную шкалу, поскольку они используются повторно.
  • char объект теперь перемещается в каждом кадре с использованием точек, найденных вмассив startPts, вместо того, чтобы создавать его заново каждый раз.
  • удаляет прослушиватели событий во время настройки кадра и добавляет их в конце настройки кадра.Это предотвращает возможные ошибки при прослушивании событий.

Это довольно хорошее усилие при создании простого игрового движка.Кстати, gamedev.stackexchange.com - это место, посвященное всем уровням разработки игр, и там вы можете задать больше теоретических вопросов.

HTH!

...