Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Во Flex sdk не работает MouseEvent.MOUSE_DOWN (http://www.flasher.ru/forum/showthread.php?t=203641)

Ioangum 02.10.2013 14:38

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

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, то всё работает:
Код AS3:

stage.addEventListener(MouseEvent.MOUSE_DOWN, startDr);

. Но мне вот нужно сделать не через Stage. Помогите, пожалуйста, добрым советом! Спасибо

AlexLucas 02.10.2013 15:31

Код AS3:

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...82&postcount=8
http://flasher.ru/forum/showpost.php...60&postcount=7
http://flasher.ru/forum/showpost.php...4&postcount=11
http://flasher.ru/forum/showpost.php...2&postcount=22

KumoKairo 03.10.2013 09:13

Цитата:

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

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

Fogflasher 03.10.2013 09:36

Цитата:

Сообщение от Akopalipsis (Сообщение 1147486)
я точно знаю, что добавлять на стейдж обьекты - нельзя!

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

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.


Код AS3:

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 класс едиснтвенный в программе, тогда и на стейдж не стыдно


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

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