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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.11.2009, 03:18
Hidest вне форума Посмотреть профиль Отправить личное сообщение для Hidest Найти все сообщения от Hidest
  № 11  
Ответить с цитированием
Hidest
 
Аватар для Hidest

Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
Оффтоп.

Я вот не понимаю, почему люди пишут "зачем так сделали, как же было удобно раньше"! Ну кто заставляет-то? Не подходят принципы AS3 - так есть AS 1-2. Кто мешает писать на них. А если уж надо сильно на AS3 - так зачем удивляться и критиковать ("Это же надо, для такой простой вещи две страницы кода написать надо...") Надо изучать, и тогда все будет в порядке, хотя переход может быть болезненным!... Модераторам: если что не так - готов понести справедливое наказание!

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Не совсем так.

Это когда знаешь только AS3, а до этого только AS2, можно восхищаться супер-пупер переходом к ООП-программингу. Кое-что сделано в высшей степени топорно и к ООП никакого отношения не имеет. Например, тот же getURL. Давайте тогда уж для единообразия и перед каждым trace создавать какой-нибудь traceConnection. Но это так, к слову.

Я, например, все никак не могу въехать во взаимодействие между объектами.

Вот конкретный пример (код приводить не буду, не в синтаксисе тут дело):

1. Все собираем в спрайте container, который кладем на сцену.
2. слева - объект bomb, он должен взорваться, справа - объект man, который должен упасть примерно через полсекунды после взрыва. Для этого у объекта man делаем метод dropMan, который запускает свой мувик на таймлайне (man качается и падает). Объект man вытаскиваем в container и позиционируем при загрузке.
3. для объекта bomb делаем символ в библиотеке, который также вытаскиваем в container и позиционируем при загрузке. Внутри вешаем листенер по клику мыша, который обрабатываем (запускаем мувик на таймлайне) и после этого необходимо вызвать каким-то образом метод dropMan объекта man.

Как?
Искать man в container через getChildByName()?
Или можно как-то к нему и его методам напрямую обратиться?


Последний раз редактировалось mikhailk; 28.11.2009 в 21:52.
Старый 29.11.2009, 00:05
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 13  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Цитата:
Сообщение от mikhailk Посмотреть сообщение
Искать man в container через getChildByName()?
Или можно как-то к нему и его методам напрямую обратиться?
Нет, написать управляющий всей этой логикой класс (назовём его Game), который будет хранить в себе ссылки на man, bomb и пр. И логику игры инкапсулировать в этом классе. Добавлять bomb и man можно в любые контейнеры, нам до этого дела быть не должно. Мы к ним обращаемся по ссылкам, имеющим соответствующий тип:

Код AS3:
public class Game extends Sprite{
 
	private var bomb:MovieClip;
	private var man:Man;
 
	private var container:Sprite;
 
	public function Game(){
		container = new Sprite();
		addChild(container);
		bomb = new Asset_bomb(); //из библиотеки, например
		container.addChild(bomb);
		man = new Man();
		container.addChild(man);
	}
 
	public function killMan():void{
		bomb.play();
		//...
		man.dropMan();
	}
 
}
Вы имели когда-нибудь дело с каким-нибудь другим ООП-языком? Если да, подобные вопросы у вас возникать не должны. Не нужно сваливать на флэш своё непонимание базовых вещей. Не хочу сказать, что в AS3 всё идеально, но по большей части кардинальных отличий от других объектно-ориентированных языков нет.

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
тема настолько уже избитая и старая, что непонятно кто ее еще поднимает )

коли есть желание рулить другим дитем родяителя из дитя родителя, то передайте этому детю ссыль на другое дите в сетере или контсрукторе и рулите. (надеюсь не очень запутано оформил мысль).

а лучше все руления, как сказали выше делегировать одному классу, назовем его контроллером. а из дитя наверх диспатчить события, что "мол вот хочу что-то сделать", а контроллер согласно событию рулит нужным дитем.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

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

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Копеечный вопрос - мне нужно, чтобы листенер на клик по бомбе был не на верхнем уровне, а внутри бомбы, и метод killMan класса GameBombMan вызывался из метода bombBoom объекта bomb. Экземпляров класса Bomb может быть сколько угодно, для примера сделал 10.

GameBombMan.as
Код AS3:
package {
	import flash.display.*;
 
	public class GameBombMan extends Sprite{
 
		private var bomb:Bomb;
		private var man:Man;
		private var container:Sprite;
 
		public function GameBombMan(){
 
			container = new Sprite();
			addChild(container);
			man = new Man(container);
			for( var i:int=0;i<10;i++ ) { 
				new Bomb(container,Math.random()*500,Math.random()*300); 
			}
 
		}
 
		public function killMan():void{
			man.dropMan();
		}
 
	}
}
Bomb.as
Код AS3:
package {
	import flash.display.*;
	import flash.events.*;
 
	public class Bomb extends Sprite{
 
		private var bombImg:Sprite; 
 
		public function Bomb(container:Sprite,bombX:int,bombY:int){
 
			bombImg = new Sprite();
			bombImg.x = bombX;
			bombImg.y = bombY;			
			with (bombImg.graphics) {
				beginFill(0x00aaaa, 1);
				drawCircle(0, 0, 10);
				endFill();
			}						
			container.addChild(bombImg);
			bombImg.addEventListener(MouseEvent.CLICK, bombBoom);						
		}
 
		public function bombBoom(e:Event) {
			bombImg.scaleX *= 2;
			bombImg.scaleY *= 2;
			// Здесь нужно вызвать killMan() из GameBombMan
		}		
	}
}
Man.as
Код AS3:
package {
	import flash.display.*;
	import flash.events.*;
 
	public class Man extends Sprite{
 
		private var manImg:Sprite; 
 
		public function Man(container:Sprite){
			manImg = new Sprite();
			manImg.x = 300;
			manImg.y = 100;			
			with (manImg.graphics) {
				beginFill(0xaa3333, 1);
				drawRect(0, 0, 40, 100);
				endFill();
			}						
			container.addChild(manImg);
			manImg.addEventListener(MouseEvent.CLICK, testClick);	// для проверки, что dropMan() работает
		}
 
		private function testClick(e:Event) {
			this.dropMan();
		}
 
		public function dropMan() {
			if (manImg.width == 40) {   // "Неваляшка"
				manImg.width = 100;
				manImg.height = 40;
				manImg.y += 60;
			} else {
				manImg.width = 40;
				manImg.height = 100;
				manImg.y -= 60;				
			}
		}
 
	}
}

Старый 29.11.2009, 19:05
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 16  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Код AS3:
public class Bomb extends Sprite{
 
	//...
 
	public function bombBoom(e:Event) {
		bombImg.scaleX *= 2;
		bombImg.scaleY *= 2;
		dispatchEvent(new Event('bombBOOM'));
	}		
}
Код AS3:
public class GameBombMan extends Sprite{
 
	public function GameBombMan(){
 
		//...
 
		var bomb:Bomb;
		for( var i:int=0;i<10;i++ ) { 
			bomb = new Bomb(container,Math.random()*500,Math.random()*300); 
			bomb.addEventListener('bombBOOM', bombBoomHandler);
		}
 
 
	}
 
	private function bombBoomHandler(event:Event):void{
		var bombWasBoom:Bomb = event.target as Bomb;
		trace('Bomb ' + bombWasBoom + ' BOOM!!!');
		killMan();
	}
 
	//...
 
}
вопрос действительно копеечный.


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

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

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


 


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


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