Форум: "Игры";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизDelphiX, DoMove, DoCollision Найти похожие ветки
← →
Jus (2004-10-05 06:35) [40]Megabyte-ceercop © (05.10.04 06:11) [39]
> Draw;
> Скакать не будет, потому как если спрайт провалился в землю,
> то он даже не отрисуется, пока не окажется на поверхности.
А если врежится в стену, то взлетит на самый верх этой стены.
← →
Jus (2004-10-05 06:43) [41]А если сделать что если нажать влево х=х-4(врезолся в стену), то х=х+4, а только после этого проверяет под собой пол, то получится что в полёте, им можно ещё управлять влево право, и если в полёте(падении) прикоснуться к стене то он будет за неё усердно держаться и не падать, пока не отпустить клавишу влево!
← →
Megabyte-ceercop © (2004-10-05 06:45) [42]
> Falcon(TFSoft) (05.10.04 01:15) [38]
Спасибо за теплые слова Falcon! :))
Сразу появилось желание выложить все исходники на общее благо, только вот немогу, только через три года :));
Но могу рассказать по подробнее о физике и устройству игры.
Все спрайты там одинаковы обсолютно, имеют один на всех цикл обработки, даже глобальный - управляющий сценарием (только он невидим, или стоит где нить в виде столбика или флажка :)
имеют все они следующие свойства:
X,Y - Координаты
Xusk, Yusk - Скорость по оси Х и Y
Image - номер картинки
AnimPos - позиция анимации
Ider - Индификатор в котором биты значат примерно такое:
1 - координаты отсчитываются от начала экрана (нампимер счетчики не двигаются вместе с миром, а всегда в одной точке экрана).
2 - Спрайт на заднем плане (за ландшавтом) / если 0 - то на переднем плане.
4 - невидимый;
и т. д.
Более подробно о физике и прыжках:
(Анимацию упускаю)
Например спрайт неподвижен
Xusk := 0;
Yusk := 0;
//*****
//Напомню что в каждом цикле независимо от обстоятельств происходит
X := X + Xusk; //изменение координат объекта в зависимости от его скорости
Y := Y + Yusk;
Yusk := Yusk + 0.1 ; //Постояное воздействие гравитации (скорость растет вниз);
//*********
В такой ситуации спрайт начнет двигаться вниз сперва медленно, а потом все быстрее и быстрее (ускоряться вниз или падать).
После придания толчка вверх
Для прыжка ровно вверх придаем спрайту толчек в верх
If key = Up then
Yusk := - 7; //Прыжок при нажатии кнопки вверх;
При нажатии кнопки вверх спрайт резко изменит направление, полетит ввех сперва быстро, потом медленнее, потом зависнет на секунду и начнет падать, как он это делал из неподвижного состояния.
Столкновение с землей (прекращение падения) сделано так:
If (Спрайт в земле) then
begin
Yusk := 0;
while (Спрайт в земле) Y := Y - 1; //выталкиваем спрайт вверх,
//пока он не окажется ровно на поверхности.
end;
Движение влево вправо:
If (key = left) and (Xusk > - 10) then Xusk := Xusk - 1.0;
//При нажатии кнопки влево спрайт начнет ускоряться влево до тех пор, пока не достигнет скорости ( -10 );
If (key = Right) and (Xusk < 10) then Xusk := Xusk + 1.0;
//При нажатии кнопки вправо он начнет ускоряться в прова тоже до скорости 10;
Если сперва долго давить вправо, а затем резко влево, то спрайт типа занесет. (какоето время он будет лететь по инерции.
Тут еще нужна сила трения, которая будет останавливать спрайт постоянно.
IF X > 0 then X := X - 0.5;
IF X < 0 then X := X + 0.5; //Трение всегда старается притянуть скорость к нулю.
Ну вот примерно и всё в краце.
Если кто понял, то дальше сам всё додумает :)))
← →
Megabyte-ceercop © (2004-10-05 06:51) [43]
> Jus (05.10.04 06:43) [41]
Я тут забыл добавить что проверяю столкновение с ландшавтом не простым DoColision
А выборкой грунта по определенным координатам относительно спрайта
If Land_AT (X + 50 , Y + 100) = Grunt then Замля_подомной
If Land_AT (X + 100 , Y + 50) = Grunt then Замля_справа
и т. д.
То есть я не просто знаю столкнулся или нет, а знаю с какой стороны это столкновение (земля или стена);
← →
Jus (2004-10-05 06:57) [44]Falcon(TFSoft)
Если делать как ты говорил, то наверное получится, но не совсем то. Если нажимать влево, то проверяется Х+ширина, а если вправо, то Х.(я правильно понял?)
Значит он ходит влево проверяется Х+ширина, кирпич кончился, он полетел вниз.Ок!
Если он находится на одном кубике кирпича к примеру, а вокруг пусто:
Нажимаю влево, идёт, наполовину свисает с левого края кирпича, тоесть Х над пропостью, но проверяется х+ширина, резко нажимаю вправо - теперь проверяется Х, он уже находится над пропостью и сразу падает.
> cyborg © (04.10.04 09:40) [32]
> Момент дохода до назначения (ну и слово :), координата игрока
> будет кратна 32-ум, т.е. if (X mod 32=0) and (Y mod 32 =
> 0) then (остановить игрока, посмотреть, есть ли под ним
> земля, если есть обработать ввод, если нет, то падает).
>
Выдаётся ошибка:
[Error] Unit1.pas(854): Operator not applicable to this operand type
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"(X mod 32=0)
хотя это уменя не работает по неизвестным причинам(может это используется в Делфи7 и выше, а у меня 6-я), то раскажи что это означает подробно. Это я так понял Если Х делится на 32, но не понимаю зачем=0
? не разу mod не использовал.
← →
Megabyte-ceercop © (2004-10-05 07:14) [45]
> Jus (05.10.04 06:57) [44]
mod - возвращает остаток от деления
> (X mod 32=0)
это условие правильнее писать так:
((X mod 32) = 0)
Условие это будет соблюдаться в том случае, если X кратно 32 (т.е. делится на 32 с нулевым остатком)
Здесь означает что спрайт стоит ровно в клетке карты.
← →
Jus (2004-10-05 07:21) [46]Понял, X - у нас Double;
((round(X) mod 32) = 0)
← →
Jus (2004-10-05 07:39) [47]С падением с кирпичей вроде разобрались, благодаря вам, падает с кирпичей исправно!:)
От каждого из ваших советов брал по чуть-чуть, и немножко своего добавил(или оставил):)
procedure TPlayer.DoMove(MoveCount:Integer);
var
begin{1}
If ((round(player1.X) mod 32)=0) then If (ScrMap[Trunc(player1.ScanX),Trunc(player1.ScanY+1)]) =0 then falling:=true else falling:=false;// взял из совета Cyborga, спасибо
If Falling=false then begin
If isRight in Form1.DXInput.States then begin x:=x+4; ScanX:=ScanX+0.125; end;// -||-Falcon(TFSoft)+своё
If IsLeft in Form1.DXInput.States then begin x:=x-4; scanX:=ScanX-0.125; end;// -||-Falcon(TFSoft)+своё
end;
If Falling=true then begin Y:=Y+8; ScanY:=ScanY+0.25 end; //NikeOLD © (01.10.04 14:36) [3] постоянное падение
collision;
end;{1}
procedure TPlayer.DoCollision(Sprite:TSprite;var Done:Boolean);
begin
/////////////
end;
И остольных всех тоже благодарю за внимание, теперь буду проверять на столкновение со стенами, мож по принципу Falcon(TFSoft) или Megabyte-ceercop © .
← →
cyborg © (2004-10-05 10:13) [48]так чтоли переделай
procedure TPlayer.DoMove(MoveCount:Integer);
var
begin{1}
if ((round(player1.X) mod 32)=0) and ((round(player1.Y) mod 32)=0) then
falling:=(ScrMap[Trunc(player1.ScanX),Trunc(player1.ScanY+1)]) =0;
If Falling then
begin
Y:=Y+8;
ScanY:=ScanY+0.25;
end else
begin
If isRight in Form1.DXInput.States then begin x:=x+4; ScanX:=ScanX+0.125; end;
If IsLeft in Form1.DXInput.States then begin x:=x-4; scanX:=ScanX-0.125; end;
end;
collision;
end;{1}
И-то мне кажется, что криво ты делаешь ;)
> [34] Faclon(TFSoft) (04.10.04 20:45)
Вроде они там поклеточно бегали :)
← →
Jus (2004-10-05 14:59) [49]
> так чтоли переделай
> falling:=(ScrMap[Trunc...
falling:boolean;
почему ты так написал, и чё обозначает?
>
> И-то мне кажется, что криво ты делаешь ;)
Почему это криво, всё пашет, чё кривого то?:(
> Вроде они там поклеточно бегали :)
Там то по клеточно, а почему бы не сделать по пиксельно? Ты думаеш, что на лестницу трудно будет попасть или что, кирпичи пробивать? будет нетрудно, он по 4 пикселя бегает а не по 1, а на счёт кирпичей не переживай, всё будет нормально!:)
← →
cyborg © (2004-10-05 15:04) [50]
> [49] Jus (05.10.04 14:59)
Это обозначает простоту............. и так надо! :)
← →
Jus (2004-10-05 15:27) [51]
> cyborg © (05.10.04 15:04) [50]
>
> > [49] Jus (05.10.04 14:59)
>
> Это обозначает простоту............. и так надо! :)
Ну хорошо!
А кривого то чё?:) почему?
← →
cyborg © (2004-10-05 15:44) [52]
> [51] Jus (05.10.04 15:27)
> Ну хорошо!
> А кривого то чё?:) почему?
Не нравится мне реализация ;)
← →
Jus (2004-10-05 16:22) [53]Всётаки считаешь, что лучше ходить поклеточно? если да, то к примеру я нажал идти вправо, он прошёл пол клетки и я резко нажал вправо, он пойдёт сразу вправо или сначало пройлёт клетку до конца, а потом развернётся и пойдёт?
← →
Megabyte-ceercop © (2004-10-05 16:30) [54]У меня в самом первом Киркопе он ходил поклеточно, но мог разворачиваться напол пути между клетками. А останавливался только ровно в клетке. Для первого раза этого достаточно, к тому же позваляет избежать сомнительных ситуаций в логических играх.
Точно знаешь какую клетку герой будет капать.
← →
Jus (2004-10-05 16:51) [55]Я наверное сделаю так: нажал, отпустил кнопку - он пошёл сам пока не остановился в конце клетки? Ок:)?!
← →
Falcon(TFSoft) (2004-10-05 20:36) [56]to Jus (05.10.04 16:51) [55]
Мне кажется, что лутше сделать как в ceercop 1.0(by Megabyte) закачай, да посмотри как там всё плвано бегает...
to Megabyte-ceercop ©
А тебе случайно не влом будет посмотреть на мою про альфа версию игрушки (800k). Мне просто хочется оценить её с точки зрения человека, у кторого уже есть 2-е поколение игры...
если да то намыль мне письмецо...falcon_support@ua.fm
← →
Megabyte-CeerCop © (2004-10-07 13:15) [57]Написал уже...
← →
Jus (2004-10-07 16:26) [58]Кто желает посмотреть, что поучается? Бегает где надо и как надо, лазиет по лестницам, падает и т.д.:) Кому дать посмотреть?...
Заодно посмотрите графику в динамике, а не на скринах:)
архив RАR 250Кб.
← →
Jus (2004-10-08 09:14) [59]переход
http://delphimaster.net/view/9-1095732632/
Страницы: 1 2 вся ветка
Форум: "Игры";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.07 c