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

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

Падение: Закапываюсь! [Delphi, Windows]


Маздай ©   (2005-06-27 12:41:00) 

Пишу динамичную аркаду. Карта - матрица 64х48.
Скорость и координаты героя у меня: Real;
Но кодгда герой падает на пол с большой высоты заметно "вдавливание" в пол. А с суперпрыжками он даже может пролететь. Вроде надо сдвигать героя на пиксель, а потом проверять на полу ли он. Но скорость то реальная. И рассчёты будут Unreal'ные! Может кто сталкивался с подобной проблемой? Как он выходил из этой ситуаци?


Маздай   (2005-06-28 14:00:00) [1]

Понимаю. Можно оптимизировать это ограничением количества проверяемых точек (и ограничения скорости на всякий случай)


Kobik   (2005-06-28 12:43:00) [2]

Короче я как сделал:
Пол у меня задается тремя точками (x1,y)-(x2,y). Есть массив полов. Т.е. он не изначально задан, а забивается при загрузке карты.

Когда юнит падает, то берем прямую (x,y1)-(x,y2) , соответстенно по начальной и конечной координате. Потом проверяем ее на пересечение с полом. Если есть пересечение, то точнка пересечения и есть та точка, куда надо поставить юнита.

ээ.. как то криво написал :) Надеюсь основная мысль ясна.


Green_Templar   (2005-06-28 00:00:00) [3]

Короче, када скрины будут :) ? Сцылка не работает.


Маздай   (2005-06-27 22:03:00) [4]

procedure TPlayer.Process();
begin
 if not FloorUnder() then
   mY := mY + 0.03;

 ProcessPhys;

 X := X + Round(mX);
 Y := Y + Round(mY);
end;

procedure TPlayer.ProcessPhys();
begin
 if FloorUnder then
 begin
   if (mY > 0) then
   begin
     if (mY > 0) and (Moving = 0) then mX := 0;
     mY := 0;
   end;
   if Moving = 0 then mX := 0;
 end;

 if ((CheckPixel(X + 4, Y) = 1)
 or (CheckPixel(X + 4, Y + 9) = 1)
 or (CheckPixel(X + 4, Y + 18) = 1)
 or (CheckPixel(X + 4, Y + 27) = 1)
 or (CheckPixel(X + 4, Y + 29) = 1)) and (mX < 0) then
 begin
 mX := 0;
 end;

 if ((CheckPixel(X + 13, Y) = 1)
 or (CheckPixel(X + 13, Y + 9) = 1)
 or (CheckPixel(X + 13, Y + 18) = 1)
 or (CheckPixel(X + 13, Y + 27) = 1)
 or (CheckPixel(X + 13, Y + 29) = 1)) and (mX > 0) then
 begin
 mX := 0;
 end;
end;

function TPlayer.FloorUnder(): Boolean;
begin
 Result := (CheckPixel(X + 5, Y + 31) = 1) or (CheckPixel(X + 12, Y + 31) = 1);
end;

function CheckPixel(X, Y: Integer): Integer;
begin
 if (X < 0) or (Y < 0) or (X > MapX * 10) or (Y > (MapY + 1) * 10) then
 begin
   Result := -1;
   Exit;
 end;
 Result := Map[round(X * 0.1 - 0.4), round(Y * 0.1 - 0.4)];
end;


Маздай   (2005-06-27 22:01:00) [5]

Тока у меня матрица. Пол это обстрактное понятие. Это может быть возвышенность. при повышенной скорости игрок пролетит.


Omar2002   (2005-06-27 21:30:00) [6]

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

if PosPlayerY+PlayerHeight+Sdvig>PolY then
 PosPlayerY:=PolY-PlayerHeight;
else
 PosPlayerY+Sdvig;


cyborg   (2005-06-27 21:30:00) [7]

Показывай чего пробовал?


Маздай   (2005-06-27 21:06:00) [8]

Попробвал. Фигня полная. Игрок ускорятеся рывками! Так незя.


Маздай   (2005-06-27 20:58:00) [9]

угу. Пасиб!


cyborg   (2005-06-27 20:56:00) [10]

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


Маздай   (2005-06-27 20:41:00) [11]

Ну. Недолго подумав, что если координаты будут тоже Real, то не будет накапливатся недолёт. Скорость не просто будет "плавно" скачками увеличиваться, а с заметностью на движении.
Тока а если я прыгаю? :) Возможно тут ещё нужно будет даписать пару if ов. Но лучше сделать так:

for i:=0 to Полож(Trunc(Move)) do
begin
Двигаю на 1 и проверяй столкновение
end;

Тока не заработает. Функции котороя убирала бы минус вроде нет...


cyborg   (2005-06-27 20:35:00) [12]


> [7] Маздай   (27.06.05 20:33)

Не понял смысла сказанного.


Маздай   (2005-06-27 20:33:00) [13]

Понял... round(X-0.4) он и в африке round(X-0.4)
А никаких проблем с X, Y: UnReal(Integer); нет? Незаметно?


cyborg   (2005-06-27 20:33:00) [14]

Усечение до целого


Маздай   (2005-06-27 20:30:00) [15]

Вот это оперативность :)А что есть Trunc?


cyborg   (2005-06-27 20:29:00) [16]


>  [2] Маздай   (27.06.05 19:14)

Выход простой^
for i:=1 to Trunc(Move) do
begin
 Двигай на 1 и проверяй столкновение
end;
В Чебураторе у меня так сделано, с любой скоростью корректно ходит обходя углы.


Маздай   (2005-06-27 20:29:00) [17]

<img src= http://www.egiksfun.narod.ru/png.png>
Художник из меня кривой, но похоже писатель не лучше.


Маздай   (2005-06-27 19:14:00) [18]

А подумать?
Просто скорость у меня бывает > 1
И когда игрок смещается на два пикселя (moveY)
Происходит процедура проверки пола под ногами, и moveY := 0. Но вот герой уже успел влететь в пол на < moveY пикселей. Например на 1.


Ищущий   (2005-06-27 14:23:00) [19]

2D ? 3D ? OpenGl ? DelphiX ? ДР :)
 В любом случае CollisionDetection тебе поможет. на dtf есть неплохие статьи, на delphigfx.mastak.ru,gamedev тоже много полезного...


Наверх

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