Помощь: Столкновение со стеной
| |
123dima321 | Дата: Пятница, 31 Августа 2012, 10:28 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Допустим у меня есть в игре два персонажа А и Б Я создаю объекты стена1 и стена2
Как мне сделать такую функцию: Объект А при столкновении со стеной1 полностью останавливался, не застревал, и спокойно проходил сквось стену2. Объект Б при столкновении со стеной2 полностью останавливался, не застревал, и спокойно проходил сквось стену1.
Другими словами: Для объекта А стена1 ТВЕРДАЯ, стена2 МЯГКАЯ. Для объекта Б стена2 ТВЕРДАЯ, стена1 МЯГКАЯ.
Но самое главное, что мне нужно: Объект А находясь между стеной1 при нажатии влево и вправо, не менял спрайтов, сквозь стену2 проходил спокойно. Противоположные функции объекту Б.
У меня получается только сделать остановку объектов... Вот пример: Пример Кто не понял вопроса? Пишите...
Сообщение отредактировал 123dima321 - Пятница, 31 Августа 2012, 10:37 |
|
| |
ilgamer | Дата: Пятница, 31 Августа 2012, 14:26 | Сообщение # 2 |
Needle Games
Сейчас нет на сайте
| Обе стены должны быть не твердыми, но в столкновение с нужной для каждого героя пишете: move_contact_solid(direction,speed); speed=0;
|
|
| |
123dima321 | Дата: Пятница, 31 Августа 2012, 14:48 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| ilqamer, опробовал код, не подходит. При столкновении объект только останавливается.
|
|
| |
ilgamer | Дата: Пятница, 31 Августа 2012, 16:53 | Сообщение # 4 |
Needle Games
Сейчас нет на сайте
| попробуй:
move_contact_solid(direction,0); x = xprevious; y=yprevious;
|
|
| |
123dima321 | Дата: Суббота, 01 Сентября 2012, 08:15 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| Тоже самое(((
|
|
| |
Skmaestro | Дата: Суббота, 01 Сентября 2012, 09:01 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Скрипт написал для 1 персонажа, ты там разберешься! Можешь просто у второго изменить wall1 на wall2 в object2 step, и создай его еще конешно) http://rghost.ru/40130335 Если не справишся пиши сделаю и второй!
Помог поставь + Проект DeadWorldZ пока заморожен иными словами разрабатывается скрытно Skype: Skmaestro867
Сообщение отредактировал Skmaestro - Суббота, 01 Сентября 2012, 09:03 |
|
| |
123dima321 | Дата: Суббота, 01 Сентября 2012, 10:42 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| Хороший пример))) НО: Мне нужно чтобы все объекты были мягкими, и только при соприкосновении становились твердыми. Ну и после снова мягкими. Остановку объектов я и сам могу сделать. ВОТ САМОЕ ГЛАВНОЕ ЧТО МНЕ НУЖНО: Объект А находясь между стеной1 при нажатии влево и вправо, не менял СПРАЙТОВ... Аналогично между нижней и верхней стеной)))
|
|
| |
ress | Дата: Суббота, 01 Сентября 2012, 13:32 | Сообщение # 8 |
постоянный участник
Сейчас нет на сайте
| Quote (123dima321) Мне нужно чтобы все объекты были мягкими, и только при соприкосновении становились твердыми. Я не очень понял вопроса... Но вот, попробуй: if distance_to_object(стена)>1 then стена мягкая else стена твердая;
Я очень недоволен...
|
|
| |
hero564 | Дата: Суббота, 01 Сентября 2012, 15:43 | Сообщение # 9 |
Made in Ukraine
Сейчас нет на сайте
| 123dima321, не в правильном направлении движешься , что легче проверять мягкость\твердость всех стен в комнате или изменять мягкость\твердость двух обьёктов в игре?
|
|
| |
Saladin | Дата: Суббота, 01 Сентября 2012, 20:11 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Quote (ilgamer) x = xprevious; y=yprevious; Ответ прозвучал давным давно. Что вы тут обсуждаете до сих пор?
Анбаннэд. Хэлоу эгин =)
|
|
| |
123dima321 | Дата: Суббота, 01 Сентября 2012, 20:44 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| Да я и имел в виду эти 4 объекта: "А", "Б", "Стена1", "Стена2".
У меня сейчас в игре так: "А" при столкновении со "Стена2" просто останавливается. "Б" при столкновении со "Стена1" тоже просто останавливается.
"А" при столкновении со "Стена2":
Объект "А" остановился, НО МНЕ НУЖНО: ЧТОБЫ КОГДА Я НАЖИМАЮ вверх, влево; ОБЪЕКТ "А" НЕ ДВИГАЛСЯ ВООБЩЕ, не менял спрайтов.
ТО ЕСТЬ так-же как и при столкновении с простой твердой стеной:
А у меня спрайты меняются(((
Короче, кратко: "A" при столкновении со "Стена2", СТЕНА2 СТАНОВИЛАСЬ ТВЕРДОЙ, SOLID. (но для "Б" оставалась мягкой).
ЕСЛИ СЛИШКОМ НЕПОНЯТНЫЙ ВОПРОС, то вот пример который на скринах: Скачать
|
|
| |
ilgamer | Дата: Вторник, 04 Сентября 2012, 11:23 | Сообщение # 12 |
Needle Games
Сейчас нет на сайте
| Как сказал hero564: "Не в том направлении мыслишь". Придумай обходной путь, ибо зависнешь на этом!
Исправляю... Лови: Скачать
Короче, сделал только для A. Хорошо закомментировал. Думаю с Б сам справишься. И еще, я случайно сделал проверку для стен 1, а не для 2. Измени их в комнате или поменяй именами эти стены
Всегда есть обходные пути!
P.S. Бросай делать игры кнопками. Код позволяет делать больше. Ты потому и завис.
И еще... Если я правильно представил себе игру которую ты хочешь сделать, то предлагаю запрещать двигать героя пока он не столкнулся со стеной.
Немного дополнишь мой код...
Code if(keyboard_check(ord('W'))) заменишь на Code if(keyboard_check(ord('W')) && place_meeting(x,y+1,obj_wall1))
И так далее для каждого нажатия проверяешь, есть ли стена в нужном направлении или нет:
Code else if(keyboard_check(ord('A')) && place_meeting(x+1,y,obj_wall1)) Code else if(keyboard_check(ord('S')) && place_meeting(x,y-1,obj_wall1)) Code else if(keyboard_check(ord('D')) && place_meeting(x-1,y,obj_wall1))
P.P.S. Если тебе нужно менять спрайт, то используй sprite_index; Как в Create объекта A, только поставь в Step там где нужно.
То есть, когда нажата W, нужно проверять, есть ли стена сверху: Code if (!place_meeting(x-1,y,obj_wall1)) then sprite_index = spr_A_left; То есть стены нет, и мы меняем спрайт на нужный. А в конце Step добавь строку которая будет менять спрайт на "Герой стоит": Code sprite_index = spr_A;
Удачи с игрой!
Сообщение отредактировал ilgamer - Вторник, 04 Сентября 2012, 12:29 |
|
| |
Skmaestro | Дата: Вторник, 04 Сентября 2012, 19:47 | Сообщение # 13 |
участник
Сейчас нет на сайте
| хм, а разница то какая? и шрифт поставь пож ПОБОЛЬШЕ!, у меня зрение не очень! Физики то нету, а если нету то там как-то на плевать перед или во время или после
Помог поставь + Проект DeadWorldZ пока заморожен иными словами разрабатывается скрытно Skype: Skmaestro867
|
|
| |
Фломастер | Дата: Вторник, 04 Сентября 2012, 20:20 | Сообщение # 14 |
участник
Сейчас нет на сайте
| Quote (Skmaestro) хм, а разница то какая? и шрифт поставь пож ПОБОЛЬШЕ!, у меня зрение не очень! Есть кнопочки Ctrl, C и V. Догадайся с трех раз, как их использовать.
|
|
| |
TLT | Дата: Среда, 05 Сентября 2012, 03:28 | Сообщение # 15 |
Сейчас нет на сайте
| Quote (123dima321) Объект "А" остановился, НО МНЕ НУЖНО: ЧТОБЫ КОГДА Я НАЖИМАЮ вверх, влево; ОБЪЕКТ "А" НЕ ДВИГАЛСЯ ВООБЩЕ, не менял спрайтов.
Ну деактивируй его, замени на макет, например.
Дао, выраженное словами, не есть истинное Дао.
|
|
| |
ilgamer | Дата: Четверг, 06 Сентября 2012, 09:34 | Сообщение # 16 |
Needle Games
Сейчас нет на сайте
| я все еще делаю тебе рабочий пример, 123dima321. Шрифт изменил чтобы не читал, поэтому не ругайтесь на него, я в каком-то роде виноват. Короче, движение реализовал, не застревают и т.д. но уже забыл в чем были баги, поэтому как проверю код и программу в целом, сразу дам с четким описанием. Мне когда-то не помогали. -_-
|
|
| |
123dima321 | Дата: Четверг, 06 Сентября 2012, 11:51 | Сообщение # 17 |
почетный гость
Сейчас нет на сайте
| Главная проблема которую не удается исправить: "A" при столкновении со "Стена2", СТЕНА2 СТАНОВИЛАСЬ ТВЕРДОЙ, SOLID. (но для "Б" оставалась мягкой).
|
|
| |
ilgamer | Дата: Суббота, 08 Сентября 2012, 06:53 | Сообщение # 18 |
Needle Games
Сейчас нет на сайте
| Короче, обе стены твердые. И суть не в том, чтобы менять их свойства, а в том, чтобы проверять столкновение. Если я Объекту "А" не говорил втыкаться носом в стену 2, то он этого делать не будет, если объекты не твердые. Если они твердые, то он в ней застрянет, ибо назначая это свойство объекту, вы обрекаете его подчиняться законам "псевдо-" физики.
Короче, лови работающий пример: Клац
Я убрал твои спрайты потому что ни были ужасны. Код у объектов практически одинаковый. Единственное что изменилось для объекта "Б" это столкновение с другой стеной и проверка клавиш: мы проверяем нажатие с трелок (vk_left, vk_right и т.д.). Что тебе нужно сделать:
Во-первых, поставить свои спрайты. В коде, в структуре Switch изменить смену спрайтов на необходимые. Во-вторых, изменить спрайт при столкновении со стеной (равносильно остановке). Сделай это в столкновении со стеной и стеной 1/2. Там есть строка: Code sprite_index = spr_stand;
В общем-то все. Если есть вопросы, спрашивай! И удачи!
Сообщение отредактировал ilgamer - Суббота, 08 Сентября 2012, 07:00 |
|
| |
123dima321 | Дата: Суббота, 08 Сентября 2012, 17:10 | Сообщение # 19 |
почетный гость
Сейчас нет на сайте
| ilgamer, Спасибо за помощь))) Позже начну внедрять твой движок в свою игру...
Сообщение отредактировал 123dima321 - Суббота, 08 Сентября 2012, 17:12 |
|
| |
ilgamer | Дата: Понедельник, 10 Сентября 2012, 08:40 | Сообщение # 20 |
Needle Games
Сейчас нет на сайте
| Движок?) Хах))
|
|
| |
|