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

Alexsas 21.08.2007 15:14

Проблеммы управления главным мувиком.
 
Делаю маленькую игрульку..
да бы практически изучать AS3/
Столкнулся с проблемой немогу управлять главным мувиком.

Код:

package main{
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.*;
        import flash.net.URLRequest;
        import flash.utils.Timer;
        import flash.events.TimerEvent;

        dynamic public class Body extends MovieClip {;

        private var _container:Sprite;
        //private var adr:String="";
        private var adr:String="C:/AS3_COdding/05_my/Game/";
        private var localAdr:String="/item/";
        private var TimerCount:Number=400;
        private var Kucha:Number=2;

        var StageWidth:Number=700;
        var StageHeight:Number=550;
        var xTarget:Number=0;
        var yTarget:Number=0;
        var box:Boolean = false;

        public function Body() {
                super();

                this._container=new Sprite  ;
                this.addChild(this._container);
                TimerEventExample();
        }
        // скорость добавления новой
        public function TimerEventExample() {
                var myTimer:Timer=new Timer(TimerCount,500);
                myTimer.addEventListener(TimerEvent.TIMER,timerHandler);
                myTimer.start();
        }
        // срабатывание таймера
        public function timerHandler(event:TimerEvent):void {
                //trace(TimerCount);
                //trace(Kucha);
                SelectItem();
                Kucha=2;
                StageWidth=700;
                StageHeight=550;
                xTarget=0;
                yTarget=0;
                box=false;
        }

        // случайный выбор номера элемента
        private function SelectItem():void {
                for (var ii:uint=1; ii < Kucha; ii++) {
                        var i:Number = Math.round(Math.random() * 28) + 1;
                        AddItemTo(i);
                }
        }
        // функция добавления объекта на экран
        public function AddItemTo(i):void {
                var item0:Loader=new Loader;
                if (i < 10) {
                        localAdr="/item/0";
                } else {
                        localAdr="/item/";
                }
                var url:String=adr + localAdr + i + ".png";
                var urlReq:URLRequest=new URLRequest(url);
                var xx:Number=Math.random() * StageWidth;
                var yy:Number=Math.random() * StageHeight;
                item0.load(urlReq);
                item0.x=xTarget + Math.round(xx);
                item0.y=yTarget + Math.round(yy);
                this._container.addChild(item0);
                this._container.addEventListener(MouseEvent.CLICK,this.clickHandler);
                trace(this._container.numChildren);// количество детей
                if (this._container.numChildren > 99) {
                        this.removeChild(this._container);
                }
        }
        // функция удаления выбранного объекта
        public function clickHandler(event:MouseEvent):void {

                var index:Number=this._container.getChildIndex(event.target  as  DisplayObject);
                var ldr:Loader=this._container.getChildAt(index)  as  Loader;
                var nameItem:String=ldr.contentLoaderInfo.url;
                var nameItemSel=nameItem.slice(-6,nameItem.length - 4);
                // много ящиков
                if (nameItemSel == "28") {
                        Kucha=10;
                        xTarget=this._container.getChildAt(index).x - 50;
                        yTarget=this._container.getChildAt(index).y - 50;
                        StageWidth=100;
                        StageHeight=100;
                        box = true;
                }
                // еще больше ящиков
                if (nameItemSel == "29") {
                        Kucha=20;
                        xTarget=this._container.getChildAt(index).x - 50;
                        yTarget=this._container.getChildAt(index).y - 50;
                        StageWidth=100;
                        StageHeight=100;
                        box = true;
                }
                // остановка времени
                if (nameItemSel == "25") {
                        TimerCount = 10000;
                        TimerEventExample();
                }
                // Game Over
                if (nameItemSel == "07") {
                        this.removeChild(this._container);
                        root.gotoAndStop(2);
                }
                // смена цвета
                if (nameItemSel == "24") {
                        //BackColor(Math.round(Math.random() * 19) + 1);
                        BackColor();
                }
                this._container.removeChild(event.target  as  DisplayObject);

                TimerCount=TimerCount - 10;
        }
        // смена цвета
        public function BackColor():void {
                var square:Shape=new Shape;
                square.graphics.beginFill(0x000000,1);
                square.graphics.drawRect(0,0,800,600);
                square.graphics.endFill();
                this.addChild(square);
                this.swapChildren(_container, square);
        }
}
}

Болдовая строчка вызывает следущую ошибку:

if (nameItemSel == "07") {
this.removeChild(this._container);
root.gotoAndStop(2);

1061: Call to a possibly undefined method gotoAndStop through a reference with static type flash.display:DisplayObject.

Вопрос: почему?

Прошу реализацию игры не ругать.
Согласен подходы немного не те.. но я только учусь.

Dendroid 21.08.2007 16:24

Отключи "Strict mode" (строгую проверку синтаксиса) в опциях Actionscript 3, либо поставь MovieClip(root).gotoAndStop(2); (по-умолчанию root - это DisplayObject, что тебе прямым текстом и говориться в описании ошибки).

Ноябрь 22.08.2007 03:14

можно просто gotoAndStop(2);

Alexsas 22.08.2007 08:56

с главным клипом разобрались..
а вот есть еще вот какая проблемка.

есть на сцене еще один мувик с 20 кадрами.. как им им управлять из класса другого мувика?.

аналогично MovieClip(root).gotoAndStop(2); - не получилось :(

etc 22.08.2007 10:22

Выясни, что такоe root.

И никогда не отключай strict.

Alexsas 22.08.2007 10:34

ну я вроде бы курсе что такое root.. может ошибаюсь..
root - это главный (корневой) мувик в котором все происходит..
strict - вернул на место.

мой мувик на сцене называется myBack
я к нему пытался обратиться вот какими способами:

1) this.myBack.gotoAndStop(2);

2) root.myBack.gotoAndStop(2);

3) root.MovieClip(myBack).gotoAndStop(2);

4) myBack.gotoAndStop(2);

Ничего из этого не сработало...
почмеу?

etc 22.08.2007 10:39

root не является тем самым root, который был в AS1/AS2, root — корневой DisplayObject дерева DisplayObject-ов, root не является ссылкой на один и тот же мувик.

Вообще, должен был сработать первый вариант, при условии написания кода в Document class и объявлением оного динамическим. И myBack должен наследоваться от MovieClip.

Alexsas 22.08.2007 10:54

нет в том-то и дело что myBack это просто мувиклип брошенный на сцену - класс ему не присвоен.. (или в As3 любому мувику теперь нужен класс??????)

etc 22.08.2007 11:27

Используй getChildByName('myBack') as MovieClip.

Alexsas 22.08.2007 12:34

чего-то допереть немогу как это использовать?

попробовал вот так:
Код:

var target = this.getChildByName("myBack") as MovieClip;
                target.gotoAndStop(5);

выдает:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at main::Body/::BackColor()
at main::Body/clickHandler()


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

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