[17]: Независимое от кадров обнаружение столкновений “Окружность-Окружность”

Приветствую вас, ребята и девчонки :) Сегодня продолжается серия уроков по обнаружению столкновений в action script 3.0. :) Расписывать подробно я  как обычно не буду, всё ооочень чётко изложено в видеоуроке. Здесь я распишу лишь алгоритм на основе которого всё работают.

При разработке игр очень важно знать о том, как обнаружить пересечение окружности с окружностью МЕЖДУ КАДРАМИ с помощью action script 3.0. Это может пригодится в таких играх как пинбол, бильярд, гольф. хоккей и т.д.

В этом уроке вы научитесь писать математически сложный код обнаружения столкновений “окружность-окружность” НЕЗАВИСИМОЕ от кадров! Этот способ является продвинутым способом определения столкновений окружностей. Если вам непонятно, посмотрите предыдущий урок с простым способом.

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

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

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

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

Комментарии
  1. Дмитрий

    Без бутылки водки не разобраться

    • admin

      да) самая сложная тема из существующих :) не считая сетевых штук

  2. Дмитрий

    а если вместо EventFrame использовать TimerEvent с обновлением положения объектов 5 раз в кадр (1 раз в 10 мс к примеру). т.е. не придется высчитывать промежуточное положение. Это мои мысли в слух, ибо довольно сложен этот код

    • admin

      обычно никто так не делает. Покадровая анимация привычнее.

  3. Dmitriy154

    а как же сделать, чтобы круги отскакивали друг от друга под правильными углами и со скоростями с учетом масс объектов. Другие уроки я не еще не читал, может там будет.

    • admin

      в уроках по реакциям на столкновения окружностей. :)

  4. Dmitriy154

    Евгений, объясните в чем отличие ключевых слов this и root.

    • admin

      я не могу :D this – что-то типо относительной позиции, типа когда ты находишься в объекте, в мувике, или где-то ещё, то через this ты обращаешься к нему. А root – что-то типа абсолютной, типа не важно где ты находишься, всё равно привязка будет к сцене и всем элементам на сцене. Как-то так. По крайней мере в as2 было так. :)

  5. Виктор

    Подскажите, пожалуйста, а как сделать столкновения мувиклипов, которые генерировались посредством EventListener, у каждого после генерации появлялась переменная со значением e.currentTarget?
    Хочется, чтобы они могли сталкиваться сами с собой и разлетаться друг от друга.

    пример кода:
    function addscull (e:Event)
    {
    var menuscull = new menuskullobj();
    menuscullposition_x = Math.random()*(stage.stageWidth+stage.stageWidth/4)-stage.stageWidth/8;
    menuscullposition_y = Math.random()*(stage.stageHeight+stage.stageHeight/4)-stage.stageHeight/8;
    menuscull.x = menuscullposition_x;
    menuscull.y = menuscullposition_y;
    menuscull.ymov = Math.random()*6-3;
    menuscull.xmov = Math.random()*6-3;
    titlescreen.addChild (menuscull);
    menuscull.addEventListener (Event.ENTER_FRAME, scullmove);
    }

    function scullmove (e:Event)
    {
    var singlescull = e.currentTarget;
    singlescull.x += singlescull.xmov;
    singlescull.y += singlescull.ymov;
    if (singlescull.y > stage.stageHeight+stage.stageHeight/8)
    {
    singlescull.ymov *= -1;
    }
    if (singlescull.x > stage.stageWidth+stage.stageWidth/8)
    {
    singlescull.xmov *= -1;
    }
    if (singlescull.y < -stage.stageHeight/8)
    {
    singlescull.ymov *= -1;
    }
    if (singlescull.x < -stage.stageWidth/8)
    {
    singlescull.xmov *= -1;
    }
    }

    А дальше нужно, чтобы каждая появляющаяся копия могла сталкиваться с уже имеющейся. Это возможно? Вы подскажите?
    Заранее спасибо)

    • admin

      Привет :) Да, такое возможно, но делать это долго и нудно :D Особенно, если столкновения должны быть умные с правильным отскоком…
      К примеру вот тут http://demiart.ru/forum/index.php?showtopic=122519 просто показано как определять пересечения кучи объектов, а вот скрипт отскока можно взять из урока Реакции на столкновения окружность-окружность, и будет счастье :) Вот кроме как бильярда, я в этой затее больше смысла не вижу.
      Если просто нужна анимация этого всего, советую взять движок quickbox2d и в нём сделать. Быстрее будет :)
      P.S. У меня на компе сейчас даже флеша нет :D

      • Виктор

        Спасибо, попробую движком)

      • Виктор

        А почему флеша нет? Все, разочаровались в нем?) Что используете?

        • admin

          да нет, просто шестой фотошоп идиотский. То зависает, то вылетает, установил четвёртый фотошоп. Ну и лицензии всей шестой линейки адоба полетели :D только 4 фотошоп и работает :) Теперь либо скачаю где-нибудь master collection cs3, либо cs4, либо cc (если он нормальный).
          Урок по QuickBox2D: Part 1: http://demiart.ru/forum/index.php?showtopic=167369
          Урок по QuickBox2D: Part 2: http://demiart.ru/forum/index.php?showtopic=170681

          Ну, а если хочешь сложный путь, по оригинальному движку, то
          Урок по Box2DFlash: http://demiart.ru/forum/index.php?showtopic=181251

          • Виктор

            Круто, спасибо!

  6. Михаил

    Привет, Евгений!
    Подскажи, пожалуйста, где можно почить про этот алгоритм столкновений в частности про вычисления в функции “ballToBallDetect”. уж очень хочется знать, что мы там вычисляем. просто хочется по подробнее разобраться что означают все эти формулы.

    • admin

      Привет. Книга Джоб Макар “Секреты разработки игр в Macromedia Flash MX” :) Можно сказать, практически все уроки по основам as3 сделаны по примерам из этой книги, но переделанные под as3, вместо as2, который применялся там.

  7. Антон

    Заметил такую мелочь, что на разной скорости выдает разное количество столкновений например ball1 на скорости 2 выдает 4 столкновения, а на скорости 20 – 2 столкновения. Причем 1 столкновение выдает всегда 1 сообщение, а при разрыве по разному(в зависимости от скорости), интересно, с чем это связано?

    • admin

      1 из причин – это обводка шаров линией толщиной 1. Для этого флеша для точности обводка должна быть самой тонкой волосной линией. Такая же история и с пересечением линий!!! если взять не волосную, то будет неправильно считать. Второй момент – 4 столкновения может быть. 2 входа, которые различаются очень незначительно, т.к. оба шара едут, такая ситуация может быть. И третий момент – в этом примере я после столкновения рисовал шар в том месте где будет столкновение, поэтому в другом кадре также может бытьопределено столкновение, т.к. это as3 очень криво считает числа. Да и по анимации видно как шар прилипает к другому на 1 кадр. Но это пример определения пересечений. А используется это для отскока, в другом уроке про реакции.

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

Ваш 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="">