Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Падение: Закапываюсь!   Найти похожие ветки 

 
Маздай   (2005-06-27 12:41) [0]

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


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

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


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

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


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

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


 
cyborg ©   (2005-06-27 20:29) [4]


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

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


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

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


 
cyborg ©   (2005-06-27 20:33) [6]

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


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

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


 
cyborg ©   (2005-06-27 20:35) [8]


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

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


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

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

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

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


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

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


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

угу. Пасиб!


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

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


 
cyborg ©   (2005-06-27 21:30) [13]

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


 
Omar2002 ©   (2005-06-27 21:30) [14]

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

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


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

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


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

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;


 
Green_Templar ©   (2005-06-28 00:00) [17]

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


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

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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
2-1129801370
webpauk
2005-10-20 13:42
2005.11.13
Рисунок поверх всего


14-1129839644
vagra
2005-10-21 00:20
2005.11.13
Офигеть!


14-1130082809
Layner
2005-10-23 19:53
2005.11.13
Господа, помогите отправить SMS в Киев (38 067 777xxxx)


4-1126330868
Agile
2005-09-10 09:41
2005.11.13
DllProc вопрос


2-1129575723
ctokas
2005-10-17 23:02
2005.11.13
90 DEC в 90HEX