![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Падение: Закапываюсь! [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 тоже много полезного...