[5]: Мышь

Приветствую вас, люди :) Сегодня расскажу вам как регистрировать и обрабатывать события мыши в action script 3.0. Координаты мыши можно определить с помощью следующих команд:

mouseX – координата курсора по оси Х
mouseY – координата курсора по оси У

Для того чтобы обработать какое-либо событие мыши, нужно вызвать слушатель событий .addEventListener.

Этот слушатель события осуществляет функцию bublik по нажатию кнопки мыши. А в этой функции мы можем делать что угодно, например переместить клип romb в точку, где находиться мышь.

Событий мыши на самом деле много, их аж вон сколько:

MouseEvent.CLICK – нажал на объекте и отжал на объекте = результат
MouseEvent.DOUBLE_CLICK – двойной клик на объекте = результат
MouseEvent.MOUSE_DOWN – нажал на объекте = результат
MouseEvent.MOUSE_MOVE – двигаешь курсор над объектом = результат
MouseEvent.MOUSE_OUT – курсор покинул пределы объекта = результат
MouseEvent.MOUSE_OVER – курсор вошел в пределы объекта = результат
MouseEvent.MOUSE_UP – нажал где угодно, отжал на объекте = результат
MouseEvent.MOUSE_WHEEL – крутанул колесо мыши над объектом = результат
MouseEvent.ROLL_OUT – курсор покинул пределы объекта = результат
MouseEvent.ROLL_OVER – курсор вошел в пределы объекта = результат

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

Mouse.hide( ) – скрыть курсор
Mouse.show( ) – показать курсор

Обо всём этом (и не только этом) смотрите в видеоуроке ниже:

Исходник: yadi.sk/d/-FURKxubF48XC
Код ActionScript 3.0 из урока:

Всё подробно рассказано в видео :) Если будут какие-либо вопросы, пишите в комментариях к видео. Надеюсь, данный урок по реализации скорости в action script 3.0 в программе adobe flash, поможет вам в разработке игр. :)

