PDA

Просмотр полной версии : Во Flex sdk не работает MouseEvent.MOUSE_DOWN


Ioangum
02.10.2013, 14:38
Здавствуйте! Во Flex не срабатывает событие MOUSE_DOWN. Точнее, когда запускаю проект, то никаких ошибок не вылазит, и всё успешно запускается; но приложение ну совсем никак не реагирует на клик мышкой.
У меня есть объект M, который добавляет объект S: stage.addChild(S). M же графики никакой не содержит. Вот что находится внутри S:

import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.MouseEvent;

public dynamic class S extends Sprite
{

public function S() {
graphics.drawRect(0, 0, 1080, 780);
addEventListener(Event.ADDED_TO_STAGE, onAddStage);
}

private function onAddStage(e:Event):void {
addEventListener(MouseEvent.MOUSE_DOWN, startDr);
trace(parent);
}

private function startDr(e:MouseEvent):void {
trace("!!!!!!!!!!!!!!!!!!!!!!!!!");
var r:Shape = new Shape();
r.x = 350;
r.y = 250;
r.graphics.beginFill(0x33FF33);
r.graphics.drawRect(0, 0, 100, 100);
r.graphics.endFill();
addChild(r);
startDrag();
}

}

И, когда нажимаю кнопкой мыши на экране приложения, ничего не происходит. Если же добавлять слушателя Stage, то всё работает: stage.addEventListener(MouseEvent.MOUSE_DOWN, startDr);. Но мне вот нужно сделать не через Stage. Помогите, пожалуйста, добрым советом! Спасибо

AlexLucas
02.10.2013, 15:31
public function S() {
graphics.beginFill(0xff0000); //вот это добавьте -это определяет заливку, graphics.lineStyle(..) определяет контур
graphics.drawRect(0, 0, 1080, 780);
addEventListener(Event.ADDED_TO_STAGE, onAddStage);
}
Вас не удивило что вы не видите на экране того прямоугольника что вы нарисовали ? :)
Он у вас без заливки и контура, соответственно по нему вы не кликните.

Ioangum
02.10.2013, 15:39
Да точно, тупанул... Прошу прощения за такой глупый вопрос!

Akopalipsis
02.10.2013, 15:50
Но мне вот нужно сделать не через Stage.
У меня есть объект M, который добавляет объект S: stage.addChild(S).
На самом деле вешать слушателя на стейдж - это хорошо ЭТО ПЛОХО!!!!, а вот добавлять stage.addChild(S) - это плохо.

KumoKairo
02.10.2013, 16:00
На самом деле вешать слушателя на стейдж - это хорошо
Слушателя клика мыши? :D
Вот будет здорово если я вместо того, чтобы повесить слушатели на кнопки, повешу их на стейдж))

Akopalipsis
02.10.2013, 16:24
я хотел сказать, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Вот будет здорово если я вместо того, чтобы повесить слушатели на кнопки, повешу их на стейдж))
А что такого страшного может произойти? я просто правда не знаю, расскажите, а то может и в правду нельзя...

KumoKairo
02.10.2013, 16:32
я хотел сказать, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Я воспринимаю это так - "Я не могу добавить на стейдж объект, поэтому лучше добавлю туда слушатель." :)
"Я не могу пройти по соседскому газону, поэтому лучше поставлю туда тумбочку"

А что такого страшного может произойти? я просто правда не знаю, расскажите, а то может и в правду нельзя...
Ну есть у вас кнопка, вам нужно отследить нажатие на эту кнопку и выполнить какой - то код) А вы вместо того, чтобы отслеживать нажатие на кнопку, отслеживаете нажатие на весь экран. :D

Представте что у вас есть кнопка "закрыть приложение", а срабатывает она при нажатии на любую область экрана. Я бы сошел с ума от такой программы)

Akopalipsis
02.10.2013, 16:58
А если есть десять кнопок, то лучше десять слушателей или один слушатель на стедж?
Или если нужно вообще весь экран отслеживать на клик? Вот вообще весь, то так всё равно нельзя?

Добавлено через 7 минут
Я воспринимаю это так - "Я не могу добавить на стейдж объект, поэтому лучше добавлю туда слушатель."
Этими словами Вы приравняли добавить на стейдж обьект с добавить на стейдж слушатель.
я точно знаю, что добавлять на стейдж обьекты - нельзя! Недавно столкнулся с проблемой, на которую мне посоветовали повесить слушателя на стейдж. По Вашему это медвежий совет? Или слушать клавиатуру со стейджа === добавить десять классов на стейдж ?

Ioangum
02.10.2013, 17:52
А почему добавлять объекты на стейдж плохо? Чем это черевато-то?

AlexCooper
02.10.2013, 20:41
Akopalipsis на стейдж лучше вешать события MOUSE_MOVE, MOUSE_UP. И то не всегда. Всё если у Вас 10 кнопкок, то лучше создать контейнер и вешать на него события MOUSE_DOWN, etc...

Ioangum
А почему добавлять объекты на стейдж плохо? Чем это черевато-то?
Плохо в минимальном понимании инкапсуляцией. То-есть тем что у Вас объект стает доступным из любого места программы. Более правильно я считаю использовать DisplayObjectConteiner и в него рисовать графику.

