![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DelphiX, DoMove, DoCollision [D6, WinXP]
Jus © (2004-10-01 13:03:00)Помогите, как мне сделать? Вот есть у меня игрок, он появляется в начале игры над "кирпичами"(Кирпич - это объект TKirp) в воздухе и как делать дальше в DoMove и DoCollision?! Я начал вроде, что у плеера по умолчанию стоит свойство Falling:=True; при Player1.DoCollision пишу
If (Sprite is Tkirp) and (Player1.Falling=True) then Falling:=False;А как потом игрок поймёт, что надо опять падать?
Если можно, приведити пример со столкновением с кирпичём (ЛЕВО ПРАВО ВЕРХ ВНИЗ), учитывая то, что есть ещё гравитация. Плиз!
Jus (2004-10-08 09:14:00) [1]переход
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1095732632&n=9
Jus (2004-10-07 16:26:00) [2]Кто желает посмотреть, что поучается? Бегает где надо и как надо, лазиет по лестницам, падает и т.д.:) Кому дать посмотреть?...
Заодно посмотрите графику в динамике, а не на скринах:)
архив RАR 250Кб.
Megabyte-CeerCop (2004-10-07 13:15:00) [3]Написал уже...
Falcon(TFSoft) (2004-10-05 20:36:00) [4]to Jus (05.10.04 16:51) [55]
Мне кажется, что лутше сделать как в ceercop 1.0(by Megabyte) закачай, да посмотри как там всё плвано бегает...
to Megabyte-ceercop ©
А тебе случайно не влом будет посмотреть на мою про альфа версию игрушки (800k). Мне просто хочется оценить её с точки зрения человека, у кторого уже есть 2-е поколение игры...
если да то намыль мне письмецо...falcon_support@ua.fm
Jus (2004-10-05 16:51:00) [5]Я наверное сделаю так: нажал, отпустил кнопку - он пошёл сам пока не остановился в конце клетки? Ок:)?!
Megabyte-ceercop (2004-10-05 16:30:00) [6]У меня в самом первом Киркопе он ходил поклеточно, но мог разворачиваться напол пути между клетками. А останавливался только ровно в клетке. Для первого раза этого достаточно, к тому же позваляет избежать сомнительных ситуаций в логических играх.
Точно знаешь какую клетку герой будет капать.
Jus (2004-10-05 16:22:00) [7]Всётаки считаешь, что лучше ходить поклеточно? если да, то к примеру я нажал идти вправо, он прошёл пол клетки и я резко нажал вправо, он пойдёт сразу вправо или сначало пройлёт клетку до конца, а потом развернётся и пойдёт?
cyborg (2004-10-05 15:44:00) [8]
> [51] Jus (05.10.04 15:27)
> Ну хорошо!
> А кривого то чё?:) почему?
Не нравится мне реализация ;)
Jus (2004-10-05 15:27:00) [9]
> cyborg © (05.10.04 15:04) [50]
>
> > [49] Jus (05.10.04 14:59)
>
> Это обозначает простоту............. и так надо! :)
Ну хорошо!
А кривого то чё?:) почему?
cyborg (2004-10-05 15:04:00) [10]
> [49] Jus (05.10.04 14:59)
Это обозначает простоту............. и так надо! :)
Jus (2004-10-05 14:59:00) [11]
> так чтоли переделай
> falling:=(ScrMap[Trunc...
falling:boolean;
почему ты так написал, и чё обозначает?
>
> И-то мне кажется, что криво ты делаешь ;)
Почему это криво, всё пашет, чё кривого то?:(
> Вроде они там поклеточно бегали :)
Там то по клеточно, а почему бы не сделать по пиксельно? Ты думаеш, что на лестницу трудно будет попасть или что, кирпичи пробивать? будет нетрудно, он по 4 пикселя бегает а не по 1, а на счёт кирпичей не переживай, всё будет нормально!:)
cyborg (2004-10-05 10:13:00) [12]так чтоли переделай
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 07:39:00) [13]С падением с кирпичей вроде разобрались, благодаря вам, падает с кирпичей исправно!:)
От каждого из ваших советов брал по чуть-чуть, и немножко своего добавил(или оставил):)
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 © .
Jus (2004-10-05 07:21:00) [14]Понял, X - у нас Double;
((round(X) mod 32) = 0)
Megabyte-ceercop (2004-10-05 07:14:00) [15]
> Jus (05.10.04 06:57) [44]
mod - возвращает остаток от деления
> (X mod 32=0)
это условие правильнее писать так:
((X mod 32) = 0)
Условие это будет соблюдаться в том случае, если X кратно 32 (т.е. делится на 32 с нулевым остатком)
Здесь означает что спрайт стоит ровно в клетке карты.
Jus (2004-10-05 06:57:00) [16]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 06:51:00) [17]
> 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 Замля_справа
и т. д.
То есть я не просто знаю столкнулся или нет, а знаю с какой стороны это столкновение (земля или стена);
Megabyte-ceercop (2004-10-05 06:45:00) [18]
> 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; //Трение всегда старается притянуть скорость к нулю.
Ну вот примерно и всё в краце.
Если кто понял, то дальше сам всё додумает :)))
Jus (2004-10-05 06:43:00) [19]А если сделать что если нажать влево х=х-4(врезолся в стену), то х=х+4, а только после этого проверяет под собой пол, то получится что в полёте, им можно ещё управлять влево право, и если в полёте(падении) прикоснуться к стене то он будет за неё усердно держаться и не падать, пока не отпустить клавишу влево!
Jus (2004-10-05 06:35:00) [20]Megabyte-ceercop © (05.10.04 06:11) [39]
> Draw;
> Скакать не будет, потому как если спрайт провалился в землю,
> то он даже не отрисуется, пока не окажется на поверхности.
А если врежится в стену, то взлетит на самый верх этой стены.