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

DenDobriy 10.03.2015 04:13

Вопрос про классы
 
Привет.
Таки никак не пойму чего-то.
1.Я создаю мувиклип и указываю что он, допустим, некий класс GG. Но код при этом пишу внутри клипа, в его кадрах.
2. Я вызываю экземпляр клипа new GG.
3. Все работает.
///Хочу сделать по-нормальному. Все говорят, правильно -эт надо чтоб все в классах было.
1. Беру тот же клип-класс GG. Делаю промежуточный класс, расширяющий GG, сохраняю с расширением .as. Тот же самый код пишу.
2. Я вызываю экземпляр класса.
3. Ошибок не пишет, но ничего не работает.
Хз, что я не так делаю?
Код AS3:

import flash.display.MovieClip;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
 
stage.displayState = StageDisplayState.FULL_SCREEN;
stage.scaleMode = StageScaleMode.NO_SCALE;
 
 
//var speed:int = 10;
 
var gg:MainHiro = new MainHiro() ;
gg.x = 200;
gg.y = 200;
addChild(gg);

Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.display.Stage;
 
 
 
        public class MainHiro extends GG
        {
                var fnX:int;
                var fnY:int;
                function get get_gg_x():Number
                {
                        return fnX;
                }
                function get get_gg_y():Number
                {
                        return fnY;
                }
 
                public function MainHiro()
                {
                        var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180;
                        dir +=  180;
                        var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
                        if(!stage)return;
                        stage.addEventListener(MouseEvent.CLICK, fnGetXY);
                        stage.addEventListener(Event.ENTER_FRAME, enterFrame);
                        function enterFrame(e:Event):void
                        {
                                var speed:Number = -1;
                                var p:Point = new Point(fnX - this.x, fnY - this.y);
                                p.normalize(speed);
                                this.x +=  p.x;
                                this.y +=  p.y;
                        }
 
 
                        function fnGetXY(event:MouseEvent):void
                        {
                                fnX = stage.mouseX;
                                fnY = stage.mouseY;
                        }
 
                }
        }
 
}


neonoviiwolf 10.03.2015 04:43

Код AS3:

import flash.display.MovieClip;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
 
stage.displayState = StageDisplayState.FULL_SCREEN;
stage.scaleMode = StageScaleMode.NO_SCALE;
 
 
//var speed:int = 10;
 
var gg:MainHiro = new MainHiro() ;
gg.x = 200;
gg.y = 200;
addChild(gg);

Это где вы написали? В классах - это когда создаётся главный класс, а в нём все остальные
главный класс прописывается в свойствах файла .fla (вашего проекта)

DenDobriy 11.03.2015 01:10

Вот мой главный класс
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.display.StageDisplayState;
        import flash.display.StageScaleMode;
        import flash.display.StageDisplayState;
        import flash.display.Stage;
 
 
 
        public class Main extends MovieClip
        {
 
                //var speed:int = 10;
 
                public function Main()
                {
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        var gg:MainHiro = new MainHiro();
                        gg.x = 200;
                        gg.y = 200;
                        addChild(gg);
                }
        }
}


caseyryan 11.03.2015 07:54

А что тут должно происходить?
Очевидно там срабатывает вот это условие
Код AS3:

if(!stage)return;

И дальше ничего не создается.
Такого условия быть не должно. Объект stage не доступен в конструкторе. В конструкторе нужно добавить слушатель добавления
Код AS3:

addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

и уже в обработчике onAddedToStage все создавать и подписывать на события.

п.с. Хотя, если есть желание делать все правильно, то советую сразу почитать о конвенциях написания кода

DenDobriy 11.03.2015 20:12

Спасибо тебе человеческое, caseyryan!
Я-то думаю, чего он на stage ругается.Ну, думаю, наверное код выполняется раньше чем сцена загружается. Добавил !stage. Не ругается...хорошо..умный значит я..пц(

Добавлено через 4 часа 17 минут
Исправил главный класс:
Код AS3:

package 
{
        import flash.display.MovieClip;
        import flash.display.StageDisplayState;
        import flash.display.StageScaleMode;
        import flash.display.StageDisplayState;
        import flash.display.Stage;
        import flash.events.Event;
 
 
        public class Main extends MovieClip
        {
                function seting(event:Event):void
                {
                        stage.displayState = StageDisplayState.FULL_SCREEN;
                        stage.scaleMode = StageScaleMode.NO_SCALE;
 
                }
 
                //var speed:int = 10;
 
                public function Main()
                {
                        this.addEventListener(Event.ENTER_FRAME,seting);
                        var gg:MainHiro = new MainHiro();
                        gg.x = 200;
                        gg.y = 200;
                        addChild(gg);
                }
        }
}

Добавлено через 4 часа 18 минут
И исправил, то что посоветовали со stage
Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.display.Stage;
 
 
 
        public class MainHiro extends GG
        {
                var fnX:int;
                var fnY:int;
                function get get_gg_x():Number
                {
                        return fnX;
                }
                function get get_gg_y():Number
                {
                        return fnY;
                }
 
                public function MainHiro()
                {
 
                        var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180;
                        dir +=  180;
                        var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
                        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                        function onAddedToStage(event: Event):void
                        {
                                stage.addEventListener(MouseEvent.CLICK, fnGetXY);
                                stage.addEventListener(Event.ENTER_FRAME, enterFrame);
                        }
                        //
                        function enterFrame(e:Event):void
                        {
                                // при положительной скорости идем за курсором
                                // при отрицательной - от курсора
                                var speed:Number = -1;
                                var p:Point = new Point(fnX - this.x, fnY - this.y);
                                p.normalize(speed);
                                this.x +=  p.x;
                                this.y +=  p.y;
                        }
 
 
                        function fnGetXY(event:MouseEvent):void
                        {
                                fnX = stage.mouseX;
                                fnY = stage.mouseY;
                        }
 
                }
        }
 
}

