Пятница, 22 Ноября 2024, 17:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Срабатывание коллизии от прикосновения
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.
В зависимости от направления, например "вправо", проверяем Х координату стены, если совпала с Х перса, проверяем У ну а дальше совпало/не совпало.
Я делаю проверки колизий спрайтов ваще отмороженно - делаю массивы в которых хранятся все пиксели по Х и У объектов затем их сравниваю
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг