Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про LagCount   Найти похожие ветки 

 
Anybody   (2004-10-03 01:27) [0]

Значит такое дело...
Рассмотрим на примере DelphiX:
Если спрайт движется с постоянной скоростью, то при каждом DoMove координата X=X+MoveCount*Speed
А что делать если необходимо организвать движение с ускорением ?
Если сделать так в DoMove:
x=x+Speed
Speed=Speed+MoveCount
То работать будет неправильно, т.е. при разных MoveCount x будет расти  по-разному.
Собсно, вопрос в том, как сделать это правильно ???


 
cyborg ©   (2004-10-03 09:41) [1]

Speed сделай тип Single например. При нарастании скорости увеличивай его до определённого значения.

Что-то типа:
Speed:=2.5;
X:=Trunc(X+Speed);


 
ninja   (2004-10-03 11:15) [2]

x=x+Speed
Speed=Speed+MoveCount
То работать будет неправильно, т.е. при разных MoveCount x будет расти  по-разному.


а по-моему, это очень даже правильно. При разном ускорении ИХМО скорость должна нарастать по-разному. :)
Извените, если неправильно вас понял.


 
Anybody   (2004-10-03 13:24) [3]

Мне тоже казалось, что так правильно, но вот контрпример:
1-й случай LagCount=100, один тик:
Speed=Speed+100
X=X+Speed
Т.е. X увеличился на Speed+100
2-й случай LagCount=50, два тика:
Т.е. более бытрый комп успевает сделать за то же время два DoMove и LagCount соответственно уменьшается в 2 раза
Speed=Speed+50
X=X+Speed
Speed=Speed+50
X=X+Speed
Итог: X увеличился на 2Speed+100, т.е. что совсем не так как в 1-м случае.


 
Falcon(TFSoft)   (2004-10-03 18:06) [4]

Мне кажется, что если необходимо ускорение, то правелнее было б изменять х не линейно (тоесть х=х+dx)  а квадратично (x=x+dx*dx, dx=dx+0.1).

А вот  LagCount помоему вообще служит для того, что б вне зависимости от FPS(другими словами скорости компа, ведь правильно?) поддерживать видимость равномерного перемещения.

Тоесть пользуясь примером Anybody можно  сказать, что на 2-х разных компах, при формуле скорости X=X+Speed*LagCount спрайт переместится за одно и то же время на оддинаковое расстояние. Только один сделает это за 2 шага, а второй за 6.

Вот так я думаю... Если не прав, то поправте пожайлуста.

А по поводу ускоренного перемещения, то я думаю реализовывать необходимо приблизительно вот так:

dx       : Single;
MinSpeed : Single;//минимальная скорость...
MaxSpeed : Single;//...
***

//в зависимости от ускорения/замедления
dx := dx*0.1 //линейное ускорение
dx := dx*dx*0.1 //квадратическое ускорение, н/п гравитация
if (dx>MaxSpeed) then dx := MaxSpeed;
x := x + (dx+MinSpeed)*LagCount;


На мой взгляд этот вариант даст одинаковый вид ускорения на разноскоростных компах...


 
NikeOLD ©   (2004-10-03 19:27) [5]

FPS - это всего лишь отражение скорости игры. Этот показатель не может служить измерением скорости, другими словами, нельзя перемещать спрайт в зависимости от FPS.
Я неоднократно отмечал на этом форуме, что скорость игры на DirectDraw (в т.ч. DelphiX, как оболочке низкоуровневых методов DirectDraw) должна равняться 30 FPS.
Если делать привязку к FPS, то на медленных компьютерах будет заметно "торможение", а на быстрых - ускорение. И то и другое не приемлемо в компьютерных играх.


 
ninja ©   (2004-10-03 20:16) [6]

А почему не 24(или скока уж там для глаза) человеческава?


 
cyborg ©   (2004-10-04 09:45) [7]

33 в самый раз ;)


 
Anybody   (2004-10-04 10:33) [8]

Видимо меня мало кто понимает на этом форуме. =))) Единственный дельный совет дал Falcon, за это ему спасибо.
Я вроде разобрался - изменение скорости не должно зависеть от LagCount"а, а просто ч/з некторый промежуток времени.
Блин ! Ну причем тут FPS !!!!!!!!!
Мы говорим про LagCount, кто-нить ваще знает что это такое ??????? =)))


 
NikeOLD ©   (2004-10-04 10:35) [9]


> Блин ! Ну причем тут FPS !!!!!!!!!

FPS служит для измерения скорости игры, в основном - анимации.

Я на DelphiX не работаю, так что извиняй. Читай справку.


 
Anybody   (2004-10-04 10:38) [10]

Вообще если говорить про ФПС, то они для человека абсолютно бесполезны, т.к. всю роль играет верт. частота монитора. Если уж так говорить, то идеально одинаковой скорости на двух компах получить невозможно. Можно  только их более-менее приравнять.


 
NailMan ©   (2004-10-04 12:58) [11]

Anybody

> Вообще если говорить про ФПС, то они для человека абсолютно
> бесполезны, т.к. всю роль играет верт. частота монитора.

А если у пользователя VSync как класс в дровах вырублен?


> Если уж так говорить, то идеально одинаковой скорости на
> двух компах получить невозможно. Можно  только их более-менее
> приравнять.

Если пользовать высокоточные таймеры(QueryPerfonamceCounter), то скорость процесса(продолжительность действия, расстояние передвижения и т.д.) может на очень разных по производительности компах быть одинакова. Естественно использовать коэфициенты поравки(масштабирование процесса по скорости компа).

---
WBR, NailMan aka 2:5020/3337.13


 
Megabyte-CeerCop ©   (2004-10-04 13:02) [12]

выражаясь правильно LagCount - это величина обратная FPS и равна она 1 / FPS.
Для ускорения объекта до определенной скорости нужно делать так:

X,Y   - координаты объекта
XSpeed   - скорость объекта по оси X
YSpeed   - скорость по оси Y

TargetXSpeed, TargetYSpeed  - скорость объекта которую нужно набрать

X = X + XSpeed;    //Применение скорости к координатам объекта
Y = Y + YSpeed;    //если скорость нулевая, то объект никуда не сдвигается.

If XSpeed > TargetXSpeed then XSpeed = XSpeed + 0.5; //ускоряет объект по оси X если текущая его скорость ниже целевой скорости.
...  
//(0.5 - "это ускорение которое всегда одинаковое)
//Так нужно наростить обе координаты в двух направлениях.

Для ускорения свободного падения нужно делать

YSpeed = YSpeed + 1;  //Постоянно ускоряет вниз

Для отскока от пола:

YSpeed = -YSpeed; //скорость меняется на противоположную

И т.д и т.д...



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

Форум: "Игры";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.042 c
1-1104274630
Найти
2004-12-29 01:57
2005.01.16
Как избавиться от ошибки Unsafe code @ operator ?


1-1104017321
AGAMEMNUM
2004-12-26 02:28
2005.01.16
InstallShield


1-1104210033
HostLookUp
2004-12-28 08:00
2005.01.16
вопрос по Listbox


1-1104265046
RedLord
2004-12-28 23:17
2005.01.16
установка RXlib 2.75 под delphi 7


1-1104440915
Kolan
2004-12-31 00:08
2005.01.16
Как проверить истек ли TimeOut при работе с портом





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