[23]: Реакция на столкновение “Объект-Стена”

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

Реакция на столкновение “Объект-Стена” – тот тип реакции происходит, когда объект вроде окружности или прямоугольника сталкивается со стеной или полом. Стеной называется любой объект который не может перемешаться в результате столкновения, но с которым может происходить столкновение. Данный вид столкновений со стенами есть в очень многих играх: футбол, бильярд, волейбол, гольф, теннис, марио, чип и дейл, пинбол и т.д. и т.п.

Допустим есть персонаж, бегающий по миру, типа марио, и есть блоки с монетами. Они будут являться стенами. Если герой бьёт снизу по нему, то герой меняет направление и что-то происходит с объектом (ломается, вылетает монетка), а если сверху или сбоку, то блок мешает движению. В данном уроке по определению реакции на столкновение “Объект-Стена” я покажу вам как сделать данную реакцию на примере коробки в которой будет двигаться мяч. На основе этого урока сделаем пинг-понг:))

Вот, на картинке представлен алгоритм как осуществить реакцию столкновения объекта со стеной.

23_1

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

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

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

Комментарии
  1. Николай

    Я так понимаю подобное решение является альтернативой проверке столкновений между кадрами?
    И второй вопрос по объектам. Я понял, что использование подобного контейнера позволяет не создавая кучу переменных для каждого клипа, создать их для контейнера, и применяя этот контейнер к нужному клипу, управлять его параметрами. А в чём ещё преимущества данной техники?

    • admin

      я бы не назвал его альтернативой. Этот способ нужен чтобы нарисовать шар в месте столкновения, а не так чтобы он мог проваливаться в стену. В данном примере между кадрами ничего определять не нужно при любых скоростях, т.к. у нас ограничение стенами, т.е. мы проверяем больше или меньше по координатам. Если добавить стену в середине и шар будет двигаться очень быстро, то такой способ уже не прокатит и нужно будет определять между кадрами, иначе пролетит. Но это всё равно гораздо проще, т.к. 1 объект не движется и он не круглый :)
      По объектам, всё верно, + ещё если захочешь поменять что-то, название клипа или вложить его внутрь ну и т.д., то нужно будет только изменить 1-2 строчки, а не искать и менять значения и имена по всему коду. В плане оптимизации даже не знаю. Я ещё попробую тоже самое через массивы сделать. Хотя я уже привык к объектам, особенно удобно в плиточных играх :) Допустим, поле 10х10, а имя объекта obj5_4, понятно сразу какая клетка, какая координата, и что там будет с героем :)

  2. Ranex

    Объясни пожалуйста вот эти строчки:
    ball.x = ball.clip.x;
    ball.y = ball.clip.y;
    Не могу понять почему свойству ball.x и ball.y
    присваивается ball.clip.x и ball.clip.y
    а используются по прежнему: ball.clip.x и ball.clip.y ???
    При использовании в коде ball.x и ball.y при компиляции шар просто стоит на месте, а если убрать :
    ball.x = ball.clip.x;
    ball.y = ball.clip.y;
    то шар просто исчезает при столкновении со стеной…
    странности какие то…

    • admin

      И правда, не пойму почему не использовал… Если использовать их, то надо будет писать так:
      function moveBalls (ball) {
      ball.ymov += ball.gravity;
      ball.tempx = ball.x + ball.xmov;
      ball.tempy = ball.y + ball.ymov;
      }
      function render () {
      ball.clip.x = ball.tempx;
      ball.clip.y = ball.tempy;
      ball.x = ball.clip.x;
      ball.y = ball.clip.y;
      }

      При использовании в коде ball.x и ball.y – это потому что это не ссылки на объект, а значения х и у записанные в переменной х и у, и меняя их не изменишь положение шара. Поэтому в функции рендера надо добавить строчки, которые добавлены выше. А вот “то шар просто исчезает при столкновении со стеной…” у меня такого нет, удалял ball.x и ball.y и всё работает как работало :)

Добавить комментарий

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