Форум: "Игры";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизПадение: Закапываюсь! Найти похожие ветки
← →
Маздай (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.054 c