AS3 TimerEvents: - PullRequest
       2

AS3 TimerEvents:

0 голосов
/ 30 марта 2011

возникают проблемы при добавлении частей змеи в события таймера

package {

    import flash.display.Sprite;
    import flash.events.KeyboardEvent;
    import flash.events.TimerEvent;
    import flash.ui.Keyboard;
    import flash.utils.Timer;
    import flash.display.MovieClip;

    public class Snake extends MovieClip{

        private const SPEED         :uint = 50;//lower = faster
        private const snakeAttach   :uint = 400;//lower = faster
        private const DIM           :int = 71; //keep this number uneven to have the snake starting in the middle
        private const INITIAL_SIZE  :int = 3; //keep this lower then DIM/2

        private var stopped         :Boolean;
        private var left            :Boolean;
        private var right           :Boolean;
        private var up              :Boolean;
        private var down            :Boolean;
        private var size            :Number;
        private var food            :Sprite;
        private var tmr             :Timer;
        private var addSnake        :Timer;
        private var curI            :Number;
        private var curJ            :Number;
        private var snake           :Array;
        private var grid            :Array;

        public function Snake(){
            size = stage.stageWidth / DIM; //change grid size
            curI = curJ = Math.floor(DIM * 0.5); //change grid size

            initSnake();
            fillGrid();


            addSnake = new Timer(snakeAttach);
            addSnake.addEventListener(TimerEvent.TIMER,placeFood);
            addSnake.start();

            tmr = new Timer(SPEED);
            tmr.addEventListener(TimerEvent.TIMER,move);
            tmr.start();

            stage.addEventListener(KeyboardEvent.KEY_DOWN,changeDir);
        }

        private function fillGrid():void{  //grid
            grid = Make2DArray();

            for (var i:uint = 0; i < DIM; i++){
                for (var j:uint = 0; j < DIM; j++){
                    var sp:Sprite = new Sprite();
                    sp.graphics.beginFill(0xF0F0F0);
                    sp.graphics.lineStyle(1,0xF5F5F5);
                    sp.graphics.drawRect(0, 0, size  - 1, size - 1);
                    sp.x = i * size;
                    sp.y = j * size;
                    addChild(sp);
                    grid[i][j] = sp;
                }
            }   
        }

        private function Make2DArray():Array{   //for the grid
            var a:Array = new Array(DIM);
            for(var i:uint = 0; i < a.length; i++){
                a[i] = new Array(DIM);
            }   
            return a;
        }

        private function initSnake():void{ //initialises the snake
            var center:Number = Math.floor(DIM * 0.5) * size;

            snake = new Array(INITIAL_SIZE);

            for (var i:uint = 0; i < INITIAL_SIZE; i++){
                var sp:Sprite = makeItem();      //adds a body part of makeItem 
                sp.x = center;
                sp.y = center + i * size;
                addChild(sp); //adds to the stage
                snake[i] = sp;  //sets the index to one
            }

            snake.reverse();
        }

        private function makeItem(c:uint = 0):Sprite{  //graphics for item
            var s:Sprite = new Sprite(); 
            s.graphics.beginFill(c);
            s.graphics.lineStyle(2,0x333333);
            s.graphics.drawRect(0, 0, size, size);
            return s;
        }

        private function placeFood(event:TimerEvent):void{   
            var rndI:uint = Math.floor(Math.random() * DIM);  //sets a random integer based on the the floor
            var rndJ:uint = Math.floor(Math.random() * DIM);

            var rndX:Number = grid[rndI][rndJ].x; // sets a grid position for the food item to go
            var rndY:Number = grid[rndI][rndJ].y;

            if (food != null) removeChild(food);  //if there is food on the grid removes the food from the board 

            food = makeItem(Math.random() * 0xFFFFFF);// random color
            food.x = rndX;
            food.y = rndY;

            addChild(food); //adds the food to the board

            for (var i:uint = 0; i < snake.length; i++){
                if (rndY == snake[i].y && rndX == snake[i].x){ 

                }
            } 
        }

        private function move(e:TimerEvent):void{
            if (left){
                curI -= 1;
            }else if (right){
                curI += 1;
            }
            if (up){
                curJ -= 1;
            }else if (down){
                curJ += 1;
            }

            if (left || right || up || down){
                var s:Sprite = makeItem();

                if (curI > DIM - 1) curI = 0;
                if (curJ > DIM - 1) curJ = 0;

                if (curI < 0) curI = DIM - 1;
                if (curJ < 0) curJ = DIM - 1;

                s.x = grid[curI][curJ].x;
                s.y = grid[curI][curJ].y;

                addChild(s);
                snake.push(s);


                 if (Math.floor(s.x) == Math.floor(food.x) && Math.floor(s.y) == Math.floor(food.y) ){ 
                 //placeFood(); } 
                 else if((tmr.currentCount % 10) > 0) { removeChild(snake[0]); snake.shift(); }
            }

        }

        private function changeDir(e:KeyboardEvent):void{
            if(e.keyCode == Keyboard.LEFT)  {if (!right){left = true;  up = false; down = false; right = false;}}
            if(e.keyCode == Keyboard.UP)    {if (!down) {left = false; up = true;  down = false; right = false;}}
            if(e.keyCode == Keyboard.RIGHT) {if (!left) {left = false; up = false; down = false; right = true;}}
            if(e.keyCode == Keyboard.DOWN)  {if (!up)   {left = false; up = false; down = true;  right = false;}}
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Вам необходимо добавить параметр события в любую функцию, которая обрабатывает TimerEvent.

private function placeFood(event:TimerEvent):void {
0 голосов
/ 18 марта 2013

Было бы неплохо, если бы он был в фреймворке model-view-controller. У вас много чего происходит, и разные слушатели могут не совпадать идеально. Имейте класс представления, устанавливают swf, добавляют змею к стадии, делают сетку, держат слушателей для входов. Затем ввод обрабатывается контроллером. Помните, что View - это, по сути, класс, который добавляется на сцену, и большинство следует за ходом игры. Есть _controller.startTimer (); функция. Тогда все, что вы хотите, может быть обработано в контроллере. И когда вы хотите, чтобы вещи взорвались, измените переменную модели, которая указывает представлению сделать это. Контроллер вносит изменения во все переменные (включая массив элементов в поле), хранящиеся в модели, а когда он выполняет вычисления, он изменяет одну из переменных модели. Затем модель запускает функцию changeHanldler, которая вызывает view для перемещения чего-либо, изменения текста, воспроизведения звука, переключения экранов, покачивания змеи, воспроизведения собственного твинблинга змейки с твинами ...

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