Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
16 / 16 / 6
Регистрация: 04.03.2014
Сообщений: 160
1

Проверка на столкновение

08.06.2014, 12:42. Показов 3159. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть массив со списком объектов на сцене. При нажатии стрелок, эти объекты двигаются, создавая перемещение. В центре сцены есть объект - игрок. Его координаты остаются неизменны, т.к он не входит в массив, а стоит на месте, но при этом ощущение что он движется.

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
    public function wallplayer(e:Event):void
    {
            for (i = 0; i < platform_obj_wall.length; i++)
            {
                if (bg_igrok.hitTestObject(platform_obj_wall[i]))
                {
            trace("Набежали на стену");
                }
 
        }
    }
Как мне реализовать столкновение игрока со стеной? Трейс работает, то есть если игрок набегает на объект из массива то выводится Набежали на стену. Как мне сделать так, чтобы игрок не мог пройти через эти стены? Что надо дописать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2014, 12:42
Ответы с готовыми решениями:

Проверка на столкновение
Делаю проверку на столкновение - смысл в том, что в каждый объект вставлен MovieClip под именем hit...

Проверка на столкновение
Привет всем, кто может подсказать как проверить на столкновение 2 объекта не использовав...

Проверка на столкновение кнопок
Привет! Вот какой вопрос. Как выглядит проверка на столкновение двух кнопок? т.е. Есть две кнопки и...

Проверка на столкновение картинок
Проверка на столкновение картинок , есть 1 машинка которой управляю и остальные картинки в...

23
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
09.06.2014, 22:10 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от TanaTiX Посмотреть сообщение
Там еще картинка наглядная
Покажите мне тогда про тайлы?
0
Модератор
2904 / 1763 / 179
Регистрация: 19.02.2011
Сообщений: 6,477
09.06.2014, 22:16 22
Тайловая графика
0
16 / 16 / 6
Регистрация: 04.03.2014
Сообщений: 160
09.06.2014, 23:07  [ТС] 23
Можно засунуть все объекты и игрока платформы в один спрайт и двигать спрайт, таким образом можно будет посмотреть нынешние координаты платформы. Но как мне двигать вместе с платформой и персонажа, иначе он просто стоит на месте, ведь движется вся платформа.
0
bus
34 / 34 / 3
Регистрация: 17.05.2014
Сообщений: 144
09.06.2014, 23:46 24
MrDead, я так и делал, скомпоновал все кубики в большие блоки-спрайты и эти большие блоки поместил в один, общий для всех блоков спрайт-контейнер. Затем у персонажа я сделал четыре состояния, вперед, назад, вправо и влево и по нажатию кнопки запускал нужный метод соответствующий состоянию. Так же в персонаже я переопределил геттеры, которые возвращали свойство созданное в персонаже и меняющиеся в методах вперед++, назад--. Тут я сделаю акцент, чтобы Вы поняли принцип - когда я запрашиваю координаты персонажа,
то возвращает мне координаты (0, 0), хотя персонаж стоит по центру сцены, так-как сеттеры я ему оставил правильные. И вот получается, что стоит он по центру, а координаты (0, 0) и сам он у меня не ходит! В методах вперед и назад я просто увеличиваю или уменьшаю свойство, которое возвращается через геттер. Персонаж на месте, а координаты меняются так, как-будто он ходит.
В методах разворота я вращал скин персонажа, который так же находился в классе персонаж.
Затем я создал класс "контроллер мира", в который передал ссылку на класс "персонаж" и класс "контейнерСтен", который предварительно я тоже выставил по координатам так, как мне было нужно.
Затем в методе ините я определил вектор разности между персонажем и контейнером со стенами, который
сравнивал координатные пространства.
А вот уже потом, когда я нажимал на кнопку идти вперед, то первым делом вызывал метод в контроллере мира update():Boolean, в котором делал следующее -
1) находил вектор разности между персонажем и стенами.
2) делал его зеркальное отражение ( это важно для правильного движения стен )
3) прибавлял к этому вектору шаг, который делает персонаж за один кадр.
4) проверял на столкновение ( получилось, что на шаг вперед ) и если там стена, то я возвращал false
5 ) если столкновения не было, то я прибавлял этот вектор к координатам контейнера со стенами.

И вот, возвращаемся в метод обработчик ентерФраме из которого я и вызывал метод update():Boolean.
Если мне возвращалось false, то я прерывал выполнение кода, если true, то я вызывал соответствующий метод
у объекта персонажа.

То есть, я нажал вперед, проверил может ли персонаж идти, если может то я двигал контейнер, а затем двигал персонажа, если же персонаж не мог идти я прерывал код.

Но это неправильно!!! Таким способом можно проверять контейнер даже без массива, hitTestPoint проверяет и на пустоту и на рамку и если бы была одна точка, то было бы все лучше не придумаешь!
Но точек нужно ооочень много! И сколько бы я не делал у меня все равно получалось провалить персонаж.

Чтобы его вернуть, это уже нужно возвращаться к массиву со всеми стенами и и там искать с какой именно он столкнулся, узнавать его размеры и высчитывать каждую его сторону как прямую, затем искать с какой именно прямой он пересекся ( это затратно ), на сколько пересекся...
И вот тут у меня и началась заминка из-за которой я в итоге снес весь код и в бешенстве начал себя оправдывать, что голова другим забита
Если честно, то я не делал его возврата после проваливания, так-как в голове не мог решить следующие шаги.
Если бы я нашел этот вектор возврата, то из мира не мог бы переместить персонажа, так-как он мог быть повернут, а миру нельзя знать как повернут персонаж и стенам тоже, так-как им пофигу какой ты стороной врезался им нужно тебя лишь оттолкнуть...................
И вот это я не мог решить, хотя сейчас сижу и угараю, так-как затупил ужасно....
Мне же не персонажа нужно было двигать, а стены А стены, как раз подпадают под законы мира и там даже поворот бы высчитывать не нужно было, вектор то остался, нужно было лишь вычесть из вектора вектор, а потом отнять или прибавить к координатам контейнера со стенами.
0
09.06.2014, 23:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2014, 23:46
Помогаю со студенческими работами здесь

Столкновение
if ((obj1.x + obj1.width &gt;= obj2.x) &amp;&amp; (obj1.x &lt;= obj2.x + obj2.width)) XColl = true; if ((obj1.y...

Столкновение
Здравствуйте. У меня возникла проблема. Я хочу сделать так чтобы при столкновение он как бы...

столкновение
Ф ребята, я вот хочу написать примитивную игру, типа гонки(так сказать) на С++, но никак не могу...

Столкновение
Есть несколько предметов. Я одел на каждый BoundingBox и на обьект которым я управляю. Только вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru