Срабатывание коллизии от прикосновения
| |
GameDev2 | Дата: Вторник, 31 Марта 2015, 01:10 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Нужна помощь программиста с куском кода...
У меня есть код:
Код if a=&h01 then 'если объект столкнулся (вошел в него) с другим объектом, то происходит действие dir=4 'включается нужное мне действие - реакция на столкновение. endif
Мне нужно сделать так, чтобы была эта же реакция, однако чтобы объект при этом выполнял действие просто от прикосновения, а не после того, как войдёт в него.
Смотрите рисунок 3:
Как переделать коллизию так? Помогите!
Сообщение отредактировал GameDev2 - Вторник, 31 Марта 2015, 01:11 |
|
| |
Ordan | Дата: Вторник, 31 Марта 2015, 03:14 | Сообщение # 2 |
Главный зомби
Сейчас нет на сайте
| делай цикл сравнения позиций объектов и их размеров вот самый простецкий пример x1 - позиция объекта 1 xx - ширина объекта 1 тоже самое и с объектом два ну и тоже самое с высотой ну а после сравниваешь их координаты с учетом ширины и высоты, смотришь есть ли соприкосновение и тд.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
Мои проекты ТЫК Мои видяхи на ютубэ ТЫК
Если ты споришь с идиотом, вероятно тоже самое делает и он.
|
|
| |
EfimovMax | Дата: Вторник, 31 Марта 2015, 03:20 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
| Ты не учитываешь ширину/высоту объектов, поэтому действие происходит только когда их координаты равны. Для столкновения как на 3 картинке что-то типа:
Код If Box1.Left+Box1.Width=Box2.Left Then действие End If
Текущий проект: The Experiment ☭
Выпущенные проекты Steam: Princess.Loot.Pixel.Again Princess.Loot.Pixel.Again x2 Dungetris
Сообщение отредактировал EfimovMax - Вторник, 31 Марта 2015, 03:26 |
|
| |
GameDev2 | Дата: Вторник, 31 Марта 2015, 16:37 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Всё не то.
Код Box1.Left+Box1.Width=Box2.Left Не работает такой костыль.
Цитата Ordan ( ) делай цикл сравнения позиций объектов и их размеров вот самый простецкий пример x1 - позиция объекта 1 xx - ширина объекта 1 тоже самое и с объектом два ну и тоже самое с высотой ну а после сравниваешь их координаты с учетом ширины и высоты, смотришь есть ли соприкосновение и тд. Ну и как это сделать? При том, что мне нужна стена, вдоль которой можно было бы пройти в притирочку, а не тормоз всего, что касается.
Как сделать стену, твёрдый объект, чтобы объект упирался в него и не проходил?
Есть куски кода, ссылки на точные статьи?
|
|
| |
EfimovMax | Дата: Вторник, 31 Марта 2015, 17:18 | Сообщение # 5 |
заслуженный участник
Сейчас нет на сайте
| Всё то. И это не костыль, это вполне себе нормальное решение. Смотри в моей подписи проект - он написан на бейсике и коллизии там реализованы этим способом. У тебя объекты на сколько пикселей сдвигаются при движении? Если более, чем на 1, то
Код If Box1.Left+Box1.Width>=Box2.Left Then ' не двигаемся End If
Текущий проект: The Experiment ☭
Выпущенные проекты Steam: Princess.Loot.Pixel.Again Princess.Loot.Pixel.Again x2 Dungetris
Сообщение отредактировал EfimovMax - Вторник, 31 Марта 2015, 17:21 |
|
| |
GameDev2 | Дата: Вторник, 31 Марта 2015, 19:39 | Сообщение # 6 |
почетный гость
Сейчас нет на сайте
| EfimovMax, Нет, не подходит. Во-первых, у меня игра типа Пакмена, т.е. персонаж может подойти к стене с любой из 4-ех сторон, а она должна быть твёрдой и не пропускать его. Вид сверху как бы. И объект не должен тормозиться, если он просто в доль стены идёт, а не уперается в него.
Во-вторых мне нужно его не просто остановить один раз, а остановить его и не давать ему пройти сквозь объект при повторном движении в ту же сторону, сколько бы не нажимали туда. Т.е. чтобы это была реально стена.
Вот GM это делает легко: просто ставится галочка на то, что объект твёрдый и всё. А тут я убеждаюсь, что Basic убог настолько, что я даже не могу понять как сделать твёрдый объект. Наверное, нужно проштудировать пару книг и нагородить пару килобайт кода.
Сообщение отредактировал GameDev2 - Вторник, 31 Марта 2015, 19:39 |
|
| |
Ordan | Дата: Среда, 01 Апреля 2015, 02:11 | Сообщение # 7 |
Главный зомби
Сейчас нет на сайте
| for I := 1 to Length(Пеший)-1 do begin x:=Перс[r].xm; y:=Перс[r].ym;
xp:=Пеший[i].xm; yp:=Пеший[i].ym;
ширина перса 64, высота 128, пешеход 64/64
//if (Пеший[i].Тип='ИнтерьерБ') then if (((xp+45>=x)and (xp+45<x+64))or ((xp+0>=x)and (xp+0<x+64))) and(yp+0>=y)and (yp+0<(y)+128) and (Пеший[i].Смерт=false) then begin ******
вот превосходно работающий код, при движении делается проверка, если проверка успешна то пешеход помирает, если нет значит рядом нет пешеходов.
Цитата GameDev2 ( ) А тут я убеждаюсь, что Basic убог настолько, что я даже не могу понять как сделать твёрдый объект. Готовые решения на чистом коде? Да ты шутишь, а то что ты не можешь это сделать то это вина не языка, а твоей неопытности так что не надо нам тут. Все делается обычным if с капелькой мозгов.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
Мои проекты ТЫК Мои видяхи на ютубэ ТЫК
Если ты споришь с идиотом, вероятно тоже самое делает и он.
|
|
| |
GameDev2 | Дата: Пятница, 03 Апреля 2015, 01:18 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| Ordan, я запутался в объектах, кто Пеший, кто Перс, кто Смерт, а что такое ИнтерьерБ. И не пойму, где чьи габариты.
Можете переделать код под 2 объекта?: 1 - стена, 2 - перс, которые как у меня представлены ASCII-символами &h01 и &h02 по 8x8 оба как в рогаликах. И как вообще сделать габариты (ширинаxвысота) спрайту - текстовому символу?
И ещё вопрос - это какая версия Бейсика, везде ли сработают такие громоздкие конструкции?
|
|
| |
Ordan | Дата: Пятница, 03 Апреля 2015, 02:11 | Сообщение # 9 |
Главный зомби
Сейчас нет на сайте
| GameDev2, это дельфи, но код практически универсальный. Хперса - координаты УПерса
ХСтены УСтены ширина высота 8
получаем условие для проверки столкновения, весьма топорное но работающее (ХСтены+0>=Хперса )and (ХСтены+0<Хперса +8) and (УСтены+0>=УПерса)and (УСтены+0<(УПерса)+8) Что мы видим, если ХСтены больше или равно ХПерса, но меньше чем ХПерса+его ширина, в то же время стена на примерно одинаковом уровне, то происходит столкновение. Однако тут идет проверка столкновения слева направо, что бы делалсь проверка еще и на справа на лево добавляет такой кусок (ХСтены+8>=Хперса) and (ХСтены+8<Хперса +16) тут все так же как в предыдущем только плюсуем ко всему ширину стены в итоге должно получиться что то типо этого
if (((ХСтены+8>=Хперса) and (ХСтены+8<Хперса +16)) or ((ХСтены+0>=Хперса )and (ХСтены+0<Хперса +8))) and (УСтены+0>=УПерса)and (УСтены+0<(УПерса)+8) then Вот довольно простой способ реализации проверки столкновения. Применял в гонке. Но это конечно топор) Можно сделать все куда эффективнее, но и кода там будет огого.
Цитата недели: Из-за леса, из-за гор, кишки, месиво, хардкор. (Берсерк ТВ-2)
Мои проекты ТЫК Мои видяхи на ютубэ ТЫК
Если ты споришь с идиотом, вероятно тоже самое делает и он.
|
|
| |
vicmad | Дата: Пятница, 17 Апреля 2015, 12:17 | Сообщение # 10 |
постоянный участник
Сейчас нет на сайте
| Мне кажется нужно сначала делать проверку в какую сторону движеться перс (лево, право, верх, низ), циклом типа Select. В зависимости от направления, например "вправо", проверяем Х координату стены, если совпала с Х перса, проверяем У ну а дальше совпало/не совпало. Я делаю проверки колизий спрайтов ваще отмороженно - делаю массивы в которых хранятся все пиксели по Х и У объектов затем их сравниваю
|
|
| |
|