Комментарии
  1. Макс

    Спасибо за уроки.

  2. Макс

    Я хочу создать свою игру во флешь на тренировку памяти. Где например из десяти возможных ячеек, программа выбирает 5 случайных ячеек, которые пользователь должен запомнить и затем повторить,что-то типа такого…. Но не имею представления как это сделать.

    • admin

      Это просто на самом деле. Алгоритм таков. Случайным образом выставляешь ячейки с помощью Math.random(), и сохраняешь куда-нибудь эти данные. А когда пользователь вводит свои данные просто сравниваешь с тем что было. Если же тест памяти с элементами на сцене (не помню названия, принцип таков. в случайных местах появляются фигуры разного цвета, и человек должен по порядку восстановить где и что было изображено. Делается также. случано создаешь где-то что-то и сохраняешь координаты и параметры объекта и его номер. А когда человек жмёт своё сравниваешь += правильно он указал место и объект. Это на самом деле простая задача для программирования. Для новичка, конечно же, очень сложная.

  3. Эрик

    Пытаюсь совместить пример, рассмотренный во 2 уроке и тот, что Вы давали в комментариях к 5 уроку на YouTube.
    Задача в том, чтобы при вращении колесика мыши менялась траектория движения объекта.
    Соответствует ли оборот объекта одному обороту колесика мыши, не важно. Главное, чтобы угол поворота на один щелчок мыши был кратен 360-и (например, 5*).
    Все “работает”… коряво…
    Сам объект поворачивается в точном соответствии с назначенным углом (в данном случае 5 гр.), а вот изменение траектории движения не соответствует углу поворота… угол изменения траектории всегда больше, чем угол поворота объекта, соответственно, при повороте объекта на небольшой угол, он может начать двигаться в противоположном направлении.
    Так же заметил, через trace(“e.delta = “, e.delta); trace(angle);, что после первого щелчка колесика мыши значение угла = 0, и только со второго щелчка начинает изменятся, при том, что поворот объекта происходит сразу по первому щелчку.
    Если же изменить направление вращения, то после первого щелчка в обратном направлении, значение угла продолжает изменятся в прежнем направлении, и только после второго меняется на противоположное, при том, что объект меняет направление вращения сразу… Да еще и значение угла поворота, при вращении, суммируется…
    В общем… запутался… не могу разобраться, как это исправить и как заставить объект после поворота двигаться в том же направлении, в котором он повернулся.
    Собственно, сам файл здесь https://yadi.sk/d/V3rsgdA03KBUZv (Animate CC 2017), а вот код:

    //Вариант 2 с enter_frame, в одном кадре
    /*stop();*/
    var cmov = 0.005;
    //cmov = приращение вдоль траектории движения
    var angle: int = angle;
    stage.addEventListener(Event.ENTER_FRAME, viraj);
    function viraj(e: Event)
    {planer.x = planer.x + ((Math.cos(angle) * cmov) * 180 / Math.PI);
    planer.y = planer.y + ((Math.sin(angle) * cmov) * 180 / Math.PI);};
    var b: int = 5;
    //b = угол поворота за один клик колесика мыши, в градусах
    stage.addEventListener(MouseEvent.MOUSE_WHEEL, turn);
    function turn(e: MouseEvent)
    {// trace (“e = “, e);
    // направление колеса
    trace(“e.delta = “, e.delta);
    trace(angle);
    var rt: int = e.delta;
    if (rt > 0)
    {angle -= b;
    planer.rotation = angle;}
    else
    if (rt < 0)
    {angle += b;
    planer.rotation = angle;}};

    P.S. Расчет координат сделал через sin и cos, т.к. сначала объект поворачивается на заданный угол, а затем по углу и приращению вдоль траектории движения (грубо говоря, по гипотенузе) рассчитываются новые координаты… Может и можно иначе, но… как-то не придумалось…

    • admin

      https://yadi.sk/d/PsYhjBKI3KDkDz

      Не знаю, сможете открыть или нет. У меня Flash CC. Если не сможете, напишите.
      Через // комментировать каждую строчку не стоит. Если нужно убрать большой кусок кода, пишите перед ним /* и после него */

  4. Эрик

    Евгений, спасибо огромное!
    Файл открылся, и судя по тому, что и мой файл открылся у Вас, соблюдается совместимость в обе стороны, что радует.
    С комментированием разобрался. Функционал окна AS3 они конечно «порезали» … ну да можно ведь и «хоткеев» наделать под себя… Вот только не смог найти функции «collapse between braces»… хотелось бы иметь возможность «спрятать» часть кода не исключая его из компиляции… Правда, такая возможность появляется, если нужный «кусок» заключить в фигурные скобки, но… я не уверен, что это «по правилам», хотя и работает…
    Еще раз спасибо за то, что уделил время разбору моего «творчества», и даже написали свой работающий вариант. Единственно, попытка, например, уменьшить скорость, изменяя только переменную speed, приводила к тому, что до первого щелчка мыши объект двигается со скоростью, заданной «xmov/ymov», и только после поворота колесика замедляется до установленной. Попробовал добавить еще одну переменную «skorost»… вроде теперь нормально, хотя опять же, полной уверенности в правильности своих действий, нет…
    stop();
    // угол поворота в градусах
    var angle: int = 0;
    // скорости по Х и У.
    // чтобы сначала самолёт стоял на месте, поставить xmov = 0
    var skorost = 1
    var xmov: Number = skorost;
    var ymov: Number = 0;
    // скорость
    var speed: Number = skorost;

    Теперь буду заниматься тригонометрией и пытаться увязать углы поворота объекта и шкал, и стрелок прибора… Задумка есть, как это сделать… если «застряну», снова приду к Вам за советом.
    P.S. При написании кода, среди программистов, наверняка сложились какие-то правила, помогающие сделать код более читаемым… удобным, что ли… Дело в том, что в этом проекте будет 10-12 объектов, часть которых будут наложены друг на друга, но работать будут независимо друг от друга, и я «раскидал» их по слоям, рассчитывая, в последствии, прописать «куски» кода для каждого объекта на его слое… А сейчас мне эта идея уже не кажется хорошей… не правильней ли будет сосредоточить весь код в одном месте?

    • admin

      “10-12 объектов, часть которых будут наложены друг на друга, но работать будут независимо друг от друга, и я «раскидал» их по слоям”. Раскидать по слоям правильно.
      А вот код, желательно, писать в отдельном слое и весь в 1 кадре. А супер уникумы пишут вообще отдельно в файле as. но этот лабиринт я не люблю.

      “Попробовал добавить еще одну переменную «skorost»”. Вполне правильный вариант.
      Короче будет, если написать так:
      var angle: int = 0;
      var speed: Number = 1;
      var xmov: Number = speed;
      var ymov: Number = 0;

      “«спрятать» часть кода не исключая его из компиляции”. Это как вообще возможно? О_о. Не знаю, что это за чудо, мне хватает /* код */ и свернуть его.

Добавить комментарий для Эрик Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">