![]() |
|
||||||||||
|
|||||
|
как бы учусь, не в полной мере понимаю все возможности as3 и преимущества, если можно дайте более конкретный коммент.
сейчас у меня 3 класса: Main Food Friend а смысл такой: нужно перетаскивать еду на друзей, когда каждый друг получил кусочек – ура, пакшот, финальные титры!) |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Я в свое время реализовывал дрэгменеджер следующим образом:
Тот, на кого можно перетаскивать предмет реализует интерфейс IAccepter в котором, грубо говоря, есть метод dropHandler(object:IDraggableObject), который вызывается DragManager'ом. DragManager — синглтон. У DragManager'a регистрируются все объекты, которые хотят реагировать на перетаскивание на них объекта, и все объекты, которые должны быть перетаскиваемыми. IAccepter'ов он подписывает, грубо говоря, на MOUSE_UP. Перетаскивание IDraggableObject'ов рулит тот-же DragManager, startDtag(), stopDrag() и прочее. Когда начинается перетаскивание, дрэгменеджер записывает ссылку на перетаскиваемый объект (_activeDraggableObject), и при срабатывании у IAccepter'а MOUSE_UP, вызывает функцию IAccepter.dropHandler, передавая в нее сохраненную ссылку на текущий перетаскиваемый объект. IAccepter волен поступать с тем, что на него перетащили как ему вздумается, например диспатчить событие о том, что на него что-то перетащили ![]() Естественно, описание упрощенное. Возможно и не лучшее решение, но мне было с ним вполне комфортно и удобно жить ![]()
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
|
Как считаете, обойтись без синглтона здесь возможно?
Я еще не накопил достаточно "маны"), не разу не использовал синглтон, поэтому для меня это сложновато. |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Ну синглтон он для удобства, чтобы можно было обратиться к нему из любого IAccepter'a и IDraggebleObject'a, но можно и пробрасывать ссылку на этот менеджер любому из них.
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
|
сейчас получается так:
мы схватили "еду", тащим ее на "друга", срабатывает метод over, но но 50 строка не выполняется TypeError: Error #1006: value is not a function. at com::Friend/over()[/Volumes/work/Projects/KFC/KFC-202477/banner_800x250/com/Friend.as:50] private function over(e:MouseEvent):void { if((this.root as Main).take == true) { myTween = new Tween(this, "y", Strong.easeOut, _y, _y-70, 5, false); myTween.addEventListener(TweenEvent.MOTION_FINISH, tweenFinishd, false, 0, true); this.gotoAndStop(2); if((this.root as Main).cursor.hitTestObject(this)) { // условие для 1-го кусочка if((this.root as Main).currentDragged == "f1_mc") { piple = this.name; (this.root as Main).f1.alpha = 0; if(piple == "p1_mc") { trace((this.root as Main).currentDragged)//почему - то выводит сразу 2 одинаковых имени ("f1_mc" - этот объект был наведен на экземпляр Friend) (this.root as Main).s1.alpha = 1;// ругается на эту строку } } } } } |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Цитата:
![]() По вашим кускам кода не понятно что у вас там происходит, и откуда взялась ошибка. Попробуйте выложить архив с вашими исходниками, может будет не лень посмотреть ![]()
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
|
проблема в классе Friend, не могу правильно задать условие и обратиться к нужным объектам на сцене.
Немного объясню что в fla: кусочек курицы f1_mc перетаскиваем на самого левого "кудрявого" друга. этот кусок должен исчезнуть, "кудрявый" друг перестать реагировать на ROLL_OVER и внутри друга должен появиться красный пар (s1.alpha = 1) архив тут: http://***********/19875011 Добавлено через 24 минуты я вот так вот переделал класс Friend package com { import com.Food; import com.Main; import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; public class Friend extends MovieClip { private static var _y:int; private var myTween:Tween; public function Friend() { this.addEventListener(Event.ADDED_TO_STAGE, init); } private function init (e:Event):void { _y = this.y; this.addEventListener(MouseEvent.ROLL_OVER, over, false, 0, true); } private function over(e:MouseEvent):void { if((this.root as Main).take == true) { myTween = new Tween(this, "y", Strong.easeOut, _y, _y-70, 5, false); myTween.addEventListener(TweenEvent.MOTION_FINISH, tweenFinishd, false, 0, true); this.gotoAndStop(2); if((this.root as Main).cursor.hitTestObject(this)) { switch((this.root as Main).currentDragged) { case "f1_mc": (this.root as Main).piple = this.name; (this.root as Main).f1.alpha = 0; stopFriend(); break; case "f2_mc": (this.root as Main).piple = this.name; (this.root as Main).f2.alpha = 0; stopFriend(); break; case "f3_mc": (this.root as Main).piple = this.name; (this.root as Main).f3.alpha = 0; stopFriend(); break; } } } } private function tweenFinishd(e:TweenEvent):void { myTween = new Tween(this, "y", Strong.easeIn, this.y, _y, 5, false); myTween.addEventListener(TweenEvent.MOTION_FINISH, shutUp, false, 0, true); } private function shutUp(e:TweenEvent):void { this.gotoAndStop(1); } public function stopFriend():void { this.removeEventListener(MouseEvent.ROLL_OVER, over); (this.root as Main).num ++; //trace((this.root as Main).num) if((this.root as Main).num == 3) { trace("!!!!!!!!!!!!!!!!!!!!!") (this.root as Main).allRight();// эх запустить бы этотметод!!! } } } } Добавлено через 1 час 54 минуты а есть какой - нибудь другой способ вызвать метод может не совсем правильный, но что бы заработало?) Добавлено через 4 часа 13 минут нужно было завести статическое свойство и через него обращаться типо: и из дополнительного обращаться так: |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:57. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| function , public , static |
|
|