Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
1-1105194168
__esso
2005-01-08 17:22
2005.01.23
TChart


14-1104827435
Чеширский_Кот
2005-01-04 11:30
2005.01.23
Everybody, be cool! This is a robbery!


1-1105485353
chir
2005-01-12 02:15
2005.01.23
Запретить снятие фокуса


1-1105366850
mal4ik
2005-01-10 17:20
2005.01.23
Как конвертировать строку цифр в большое целое число?


14-1105031438
Кудесник
2005-01-06 20:10
2005.01.23
Вот вспомнил рекламу Эльдорадо... Были ли приценденты?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский