Flash AS3 игра типа лабиринт - PullRequest
       0

Flash AS3 игра типа лабиринт

0 голосов
/ 29 ноября 2011

Я создал игру-лабиринт во Flash as3, и она отлично работает как отдельный swf. Как только я бросаю его в основной контейнер swf, он перестает работать! Ну, это все еще работает, но теряет «границы» лабиринта. Кто-нибудь знает, как я мог решить эту проблему, пожалуйста? Любая помощь очень ценится, S.

package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.*; 
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.geom.Rectangle;
import gs.TweenLite;
import gs.easing.*;

public class slide17 extends MovieClip {        
    private var maze:mazeBG;    
    private var mazeC:mazeCircle;   

    var rightArrow:Boolean = false;
    var leftArrow:Boolean = false;
    var upArrow:Boolean = false;
    var downArrow:Boolean = false;
    var speed:int = 10;

    public function slide17():void {
        screen01();                 
    }

    private function screen01():void {      

        stage.addEventListener(KeyboardEvent.KEY_DOWN, stage_onKeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, stage_onKeyUp);
        stage.addEventListener(Event.ENTER_FRAME, stage_onEnterFrame);

        maze = new mazeBG();
        addChild(maze); 
        maze.x=88;
        maze.y=155;                 

        mazeC = new mazeCircle();
        addChild(mazeC);    
        mazeC.x=104;
        mazeC.y=321;    

        function stage_onKeyDown(event:KeyboardEvent):void {
            if(event.keyCode == Keyboard.RIGHT) rightArrow = true;
            if(event.keyCode == Keyboard.LEFT) leftArrow = true;
            if(event.keyCode == Keyboard.UP) upArrow = true;
            if(event.keyCode == Keyboard.DOWN) downArrow = true;
        }
        function stage_onKeyUp(event:KeyboardEvent):void {
            if(event.keyCode == Keyboard.RIGHT) rightArrow = false;
            if(event.keyCode == Keyboard.LEFT) leftArrow = false;
            if(event.keyCode == Keyboard.UP) upArrow = false;
            if(event.keyCode == Keyboard.DOWN) downArrow = false;
        }
        function stage_onEnterFrame(event:Event):void {
            var rect:Rectangle = mazeC.getBounds(stage);                
            var i:int = 0;
            var xBump:int = 0;
            var yBump:int = 0;
            if(rightArrow) {
                xBump = speed;
                for(i = 0; i < speed; i++) {
                    if(maze.hitTestPoint(rect.right + i, mazeC.y, true)) {
                        xBump = i - 1;
                        break;
                    }
                }
            }
            if(leftArrow) {
                xBump = -speed;
                for(i = 0; i < speed; i++) {
                    if(maze.hitTestPoint(rect.left - i, mazeC.y, true)) {
                        xBump = -i + 1;
                        break;
                    }
                }
            }
            if(upArrow) {
                yBump = -speed;
                for(i = 0; i < speed; i++) {
                    if(maze.hitTestPoint(mazeC.x, rect.top - i, true)) {
                        yBump = -i + 1;
                        break;
                    }
                }
            }
            if(downArrow) {
                yBump = speed;
                for(i = 0; i < speed; i++) {
                    if(maze.hitTestPoint(mazeC.x, rect.bottom + i, true)) {
                        yBump = i - 1;
                        break;
                    }
                }
            }
            mazeC.x += xBump;
            mazeC.y += yBump;
        }

    }           

}
 }

1 Ответ

3 голосов
/ 29 ноября 2011

Ваша линия:

var rect:Rectangle = mazeC.getBounds(stage);

использует объект сцены, чтобы получить область вашего MazeCircle.Когда вы добавляете свою игру в оболочку SWF (ваш основной контейнер SWF), объект stage теперь является стадией оболочки.Если обертка имеет размеры, отличные от вашего игрового swf, ваш вызов getBounds() вернет необычные координаты.

То, что вам нужно - это что-то непротиворечивое для измерения, которое не изменится при изменении объекта сцены.Есть несколько способов исправить это:

  1. Используйте Sprite или MovieClip, чтобы обернуть свою игру, и используйте это с getBounds() вместо сцены.Вы можете использовать экземпляр slide_17, над которым вы работаете, используя ключевое слово this.Пример:

    var rect:Rectangle = mazeC.getBounds(this);

  2. Используйте функцию, отличную от getBounds(), для определения области вашего MazeCircle, например, используя свойства x, y, width и height вместо.Дайте мне знать, если вы хотите пример этого, но я держу пари, что вы можете понять это - было бы долго включать это здесь.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...