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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.07.2009, 10:12
Zik. вне форума Посмотреть профиль Отправить личное сообщение для Zik. Найти все сообщения от Zik.
  № 1  
Ответить с цитированием
Zik.
 
Аватар для Zik.

Регистрация: Nov 2007
Сообщений: 1,723
По умолчанию Как узнать переменную из другого класса?

В общем.
Есть два класса - Root и Block.
В руте я добавляю героя и блоки в список отображения и делаю герою движение.
В блоке я хочу проверять каждый блок на столкновение с героем.
Вот только хочу узнать как правильно брать переменную из другого класса (того же героя).
Раньше статиком пользовался, но понял, что это плохой стиль.
Код:

Код AS3:
package {
	import flash.display.MovieClip;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.events.Event;
 
	public class Root extends MovieClip	{
		var hero:Hero = new Hero(200, 60);
		public var indexBlock:Number = 0;
		public var arrayBlock:Array = [];
		public var speed:int = 5;
		public var powerGravity = 0;
		public var jump:Boolean = false;
		public var powerDown = 0.5;
		public var widthBlock:int = 30;
		public function Root():void {
			addChild(hero);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHero);
			addEventListener(Event.ENTER_FRAME, checkHitTest);
			addEventListener(Event.ENTER_FRAME, addGravity);
			createWorld();
		}
		public function createWorld():void {
			for (var i:int = 0; i < 10; i++) {
				arrayBlock.push(new Block(widthBlock * i, 300));
				addChild(arrayBlock[indexBlock]);
				indexBlock++
			}
		}
		public function addGravity(e:Event):void {
			hero.y += powerGravity;
			powerGravity += powerDown;
		}
		public function moveHero(e:KeyboardEvent):void {
			if (e.keyCode == Keyboard.SPACE && (!jump)) {
				jump = true;
				powerGravity -= 7;
				hero.y -= 3;
				addEventListener(Event.ENTER_FRAME, addGravity);
			}
			if (e.keyCode == Keyboard.RIGHT) {
				hero.x += speed;
			}
			if (e.keyCode == Keyboard.LEFT) {
				hero.x -= speed;
			}
		}
	}
 
}
Код AS3:
package {
	import flash.display.MovieClip;
	import flash.events.Event;
 
	public class Block extends MovieClip {
		public function Block(xPos:Number, yPos:Number):void {
			this.x = xPos;
			this.y = yPos;
		}
		public function checkHitTest(e:Event):void {
			if (hero.hitTestObject(this.wallUp)) {
				removeEventListener(Event.ENTER_FRAME, addGravity); // как мне здесь вообще удалить листенер из другого класса
				powerGravity = 0; // как узнать переменную из другого класса
				hero.y = (this.y - this.height / 2) - (hero.height / 2);
				jump = false; // и эту тоже как узнать
			} else {
				addEventListener(Event.ENTER_FRAME, addGravity); // и это
				jump = true; // и это
			}
			if (hero.hitTestObject(this.wallDown)) {
				hero.y += 2;
				powerGravity = 0; // и это
			}
			if (hero.hitTestObject(this.wallLeft)) {
				hero.x = (this.x - (this.width / 2)) - (hero.width / 2);
			}
			if (hero.hitTestObject(this.wallRight)) {
				hero.x = (this.x + (this.width / 2)) + (hero.width / 2);
			}
			/* и как вообще узнать героя???*/
		}
	}
 
}

Старый 20.07.2009, 10:20
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 2  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
Если герой только один - то можешь использовать паттерн Singleton. Экземпляр будет уникален, приватен, и доступ к нему может быть осуществлен через статиковскую функцию... Но у тебя что-то... как-то... по-моему, неправильный подход к организации игры вцелом =)
__________________
Стой! Опасная зона! Работа мозга!

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

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Вроде решили же, что синглтон - антипаттерн.)
Передавай Block`y игрока в конструктор.

Старый 20.07.2009, 10:43
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 4  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Вот только хочу узнать как правильно брать переменную из другого класса (того же героя).

А get зачем? тогда.
Код AS3:
public function get position():Point{
    return new Point(hero.x, hero.y);
}

Старый 20.07.2009, 11:25
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 5  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
> Вроде решили же, что синглтон - антипаттерн.)

О_о Я, смотрю, много пропустил...
__________________
Стой! Опасная зона! Работа мозга!

Старый 20.07.2009, 11:30
switcher! вне форума Посмотреть профиль Отправить личное сообщение для switcher! Найти все сообщения от switcher!
  № 6  
Ответить с цитированием
switcher!

Регистрация: May 2009
Сообщений: 220
пробовали сохранять this (т.е. ссылку на экземпляр класса Root) в свойстве экземпляра класса Block?
примерно вот так
Код AS3:
...
public class Root extends MovieClip	{
...
arrayBlock.push(new Block(widthBlock * i, 300));
arrayBlock[indexBlock].linkRoot = this;
addChild(arrayBlock[indexBlock]);
...
 
===================
 
//powerGravity = 0; // как узнать переменную из другого класса
this.linkRoot.powerGravity = 0;
как-то так. C той лишь разницей, что и Root, и Block нужно завернуть в интерфейс.
Подробнее об этом можно посмотреть здесь

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

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Цитата:
> Вроде решили же, что синглтон - антипаттерн.)

О_о Я, смотрю, много пропустил...
Я как-то тоже. А что с синглтоном не так, можно подробнее?

Старый 20.07.2009, 20:44
marat_sa вне форума Посмотреть профиль Отправить личное сообщение для marat_sa Посетить домашнюю страницу marat_sa Найти все сообщения от marat_sa
  № 8  
Ответить с цитированием
marat_sa
 
Аватар для marat_sa

Регистрация: Nov 2006
Сообщений: 487
Отправить сообщение для marat_sa с помощью ICQ Отправить сообщение для marat_sa с помощью Skype™
Видать объявили лжепаттерном и предали анафеме
__________________
Стой! Опасная зона! Работа мозга!

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

Регистрация: Jan 2009
Сообщений: 1,651
с пендосской википедии
Цитата:
It is also considered an anti-pattern by some people, who feel that it is overused, introducing unnecessary limitations in situations where a sole instance of a class is not actually required, and introduces global state into an application.
Цитата:
It should be noted that this pattern makes unit testing far more difficult[9], as it introduces Global state into an application.

Advocates of Dependency Injection would regard this as an anti pattern, mainly due to its use of private and static methods.

In a nod to the concept of 'Code Smells', this pattern has also been known as the Stinkleton pattern.

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

Регистрация: Jul 2009
Сообщений: 25
В мейн классе:
stage.addChild(hero);

А в другом классе героя можно получить: new hero:Hero = stage.getChildAt(1) as Hero;
Конечно это не очень хорошо, т.к если кто-то в мейн классе случайно поменяет местами добавление в список отображение, то это приведёт к не очень приятным последсвиям, поэтому используйте stage.getChildByName().


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

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

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


 


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


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