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