Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.03.2015, 04:13
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 1  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
По умолчанию Вопрос про классы

Привет.
Таки никак не пойму чего-то.
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;
			}
 
		}
	}
 
}

Старый 10.03.2015, 04:43
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 2  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Код 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 (вашего проекта)

Старый 11.03.2015, 01:10
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 3  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Вот мой главный класс
Код 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);
		}
	}
}

Старый 11.03.2015, 07:54
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А что тут должно происходить?
Очевидно там срабатывает вот это условие
Код AS3:
if(!stage)return;
И дальше ничего не создается.
Такого условия быть не должно. Объект stage не доступен в конструкторе. В конструкторе нужно добавить слушатель добавления
Код AS3:
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
и уже в обработчике onAddedToStage все создавать и подписывать на события.

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

Старый 11.03.2015, 20:12
DenDobriy вне форума Посмотреть профиль Отправить личное сообщение для DenDobriy Найти все сообщения от DenDobriy
  № 5  
Ответить с цитированием
DenDobriy

Регистрация: Dec 2013
Сообщений: 35
Спасибо тебе человеческое, 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
?
Только не соображу что делать с ними

Старый 12.03.2015, 05:49
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

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

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

А ещё, удобней же, когда конструктор идёт первым после объявления переменных в теле класса. Надо себя к порядку приучать.
__________________
There is no thing in this world that is not simple.

Старый 12.03.2015, 10:02
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
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);
 
 
}
Избавившись от вложенного метода

Старый 12.03.2015, 10:12
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 8  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
вложенные методы
Функции?)
__________________
There is no thing in this world that is not simple.

Старый 12.03.2015, 10:49
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Нет, это именно метод. Не важно, что в as3 они называются function. Там доступно неявное свойство this
Хотя не раз уже бывали холивары по поводу различий между функциями и методами.

Старый 12.03.2015, 11:05
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 10  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
caseyryan, метод - это функция, которая принадлежит классу.
Вложенная функция имеет доступ к области видимости класса, и она замыкает плюс к этому ещё и все локальные переменные метода. Она находится внутри метода, поэтому она и имеет те же привилегии, что и метод.

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

Не написали модификатор доступа, так что ж он не internal, как у всех методов?)
Может, у вас получится без дополнительных операций вызвать этот "метод" из самого экземпляра?)
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 12.03.2015 в 11:26.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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