![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2006
Адрес: Москва
Сообщений: 461
|
Оффтоп.
Я вот не понимаю, почему люди пишут "зачем так сделали, как же было удобно раньше"! Ну кто заставляет-то? Не подходят принципы AS3 - так есть AS 1-2. Кто мешает писать на них. А если уж надо сильно на AS3 - так зачем удивляться и критиковать ("Это же надо, для такой простой вещи две страницы кода написать надо...") Надо изучать, и тогда все будет в порядке, хотя переход может быть болезненным!... Модераторам: если что не так - готов понести справедливое наказание! |
|
|||||
|
Регистрация: 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. |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Цитата:
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(); } } |
|
|||||
|
тема настолько уже избитая и старая, что непонятно кто ее еще поднимает )
коли есть желание рулить другим дитем родяителя из дитя родителя, то передайте этому детю ссыль на другое дите в сетере или контсрукторе и рулите. (надеюсь не очень запутано оформил мысль). а лучше все руления, как сказали выше делегировать одному классу, назовем его контроллером. а из дитя наверх диспатчить события, что "мол вот хочу что-то сделать", а контроллер согласно событию рулит нужным дитем.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Копеечный вопрос - мне нужно, чтобы листенер на клик по бомбе был не на верхнем уровне, а внутри бомбы, и метод killMan класса GameBombMan вызывался из метода bombBoom объекта bomb. Экземпляров класса Bomb может быть сколько угодно, для примера сделал 10.
GameBombMan.as 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(); } } } 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 } } } 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; } } } } |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
public class Bomb extends Sprite{ //... public function bombBoom(e:Event) { bombImg.scaleX *= 2; bombImg.scaleY *= 2; dispatchEvent(new Event('bombBOOM')); } } 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|