KumoKairo
02.10.2013, 23:38
Akopalipsis, поймите, что "вешать слушатель на стейдж" - это настолько обширное понятие, что нельзя просто взять и сказать - "вешать слушатель на стейдж - хорошо".
Я поэтому и уточнил, мол, клик по стейджу слушать будем?)
В случае с клавиатурой просто нет другого варианта - это уже совсем другой слушатель.

Фраза "вешать слушатель на стейдж - хорошо" в корне не верна. Даже если отойти с примером про кнопку - если у вас есть лоадер или сокет, или еще что-то, выдающее отчет о проделанной работе - вы слушатель тоже на стейдж добавите?)

Да и с кнопками, блин, этож вообще. Если делать несколько слушателей на MouseEvent.CLICK на стейдж то будут вызываться все слушатели разом, хотя вам для каждой конкретной кнопки чаще всего нужен будет свой колбэк. Если вешать слушатель клика на стейдж, то в каждом из них (из слушателей) придется проверять - а тот ли объект был нажат? Чтобы не возникло случая как с кнопкой закрытия приложения)
Да и потом - зачем какой-то части программы знать, что где-то там, далеко, на другом логическом экране, была нажата какая-то кнопка?
В общем пересмотрите свои взгляды насчет "вешать слушатель на стейдж - хорошо", подумайте несколько шире.

На стейдж добавляем только клавиатурные события и те, что сказал товарищ AlexCooper - обычно используется в веб приложениях для отлавливания "интереса пользователя" - это железно. Все остальные случаи требуют конкретного рассмотрения и никак не вписываются в "вешать слушатель на стейдж - хорошо"

Akopalipsis
03.10.2013, 00:06
KumoKairo Спасибо за обьяснения и что Вы меня поправили - научили ещё чему то! Слова "хорошо" я исправил, чтобы кто то не прочёл.
Но тогда и приравнивать события и добавления обьектов тоже не надо! Вы же могли меня убедить в том, что это одно и тоже. И в следующий раз я бы при таком совете начал бы говорить, что не надо мне ерунду советовать.)

Wolsh
03.10.2013, 00:39
А почему добавлять объекты на стейдж плохо?
http://flasher.ru/forum/showpost.php?p=1085282&postcount=8
http://flasher.ru/forum/showpost.php?p=1143160&postcount=7
http://flasher.ru/forum/showpost.php?p=1143174&postcount=11
http://flasher.ru/forum/showpost.php?p=1129542&postcount=22

KumoKairo
03.10.2013, 09:13
На самом деле вешать слушателя на стейдж - это хорошо ЭТО ПЛОХО!!!!,
Зря я все расписывал насчет слушателей похоже..

Это не хорошо и не плохо, это по-другому.

Fogflasher
03.10.2013, 09:36
я точно знаю, что добавлять на стейдж обьекты - нельзя!

Хм, а по Муку вроде как можно, вот например:

For example, the following code modifies the App class from Example 20-5 so that the Sprite object
and its child Shape object are added directly to the Stage instance. Because the Sprite
and Shape objects are not descendants of a .swf file’s main class instance, their root
variables refer to the Stage instance.

package {
import flash.display.*;
import flash.geom.*;
public class App extends Sprite {
public function App ( ) {
var rect:Shape = new Shape( );
rect.graphics.lineStyle(1);
rect.graphics.beginFill(0x0000FF, 1);
rect.graphics.drawRect(0, 0, 75, 50);
var sprite:Sprite = new Sprite( );
sprite.addChild(rect);
// Add child to Stage instance, not this App instance
stage.addChild(sprite);
trace(rect.root); // Displays: [object Stage]
trace(sprite.root); // Displays: [object Stage]
}
}
}

Ну, то есть, чисто технически можно.
Но идеологически, как мы теперь знаем, это есть зло - согласно заповедям от Wolsh, например : )

caseyryan
03.10.2013, 10:48
Хм, а по Муку вроде как можно, вот например:
Ну, как бы, тут никто и не ставил под сомнение техническую возможность. Технически можно вообще неимоверную кашу нагородить в коде.

Вообще, вот это верно
Это не хорошо и не плохо, это по-другому.

Допустим есть менеджер подсказок, которые показываются при поднесении курсора к объекту , например, применяющему интерфейс IHintable. В этом случае ROLL_OVER / ROLL_OUT разумнее всего повесить именно на stage, так как необходим доступ ко всем таким объектам, независимо от их расположения. Можно конечно цепануть и к документ классу, но лично я разницы не вижу, никаких плюсов в этом не будет

KumoKairo
03.10.2013, 11:15
В этом случае ROLL_OVER / ROLL_OUT разумнее всего повесить именно на stage, так как необходим доступ ко всем таким объектам, независимо от их расположения. Можно конечно цепануть и к документ классу, но лично я разницы не вижу, никаких плюсов в этом не будет
Я специально написал что подобные случаи рассматриваются в личном порядке. Вопрос изначально был про клик по стейджу и то, что это "хорошо".

caseyryan
03.10.2013, 11:39
Я специально написал что подобные случаи рассматриваются в личном порядке. Вопрос изначально был про клик по стейджу и то, что это "хорошо".
Ну я, в общем-то, и не спорил ни с чем ;)

in4core
04.10.2013, 01:41
Плохо в минимальном понимании инкапсуляцией Обычно так работают новички, когда Main класс едиснтвенный в программе, тогда и на стейдж не стыдно