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

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

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

Регистрация: Apr 2014
Сообщений: 97
По умолчанию Воздействие методов класса на объекты в Main

Как сделать так, чтоб методы класса могли воздействовать на объекты в Main. Вот такой код у мня получился ...

Класс Button
Код AS3:
package myClasses
{
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.display.*;
	import flash.events.*;
 
	public class Button extends MovieClip
	{
		[Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
		public function addButton(x: int, y: int): Bitmap
		{
			var button: Bitmap;
 
			button = new Embed();
 
			button.x = x;
			button.y = y;
 
			button.addEventListener(MouseEvent.CLICK, funButton);
 
			return button;
		}
 
		public function funButton(e:MouseEvent): void
		{
			text1.text = "Hello";
		}
	}
}
Main
Код AS3:
package {
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.events.*;
	import flash.display.*;
	import flash.text.*;
	import myClasses.*;
 
	public class Main extends Sprite {
		public function Main() {
			if (stage) 
			init();
			else
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(): void {
			addChild(Image.addImage(0, 0, "background"));
			addChild(Image.addImage(0, 0, "head"));
			addChild(Image.addImage(0, 200, "menuline"));
 
			var text1: TextF = new TextF;
			addChild(text1.addText("Text", 100, 200));
 
			var button: Button = new Button;
			addChild(button.addButton(200, 200));
		}
	}
}
То есть в Main есть объект text1 пользовательского класса TextF, но когда хочу прописать в методе функции Button, чтоб оно меняло свойство text этого объекта, на строчке text1.text = "Hello"; ошибка выдает.

Старый 03.05.2014, 21:55
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Цитата:
Main есть объект text1
но в Button нет никакого text1. Класс Button ничего не знает о существовании text1 в Main, как и о существовании Main.
Нормальный выход из ситуации - заставить Main слушать события кнопки, и по событию клика выводить в text1 информацию.
Вы заставляете кнопку слушать саму себя. Это само по себе не может считаться ошибкой, но мэйн ничего не будет знать о том, что происходит с кнопкой, нафик она такая кнопка, спрашивается?
Тут как бы простая логика, Я, мэйн, даю пользователю кнопку, чтобы он на нее нажал, и слушаю, когда он это сделает. Чтобы отреагировать на клик соответственно логике, которую я, мэйн, знаю. Кнопка - это просто элемент интерфейса, ее задача в подавляющем большнстве случаев - уведомить родителя о том, что на нее нажали и все.
Замечу, что держать всю логику приложения в одном классе Main - не самая удачная идея, если приложение не "просто поиграться с классами".
Оу... кажись опять маячит на горизонте MVC

Старый 03.05.2014, 22:06
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 3  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
Ну я попробовал перенести слушатель событие в Маин
Код AS3:
var button: Button = new Button;
addChild(button.addButton(200, 200));
button.addEventListener(MouseEvent.CLICK, funButton);
button.funButton(e:MouseEvent);
И забрал его с класса кнопки. Но в строке button.funButton(e:MouseEvent); ошибка.

Не держать всю логику программы в Main ... эт как?

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
PHP код:
button.addEventListener(MouseEvent.CLICKfunButton);
button.funButton(e:MouseEvent); 
Что это за такое?

Добавлено через 4 минуты
Если вы не поняли принципы ООП, которые я вам попытался объяснять из прошлой темы про текстовое поле, объясню на этом примере.

Есть у вас меню в игре. В нём содержится экземпляр класса кнопки, который вы написали для этой программы.
Это уже другое приложение, поэтому здесь нет никаких текстовых полей в классе Main.
А кнопка лезет в Main и пытается изменить там какое-то значение, которого даже нет.
К чему это? Кнопка должна выполнять функционал кнопки. Она должна нажиматься, отжиматься и быть DisplayObjectContainer'ом. Всё. Больше ей ничего не нужно знать.

Это класс Main должен знать, что должно произойти при нажатии на добавленную в него кнопку.
__________________
There is no thing in this world that is not simple.

Старый 03.05.2014, 22:57
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 5  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
Ну так тем кодом я и пытался сделать, чтоб класс знал, что должно произойти. Создал слушатель клика для объекта button из пользовательского класса Button ну и функцию, какую он вызывает, взял из того же класса. А как надо было это написать правильно?

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Никого вообще не смутило, что у него слушатель MouseEvent к битмапу добавляется?

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Код AS3:
package com.ui
{
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.display.*;
	import flash.events.*;
 
	public class Button
	{
		[Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
		public static function addButton(x: int, y: int): Sprite
		{
			var button: Bitmap;
 
			button = new Embed();
 
			button.x = x;
			button.y = y;
 
			button.addEventListener(MouseEvent.CLICK, funButton);
 
			return (new Sprite()).addChild(button);
		}
	}
}
Код AS3:
package {
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.events.*;
	import flash.display.*;
	import flash.text.*;
	import com.ui.*;
 
	public class Main extends Sprite {
		public function Main() {
			if (stage) 
				init();
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(): void {
			addChild(Image.addImage(0, 0, "background"));
			addChild(Image.addImage(0, 0, "head"));
			addChild(Image.addImage(0, 200, "menuline"));
 
			var text1: TextF = new TextF;
			addChild(text1.addText("Text", 100, 200));
 
			var button:Sprite = button.addButton(200,200);
			addChild(button);
			button.addEventListener(MouseEvent.CLICK, btnClickHandler);
		}
 
		private function btnClickHandler(e:MouseEvent):void
		{
			...
		}
	}
}
__________________
There is no thing in this world that is not simple.

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

Регистрация: Apr 2014
Сообщений: 97
То есть функция, которую вызывает слушатель, обязательно должна быть в Мейне (то есть в том же файле, что и сам слушатель). И нельзя из Мейна вызвать слушателем функцию из класса?

Добавлено через 43 минуты
Ну вот я переделал по вашему образцу

Код AS3:
package {
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.events.*;
	import flash.display.*;
	import flash.text.*;
	import myClasses.*;
 
	public class Main extends Sprite 
	{
		public function Main() 
		{
			if (stage) 
			init();
			else
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(): void {
			addChild(Image.addImage(0, 0, "background"));
			addChild(Image.addImage(0, 0, "head"));
			addChild(Image.addImage(0, 200, "menuline"));
 
			var text1: TextF = new TextF;
			addChild(text1.addText("Text", 100, 200));
 
			var button: Sprite = Button.addButton(200, 200);
			addChild(button);
			button.addEventListener(MouseEvent.CLICK, funButton);
		}	
 
		private function funButton(e:MouseEvent): void
		{
			text1.text = "Hello";
		}
	}
}
Код AS3:
package myClasses
{
	/**
	 * ...
	 * @author Scorpion
	 */
	import flash.display.*;
	import flash.events.*;
 
	public class Button
	{
		[Embed(source="Z:/home/test1.ru/www/img/but.png")] private static const Embed: Class;
 
		public static function addButton(x: int, y: int): Sprite
		{
			var button: Bitmap;
 
			button = new Embed();
 
			button.x = x;
			button.y = y;
 
			button.addEventListener(MouseEvent.CLICK, funButton);
 
			return (new Sprite()).addChild(button);
		}
	}
}
И у меня ошибки в строчках button.addEventListener(MouseEvent.CLICK, funButton); и return (new Sprite()).addChild(button);

и что вообще значит это написание через точку в ретурне?


Последний раз редактировалось 2misha; 03.05.2014 в 23:46.
Старый 04.05.2014, 00:12
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 9  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Ай, прокололся.
Код AS3:
var spr:Sprite = new Sprite();
spr.addChild(button);
return spr;
Замените на это.
__________________
There is no thing in this world that is not simple.

Старый 04.05.2014, 00:17
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 10  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
Где заменить?

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:33.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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