Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Наследования (http://www.flasher.ru/forum/showthread.php?t=201615)

DmMatveev 19.06.2013 00:00

Наследования
 
Здравствуйте, уважаемые профессионалы. Прошу Вас помощи.
Программировать стал не давно, так что сильно ругайте за любые не до четы.

Сначала объясню принцип моей логики в составление структуры кода.
Пишу во Flash Builder 4.6.

Есть главный класс Main.
Код AS3:

package
{       
        import flash.display.Sprite;
        import flash.events.KeyboardEvent;
        import game.Core;
        import game.Snake;
        import view.View;
 
        [SWF(width="500", height="500")]
        public class Main extends Sprite
        {
                public static var gameStage:Object;
 
                public function Main()
                {
                        gameStage = stage;
 
                        var snake:Snake = new Snake();
                }
 
 
        }
}

В этом классе я инициализирую класс Snake(Змея. Делаю игру "змейка"). И записываю ссылку на stage.

Класс Snake
Код AS3:

package game
{
        public class Snake extends Core
        {
                public function Snake()
                {
                        init();
                        createSnake();
                }
 
                private function createBody():void
                {
                        /**
                        * Функция createBody
                        * Функция служит для увеличение длины змеи.
                        */
               
                        var obj:Snake_Body = new Snake_Body();
                        var dataObj:Object = system[1][(system[1].length)-1];
 
                        _view.draw(obj, dataObj.x, (dataObj.y) + system[3][0]);
 
                        system[1].push(obj);
                        system[0] += 1;
                }
 
                private function createSnake():void
                {
                        /**
                        * Функция CreateSnake
                        * Функция служит для создания змеи.
                        */
               
                        var obj:Snake_Head = new Snake_Head();
 
                        _view.draw(obj, system[2][0], system[2][1]);
 
                        system[1].push(obj);
                        system[0] += 1;
 
                        createBody();
                        createBody();
                }
        }
}

В конструкторе я запускаю функцию init(), которая находится в классе Core. И запуская функция для создание змейки. Здесь проблем нет.
Код AS3:

package game
{
        import flash.events.KeyboardEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        import move.*;
 
        import view.View;
 
        public class Core
        {
                protected var _view:View;
                protected var system:Array;
                private var moving:IMove;
                private var _top:Top;
                private var timeMove:Timer;
 
                public function Core()
                {
                }
 
                public function init():void
                {
                        _view = new View();
                        system = new Array();
                        _top = new Top();
                        timeMove = new Timer(1000);
 
                        moving = _top;
 
                        system[0] = 0;//Длина змейки
                        system[1] = [];//Части змеи
                        system[2] = [400, 250];//Координаты змейки (x, y)
                        system[3] = [22];//Разрыв по x, Разрыв по y
                        system[4] = [1, 1, 1, 1];//Left, Top, Right, Down
 
                        Main.gameStage.addEventListener(KeyboardEvent.KEY_DOWN, changeMove);
                        timeMove.addEventListener(TimerEvent.TIMER, timeMoveHandler);
 
                        timeMove.start();
                }
 
                private function timeMoveHandler(event:TimerEvent):void
                {
                        moving.move();
                }
 
                private function changeMove(e:KeyboardEvent):void
                {
                        /**
                        * Функция changeMovie
                        * Функция служит для изменения направления
                                * Клавиша влево - 37; Клавиша вверх - 38; Клавиша вправо - 39; Клавиша вниз - 40;
                        */

                        switch(e.keyCode)
                        {
                                case 37:
                                        //moving = _left;
                                break;
                                case 38:
                                        //moving = _top;
                                break;
                                case 39:
                                        //moving = _right;
                                break;
                                case 40:
                                        //moving = _down;
                                break;
                        }
                }
        }
}

Здесь я инициализирую класс View.

Код AS3:

package view
{
        public class View
        {
                private var stage:Object;
 
                public function View()
                {
                        stage = Main.gameStage;
                }
 
                public function draw(obj:Object, x:Number = 0, y:Number = 0, frame:int = 1):void
                {
                        obj.x = x;
                        obj.y = y;
                        obj.gotoAndStop(frame);
 
                        stage.addChild(obj);
                }
        }
}

И инициализирую класс движения Top

Код AS3:

package move
{
        import game.Core;
 
        public class Top extends Core implements IMove
        {
                public function Top()
                {
                }
 
                public function move():void
                {
                        trace(system[0]);
                }
 
                public function changeFlag():void
                {
                        system[4][3] = 0;
                        system[4][1] = 0;
                }
        }
}

Этот класс расширяет интерфейс, вот код.
Код AS3:

package move
{
        public interface IMove
        {
                function move():void;
                function changeFlag():void;
        }
}

Теперь о ошибках, в классе Snake, я могу обратиться к свойствам Core, а в классе Top, я не могу получать эти свойства, то есть, где код "trace(system[0])". Возникает ошибка "Не удается вызвать свойство или метод со ссылкой на объект "null"". Надеюсь Вы мне поможете. Заранее спасибо.

Вот иерархия:
http://imglink.ru/pictures/18-06-13/...f1e8fd99d5.jpg

Вот ссылка на исходники:
http://********/d/pC9vfIvu5xnIC

Заранее спасибо!

Добавлено через 11 часов 26 минут
Помогите:(

Добавлено через 11 часов 27 минут
Помогите:(

AlexLucas 19.06.2013 12:57

Не заметил где у вас в Top инициализируется массив system. Ф-ция init() нигде не вызывается. В Snake она вызывается в конструкторе, и этот массив заполняется значениями, а в Top нет.
Так что он остаётся null, а обращение system[0] выдаёт ошибку.

DmMatveev 19.06.2013 13:14

Спасибо) А как на счет кода? Можно как-нибудь сделать полегче или лучше?


Часовой пояс GMT +4, время: 05:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.