forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Колизии на тайловой карте. (http://forum.boolean.name/showthread.php?t=7548)

Ende 02.01.2009 14:13

Колизии на тайловой карте.
 
С НОВЫМ ГОДОМ!! У меня вопрос, друзья, подскажите, каким образом мне сделать коллизии на тайловой карте?? Просто тупо перебирать список с тайлами и искать координату, которая сколлизилась, ну не знаю - по-моему это не оптимально. Как сделать правильно??

jimon 02.01.2009 14:43

Ответ: Колизии на тайловой карте.
 
смотря что нужно, если нужно узнать в какой клетке находится заданная точка то стоит воспользоватся математическим методом - те каждая клетка тайла описывает какую-то область точек, если поразмышлять над формулами которые генерируют сетку тайла то можно очень просто сделать функцию которая просто будет возращать номер тайла из заданных 2д координат, если надо сделать коллизии между обьектами - думаю стоит использовать деревья для разбивки тайловой карты и узнаем с какими обьектами нужно проверять коллизии для заданого

Ende 03.01.2009 14:35

Ответ: Колизии на тайловой карте.
 
У меня есть тип игрока TPlayer, есть тайловая карта (список с тайлами), есть тип тайла TBRICKTILE. В этом типе есть метод Update, где проверяется, не столкнулся ли игрок с тайлом TBRICKTILE. Делается это примерно вот так вот :

Код:

Method update()
                For p:TPlayer = EachIn Gamelist
                If p.x<x+64  And p.x+64>x And y >= p.y-1 Then g=0 Else g=1
                Next
endmethod()

g - переменная гравитации.

Не работает.. Я что-то делаю не так или совсем не в ту сторону копаю??

jimon 03.01.2009 14:54

Ответ: Колизии на тайловой карте.
 
к примеру ты имеешь 2d масив с тайлами, координаты каждого тайла :
Код:

xmin = xpos * 64
xmax = (xpos + 1) * 64
ymin = ypos * 64
ymax = (ypos + 1) * 64

где xpos,ypos это координаты в масиве

собсно имея x,y игрока мы можем найти координаты тайла в масиве
и проверяем коллизию игрока только с етим тайлом и\или с тайлами которые его окружают

dimanche13 03.01.2009 20:35

Ответ: Колизии на тайловой карте.
 
Код:

xmin = xpos / 64
xmax = (xpos + width) / 64
ymin = ypos / 64
ymax = (ypos + height) / 64

я думаю, так надо, если уж на то пошлО. поправился, там деление...

jimon 03.01.2009 20:46

Ответ: Колизии на тайловой карте.
 
dimanche13
тайловая клетка может занимать несколько клеток в масиве ?

Ende 05.01.2009 13:48

Ответ: Колизии на тайловой карте.
 
Спасибо за советы и ответы, я исправил, сделал немного по-другому и тут еще одна проблема появилась.. Я написал вот это в методе обновления игрока:

Код:

        For l:Tlevel = EachIn Levellist
                If l.map[ytile+1,xtile] =1 Then g=0 Else g=1
                Next

ytile, xtile - тайловые координаты игрока, вычисляется xtile=x/64, ytile=y/64
Возникла проблемка иного рода.. Теперь когда игрок двигается вправо все происходит нормально, есть коллизия, падает куда надо, но если игрок двигается влево то он начинает падать раньше, чем это нужно.. Примерно на одну клетку.. Вот так вот.. Как можно это исправить??

**Извините, уже нашел решение проблемы в смещении координат, всем спасибо))**


Часовой пояс GMT +4, время: 18:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot