Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Точные коллизии спрайтов


Олег ©   (2004-03-30 01:35:00) 

Есть спрайт, который должны падать, если он не находится на другом спрайте. У него есть переменная, которую при обработке (в игровом лупе) я увеличиваю, а затем вычитаю из Y координаты спрайта - это и есть падение. Вот такая у меня созрела проблема: при большом значении этой переменной спрайт пролетает сквозь другие маленькие спрайты. Как сделать нормальную проверку столкновений? Была идея попиксельно проверять наличие спрайтов по Y координате между прежней и новой позициями, но ведь это медленно. Не подскажете, есть ли какой алгоритм?


cyborg   (2004-03-31 10:31:00) [1]

А ты не почти так делай, а так, и пропусков не будет.

Например за ход тебе нужно сдвинуть вниз на 20 пикселей, за один кадр делаешь проверку 20 раз, смещая спрайт на пиксель вниз за проход.


Олег   (2004-03-31 02:07:00) [2]

cyborg
Я ж в последнем сообщ. написал что так и делаю, прочти


cyborg   (2004-03-30 10:23:00) [3]


> когда Delta будет например 30, а Y спрайта 500, то 500 -
> 30 = 470.

Проверяй столкновение Delta раз прибавляя по одному пикселю смещение.


Олег   (2004-03-30 03:11:00) [4]

Например игрко спрыгнул с земли, я проверяю коллизию - ее нет, значит увеличиваю Дельту, вычитаю ее из вертикального положения игрока. Игрок летит вниз, набирая скорость. И допустим Дельта накопилась на 100. Значит при след. обработке и спущу игрока на 100 пискелей. А вдруг между текущей поз. и следующей не будет пусто? Если где то посередине будет палка высотой в 20 пикселей, на которрую можно встать? Если я сразу спущу игрока на 100 пекс, то пролечу сквозь палку. Надо мне как то проверять наличие палок в воздухе :) Если делать чтото вроде for i:=CurrentPos to CurrentPos+Delta do CheckCollision, то для каждого пикселя (по вертикали) придется искать столкновения, а это медленно, ведь спрайтов в игре полно, и все нужно таким образом проверять


Thor   (2004-03-30 02:35:00) [5]

либо я тупой, либо у тебя русский как у меня китайский.
по нормальному объясни, что тебе нужно?
просто посчитать коллизию спрайтов или как?
я из-за странных окончаний первого поста не совсем понимаю задумку.
что значит

> У него есть переменная, которую при обработке (в игровом
> лупе) я увеличиваю, а затем вычитаю из Y координаты спрайта
> - это и есть падение


???
что-то типа положения спрайта игрока на карте?
т.е. если игрок находится на уровне земли, потом прыгает, потом встает на другой уровень и т.п. что ли?
давай говорить предметно, а то фигня получается.


Олег   (2004-03-30 02:05:00) [6]

А зачем здесь код? Все уже сказано. Что то вроде этого:

procedure Proccess;
 ...
 For i:=0 To Sprites-1 Do begin
   ...
     With Sprite(i) Do begin
       Delta:=Delta+0.2;
       Y:=Y-Delta;
     end;
   ...
 end;
 ...
end;


Ничего интересного. Мне вот что важно: когда Delta будет например 30, а Y спрайта 500, то 500 - 30 = 470. И если там окажется спрайт высотой в 20 пикс. на координате 495, то тот спрайт, который сейчас падает, просто пролетит мимо, не столкнувшись


Thor   (2004-03-30 01:41:00) [7]

а код будут телепаты ((с) - не мое) узнавать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо