Форум 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=202320)

Fazer 09.07.2013 21:51

Вопрос по классам
 
Здравствуйте. Рассматриваю пример. Как класс (из первого примера, например) запустить не как родительский, а как обычный класс? Делаю так:

Код AS3:

public function TestBody1():void {
  addEventListener(Event.ADDED_TO_STAGE, init);
 }
 
  private function init():void {
  graphics.beginFill(0x1B1B1B);
  graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
  addChild(debugSprite);
 
  createWorld();
  createWallStage();
  createBodies();
  createDebugDraw();
 
  addEventListener(Event.ENTER_FRAME, update);
  stage.addEventListener(MouseEvent.MOUSE_DOWN, flagCheck);
  stage.addEventListener(MouseEvent.MOUSE_UP, flagCheck);
 }

Реакции ни какой (пустой экран).

Babylon 10.07.2013 00:29

В примере еще куча кода, которого нет у вас :)

Fazer 10.07.2013 01:54

Я опустил, весь код, чтобы награмождал тему (он такой же, без изменений).
Ошибка: Error #1063: Несоответствие количества аргументов в TestBody1/init(). Ожидалось 0, получено 1.

Класс Main.as:
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.DisplayObject;
 
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        addChild(new TestBody1);
                }
 
        }
 
}


Wolsh 10.07.2013 02:43

Ну в тексте ошибки же написано, даже по-русски))

И зачем Вы показываете код класса Main, когда ошибка в функции init() класса TestBody1 ?
Предполагаю, что эта функция не принимает параметров (в отличие от такой же функции в Мэйн), а вызывается так же, как обработчик события, и следовательно должна принимать аргументом объект этого самого События))

KumoKairo 10.07.2013 09:32

Очевидно что совсем неправильная работа с объектами. У вас две ошибки:
1.
Код AS3:

addEventListener(Event.ADDED_TO_STAGE, init);
...
 private function init():void {
...
}

У обработчика события Event.ADDED_TO_STAGE должен быть один входной параметр типа Event:
Код AS3:

 private function init(e:Event):void {
...
}

2. При вызове конструктора забыли скобки:
Код AS3:

addChild(new TestBody1());

И еще стоит отметить, что если создаете объект таким образом то потом никакого доступа к нему напрямую у вас не будет.

Советую почитать другие примеры, более начального уровня.

Fazer 10.07.2013 11:47

Wolsh, спасибо. KumoKairo , спасибо за подробный ответ. Думаю вы правы, ошибки элементарные. Позабыл теорию, надо браться по новой.

Koopa 12.07.2013 01:22

Код AS3:

graphics.beginFill(0x1B1B1B);
  graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);

вызов метода graphics из пустоты не способствует реализации скрипта.

AlexCooper 12.07.2013 01:35

Цитата:

Сообщение от Koopa (Сообщение 1140806)
Код AS3:

graphics.beginFill(0x1B1B1B);
  graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);

вызов метода graphics из пустоты не способствует реализации скрипта.

Код AS3:

graphics

=
Код AS3:

this.graphics


Koopa 12.07.2013 02:45

ОК! А this в этом коде что?(коде источника)
да ещё какой-то debugSprite

belv 12.07.2013 03:22

this в данном случае это объект Main , который расширяет класс Sprite (является DisplayObjectContainer)
и при инициализации автоматически добавляется в Stage.
debugSprite - скорее всего просто переменная ссылающаяся на какой-то объект.
Также не соглашусь с KumoKairo
2. При вызове конструктора забыли скобки:
можно создавать объект опуская скобки , если не требуется передавать в конструктор параметры.
Код AS3:

var mc:MovieClip = new MovieClip;
addChild(mc);
mc.graphics.beginFill(0xff0000)
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();


Koopa 12.07.2013 04:17

Цитата:

debugSprite - скорее всего просто переменная ссылающаяся на какой-то объект.
каким образом она попала в private function?

belv 12.07.2013 04:29

А что разве глобальную переменную нельзя использовать в private функциях?
Код AS3:

package 
{
        import flash.display.Sprite
        public class Main extends Sprite
        {
                private var debugSprite:Sprite;
                public function Main()
                {
                        debugSprite = new Sprite();
                        debugSprite.graphics.beginFill(0xFF0000)
                        debugSprite.graphics.drawRect(0,0,100,100);
                        debugSprite.graphics.endFill();
                        addSpriteToStage();
                }
                private function addSpriteToStage()
                {
                        addChild(debugSprite);
                }
        }
}



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

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