|
|
|||||
Регистрация: Dec 2013
Сообщений: 35
|
Вопрос про классы
Привет.
Таки никак не пойму чего-то. 1.Я создаю мувиклип и указываю что он, допустим, некий класс GG. Но код при этом пишу внутри клипа, в его кадрах. 2. Я вызываю экземпляр клипа new GG. 3. Все работает. ///Хочу сделать по-нормальному. Все говорят, правильно -эт надо чтоб все в классах было. 1. Беру тот же клип-класс GG. Делаю промежуточный класс, расширяющий GG, сохраняю с расширением .as. Тот же самый код пишу. 2. Я вызываю экземпляр класса. 3. Ошибок не пишет, но ничего не работает. Хз, что я не так делаю? 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); 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; } } } } |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
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 (вашего проекта) |
|
|||||
Регистрация: Dec 2013
Сообщений: 35
|
Вот мой главный класс
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); } } } |
|
|||||
А что тут должно происходить?
Очевидно там срабатывает вот это условие И дальше ничего не создается. Такого условия быть не должно. Объект stage не доступен в конструкторе. В конструкторе нужно добавить слушатель добавления и уже в обработчике onAddedToStage все создавать и подписывать на события. п.с. Хотя, если есть желание делать все правильно, то советую сразу почитать о конвенциях написания кода |
|
|||||
Регистрация: Dec 2013
Сообщений: 35
|
Спасибо тебе человеческое, caseyryan!
Я-то думаю, чего он на stage ругается.Ну, думаю, наверное код выполняется раньше чем сцена загружается. Добавил !stage. Не ругается...хорошо..умный значит я..пц( Добавлено через 4 часа 17 минут Исправил главный класс: 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); } } } И исправил, то что посоветовали со stage 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 часа 56 минут Нашел причину. Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах. Добавлено через 5 часов 4 минуты Переделал 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); } // Добавлено через 5 часов 29 минут а если попробовать ? Только не соображу что делать с ними |
|
|||||
DenDobrii, пока зашла тема - функция в методе - очень нехорошо с: Зарубите себе оформлять обработчики отдельным приватным методом.
И ОБЯЗАТЕЛЬНО ВЕЗДЕ ставить модификатор доступа, согласно конвенциям да и ваще логике. Когда вы не ставите - у вас по умолчанию определяется модификатор internal, обеспечивающий доступ внутри пакета. И ОБЕЗАТЕЛЬНО ВЕЗДЕ давать ВМЕНЯЕМЫЕ имена переменным, классам и методам(я про GG, MainHiro, fnX итд, смотрите конвенции по ссылке в сообщении caseyryan) А ещё, удобней же, когда конструктор идёт первым после объявления переменных в теле класса. Надо себя к порядку приучать.
__________________
There is no thing in this world that is not simple. |
|
|||||
DenDobriy, советую установить FlashDevelop. В ней писать намного проще и быстрее. И за одно можно посмотреть как она создает шаблоны классов по умолчанию.
У тебя сейчас в коде полная каша. Как уже заметил ZackMercury, вложенные методы - это плохо (в большинстве случаев). Вместо этого 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); } } 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); } |
|
|||||
caseyryan, метод - это функция, которая принадлежит классу.
Вложенная функция имеет доступ к области видимости класса, и она замыкает плюс к этому ещё и все локальные переменные метода. Она находится внутри метода, поэтому она и имеет те же привилегии, что и метод. Добавлено через 5 минут Но термин "вложенный метод" я считаю ошибкой. Попробуйте применить ему модификатор доступа, може? Или вызовите его обратившись к экземпляру класса снаружи? Не написали модификатор доступа, так что ж он не internal, как у всех методов?) Может, у вас получится без дополнительных операций вызвать этот "метод" из самого экземпляра?)
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 12.03.2015 в 11:26. |
Часовой пояс GMT +4, время: 15:26. |
|
« Предыдущая тема | Следующая тема » |
|
|