Как сделать относительное перемещение?
| |
tifaso | Дата: Суббота, 12 Мая 2012, 16:36 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Вроде бы и вопрос не такой сложный, но что то не идёт ничего в голову. Короче так есть два обьекта двери. Одна для входа, а другая для выхода. То есть у меня в игре бонусная комнатка. Таких комнат несколько по всей игре чтобы не делать кучу дверей я хочу сделать проверку. Когда игрок подходит к двери на уровне его должно переместить относительно двери в секретной комнатке, но не на саму дверь, а на 32 больше по оси Х если в этой позиции стоит блок то на 32 меньше по оси Х. и так же на вторую дверь при выходе из комнаты.
У меня не получается такую вещь написать. Уже часа два сижу над этим голову ломаю. Пожалуйста сделайте примерчик или скрипт дайте! Лучше было бы сделать на кнопках (либах) мне так легче разбираться, но и в коде тоже можно.
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
|
|
| |
stinger | Дата: Суббота, 12 Мая 2012, 17:09 | Сообщение # 2 |
участник
Сейчас нет на сайте
| В объект игрока,наверное в событие столкновения с дверью: Code if place_free(obj_door.x+32,obj_door.y){x=obj_door.x y=obj_door.y} else {x=obj_door.x-32 y=obj_door.y}
|
|
| |
tifaso | Дата: Суббота, 12 Мая 2012, 19:07 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Погоди, а как проверить обьекты блока чтобы игрок не попал на блок. Ведь мне ещё и это нужно. Тоесть нужна проверка того места куда мы перемещаем игрока. Если в относительной позиции двери х 32 (куда мы перемещаем игрока) есть блок, то нужно переместить на позицию х -32 относительно двери.
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
Сообщение отредактировал tifaso - Суббота, 12 Мая 2012, 19:10 |
|
| |
FadeBaker | Дата: Суббота, 12 Мая 2012, 19:28 | Сообщение # 4 |
JavaSE Game Developer
Сейчас нет на сайте
| Quote (tifaso) Если в относительной позиции двери х 32 (куда мы перемещаем игрока) есть блок, то нужно переместить на позицию х -32 относительно двери. Ты сам сказал нужный тебе алгоритм. Думаю, написать по нему код, не так сложно.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
tifaso | Дата: Суббота, 12 Мая 2012, 19:55 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Quote (Fade) Ты сам сказал нужный тебе алгоритм. Да сказал, но меня немного не так поняли! Quote (Fade) Думаю, написать по нему код, не так сложно. Для кого как?
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
|
|
| |
TimKruz | Дата: Суббота, 12 Мая 2012, 21:07 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Quote (tifaso) Погоди, а как проверить обьекты блока чтобы игрок не попал на блок. Ведь мне ещё и это нужно. Тоесть нужна проверка того места куда мы перемещаем игрока. Если в относительной позиции двери х 32 (куда мы перемещаем игрока) есть блок, то нужно переместить на позицию х -32 относительно двери. Ну так stinger это же написал: Quote (stinger) if place_free(obj_door.x+32, obj_door.y) { x=obj_door.x+32; y=obj_door.y; } else { x=obj_door.x-32; y=obj_door.y; } Если позиция (obj_door.x+32; obj_door.y) свободна, то перемещаем в позицию (obj_door.x+32; obj_door.y), иначе перемещаем в позицию (obj_door.x-32; obj_door.y). Можно, конечно, проверять свободность позиции с координатой -32, но это лишнее, если выхода только два и +32 уже занят - позиция -32 обязана быть свободна, иначе игрок так и так застрянет.
Сообщение отредактировал TimKruz - Суббота, 12 Мая 2012, 21:09 |
|
| |
tifaso | Дата: Воскресенье, 13 Мая 2012, 08:13 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| TimKruz, но что то здесь не то. Игрока кидает в позицию obj_door.x-32; не зависимо от того есть ли там блок. Нужно сделать сперва проверку наличия блока, а затем уже перемещать. В этом же коде про блок даже не упоминается.
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
|
|
| |
GameMix | Дата: Воскресенье, 13 Мая 2012, 09:21 | Сообщение # 8 |
старожил
Сейчас нет на сайте
| Code if !position_meeting(obj_door.x-32,y,object1) // если слева нет блока x = obj_door.x-32 // влево else // иначе if !position_meeting(obj_door.x+32,y,object1) // если справа нет блока x = obj_door.x+32 // вправо else // иначе if !position_meeting(x,obj_door.y-32,object1) // если сверху нет блока y = obj_door.y-32 // вверх else // иначе if !position_meeting(x,obj_door.y+32,object1) // если снизу нет блока y = obj_door.y+32 // вниз Этот код проверяет наличие блоков в четырех направлениях относительно двери и перемещает объект в свободную позицию.
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
tifaso | Дата: Воскресенье, 13 Мая 2012, 15:00 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| GameMix, вроде бы всё под свою игру прикрутил, но тоже самое кидает в позицию obj_door.x-32 и всё! Может примерчик сделаешь? Возможно я чего то не учитываю?
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
|
|
| |
TimKruz | Дата: Воскресенье, 13 Мая 2012, 15:31 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Quote (tifaso) TimKruz, но что то здесь не то. Игрока кидает в позицию obj_door.x-32; не зависимо от того есть ли там блок. Нужно сделать сперва проверку наличия блока, а затем уже перемещать. В этом же коде про блок даже не упоминается. Quote (tifaso) GameMix, вроде бы всё под свою игру прикрутил, но тоже самое кидает в позицию obj_door.x-32 и всё! Может примерчик сделаешь? Возможно я чего то не учитываю? А, возможно, у тебя стена-объект рядом с дверью стоит и распознаётся как твёрдый объект... Кажется, в GM есть что-то типа фоновых картинок, вот и используй её вместо объектов... Либо у тебя дверь слишком широкая, >32 пикселя, проверь это.
|
|
| |
tifaso | Дата: Воскресенье, 13 Мая 2012, 15:53 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| Quote (TimKruz) А, возможно, у тебя стена-объект рядом с дверью стоит и распознаётся как твёрдый объект... Именно так и есть. Quote (TimKruz) Либо у тебя дверь слишком широкая, >32 пикселя И это тоже верно, но изменить это нельзя так как это так задумывалось. Менять я ничего с обьектами не буду, если что тронуть тогда вся игра развалится. Нужно что то другое с дверью искать.
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
Сообщение отредактировал tifaso - Воскресенье, 13 Мая 2012, 15:56 |
|
| |
stinger | Дата: Воскресенье, 13 Мая 2012, 18:36 | Сообщение # 12 |
участник
Сейчас нет на сайте
| Здесь зависит еще,где центр объекта,по центру картинки или в углу.Можно изменять 32 на другое число,чтобы проверялось место справа от картинки.
|
|
| |
tifaso | Дата: Воскресенье, 13 Мая 2012, 18:52 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| Quote (stinger) Здесь зависит еще,где центр объекта,по центру картинки или в углу.Можно изменять 32 на другое число,чтобы проверялось место справа от картинки. А про центр обьекта я вот что то не пойму.
Вот исходник: hyougo.gmk.zip
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
Сообщение отредактировал tifaso - Воскресенье, 13 Мая 2012, 19:14 |
|
| |
TimKruz | Дата: Воскресенье, 13 Мая 2012, 19:19 | Сообщение # 14 |
старожил
Сейчас нет на сайте
| tifaso, вот смотри простой пример, только вот формат почему-то gm81: http://rghost.ru/38063821. А стены (те, которые на заднем плане) вокруг двери придётся сделать фоном. И смещение размером по ширине двери. Если у тебя дверь 40 пикселей в ширину - то и смещение должно быть не 32, а 40. Quote (tifaso) Незнаю даже, а может стоит сделать несколько дверей каждую настроить индивидуально и всё без проблем. Можно сделать какой-нибудь универсальный приём, но над этим придётся подумать. Я в примере сделал обработку для каждой двери отдельно (каждая дверь - отдельный объект), но, конечно, это не рационально. Quote (GameMix) Этот код проверяет наличие блоков в четырех направлениях относительно двери и перемещает объект в свободную позицию. Там у тебя только одна координата изменяется...
|
|
| |
tifaso | Дата: Воскресенье, 13 Мая 2012, 19:41 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| Что то я непойму никак этот пример. Мне то для платформера нужно, а там ты сам понимаешь всё должно обязательно закрыто блоками чтобы игрок куда не надо не попадал. Добавлено (13.05.2012, 19:41) --------------------------------------------- Короче легче будет сделать индивидуально каждую дверь.
Мой сайт: http://tifaso.narod.ru/ Мои проекты: Cерия игр Hyougo; Медвежонок Кит; Argo Player; Text Manager
|
|
| |
TimKruz | Дата: Воскресенье, 13 Мая 2012, 20:06 | Сообщение # 16 |
старожил
Сейчас нет на сайте
| Quote (tifaso) Мне то для платформера нужно, а там ты сам понимаешь всё должно обязательно закрыто блоками чтобы игрок куда не надо не попадал. Да я сразу понял, что для платформера. Но ведь эти блоки не со всех сторон будут, а только один снизу, один справа или слева, и, возможно, один сверху. Вообще-то я думал, что проверка нужна только для того, чтобы игрок не застрял в каком-нибудь проходящем мимо этой двери NPC... Переход можно сделать по нажатию пробела, если игрок стоит рядом с дверью... (есть функция проверки на расстояние между объектами)
*** Quote (tifaso) Короче легче будет сделать индивидуально каждую дверь. Возможно, так будет легче... Если NPC не будут ходить, пока игрок не телепортируется в дверь... Иначе он может просто застрять в NPC.
Сообщение отредактировал TimKruz - Воскресенье, 13 Мая 2012, 20:08 |
|
| |
|