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

Вниз

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-е поколение игры...

если да то намыль мне письмецо... [email protected]


 
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://predskazanie-wunschpunsch.ru/view/9-1095732632/



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

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

Наверх




Память: 0.59 MB
Время: 0.029 c
10-1081321930
com.dll
2004-04-07 11:12
2005.01.23
Отладка com-сервера


1-1105542768
race1
2005-01-12 18:12
2005.01.23
свойства


3-1103212483
Iova
2004-12-16 18:54
2005.01.23
Ошибка с функцией OpenSchema


3-1103503786
rosl
2004-12-20 03:49
2005.01.23
кодировка


1-1105536839
Zhekson
2005-01-12 16:33
2005.01.23
Не срабатывает событие