Добавлено через 4 часа 19 минут
не работает(

Добавлено через 4 часа 56 минут
Нашел причину.
Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах.

Добавлено через 5 часов 4 минуты
Переделал
Код AS3:

public function MainHiro()
                {
 
                        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                        //
                        function onAddedToStage(event: Event):void
                        {
                                trace(this.x);
                                var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180;
                                dir +=  180;
                                var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
                                stage.addEventListener(MouseEvent.CLICK, fnGetXY);
                                stage.addEventListener(Event.ENTER_FRAME, enterFrame);
 
 
                        }
                        //

this.x - не определяется. Как здесь получить координаты экземпляра?

Добавлено через 5 часов 29 минут
а если попробовать
Код AS3:

event.target.x/event.target.y

?
Только не соображу что делать с ними

ZackMercury 12.03.2015 05:49

DenDobrii, пока зашла тема - функция в методе - очень нехорошо с: Зарубите себе оформлять обработчики отдельным приватным методом.
И ОБЯЗАТЕЛЬНО ВЕЗДЕ ставить модификатор доступа, согласно конвенциям да и ваще логике.
Когда вы не ставите - у вас по умолчанию определяется модификатор internal, обеспечивающий доступ внутри пакета.

И ОБЕЗАТЕЛЬНО ВЕЗДЕ давать ВМЕНЯЕМЫЕ имена переменным, классам и методам(я про GG, MainHiro, fnX итд, смотрите конвенции по ссылке в сообщении caseyryan)

А ещё, удобней же, когда конструктор идёт первым после объявления переменных в теле класса. Надо себя к порядку приучать.

caseyryan 12.03.2015 10:02

DenDobriy, советую установить FlashDevelop. В ней писать намного проще и быстрее. И за одно можно посмотреть как она создает шаблоны классов по умолчанию.
У тебя сейчас в коде полная каша. Как уже заметил ZackMercury, вложенные методы - это плохо (в большинстве случаев).
Вместо этого
Код AS3:

public function MainHiro()
{
 
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        //
        function onAddedToStage(event: Event):void
        {
                trace(this.x);
                var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180;
                dir +=  180;
                var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
                stage.addEventListener(MouseEvent.CLICK, fnGetXY);
                stage.addEventListener(Event.ENTER_FRAME, enterFrame);
 
 
        }
 
}

Нужно написать так:

Код AS3:

public function MainHiro() {
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
 
private function onAddedToStage(event: Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); // не забываем от ненужного отписываться
        trace(this.x);
        var dir:Number = Math.atan2(mouseY-this.y, mouseX-this.x) / Math.PI * 180;
        dir +=  180;
        var speed:Point = new Point(Math.cos(dir/180*Math.PI), Math.sin(dir/180*Math.PI));
        stage.addEventListener(MouseEvent.CLICK, fnGetXY);
        stage.addEventListener(Event.ENTER_FRAME, enterFrame);
 
 
}

Избавившись от вложенного метода

ZackMercury 12.03.2015 10:12

Цитата:

вложенные методы
Функции?)

caseyryan 12.03.2015 10:49

Нет, это именно метод. Не важно, что в as3 они называются function. Там доступно неявное свойство this
Хотя не раз уже бывали холивары по поводу различий между функциями и методами.

ZackMercury 12.03.2015 11:05

caseyryan, метод - это функция, которая принадлежит классу.
Вложенная функция имеет доступ к области видимости класса, и она замыкает плюс к этому ещё и все локальные переменные метода. Она находится внутри метода, поэтому она и имеет те же привилегии, что и метод.

Добавлено через 5 минут
Но термин "вложенный метод" я считаю ошибкой.
Попробуйте применить ему модификатор доступа, може?
Или вызовите его обратившись к экземпляру класса снаружи?

Не написали модификатор доступа, так что ж он не internal, как у всех методов?)
Может, у вас получится без дополнительных операций вызвать этот "метод" из самого экземпляра?)


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

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