Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
2-1130163180
Zoostal
2005-10-24 18:13
2005.11.13
Проблема с IBX


2-1129558566
Dush
2005-10-17 18:16
2005.11.13
inherited


14-1129167538
pazitron_brain
2005-10-13 05:38
2005.11.13
Секрет увеличения производительности Windows.


5-1108464410
sau
2005-02-15 13:46
2005.11.13
TreeView и ActiveX


2-1130228732
syte_ser78
2005-10-25 12:25
2005.11.13
Access violation





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский