Тема: help B3D-anime
Показать сообщение отдельно
Старый 27.01.2007, 22:56   #46
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Стрелка Re: help B3D-anime

Цитирую себя:
Народ, а кто-нить знает, как сделать зависимость скорости проигрывания анимации от частоты кадров в секунду?
Цитирую Stalnoy_Gvozd':
Мне тоже ето весьма интересно
А я разобрался! Чтоб вы немучились, пишу как это сделать:
Кароче, вот мои рассуждения.
1. Измерить время от одного рендера до другого.
Сначала нуно узнать точное время (желательно Московское, но и системное время сойдёт) и чем точнее - тем лучше. Системный таймер измеряет время с точностью до 1 милисекунды, нам этого хватит. Создаём переменную, где будет указано в ремя ДО рендера:
Global: BeforeRender
И после рендера:
Global BeforeRender, AfterRender
И узнать их значения. Команду
BeforeRender = Millisecs()
пишем в цикле ДО команды
RenderWorld
А команду
AfterRender= Millisecs
после.
Потом вычисляем разницу:
Elapsed = AfterRender - BeforeRender
Эту команду пишем в цикле перед командой Untill
Да, кстати, переменную Elapsed нуно объявить в блоке переменных:
Global BeforeRender, AfterRender, Elapsed
После этого пишем саму программу. И теперь если нужно передвинуть объект, то мы пишем не число, а число*Elapsed:
If KeyDown(200) MoveEntity cub,0,0,0.1*Elapsed
If KeyDown(208) MoveEntity cub,0,0,-0.1*Elapsed
If KeyDown(203) MoveEntity cub,-0.1*Elapsed,0,0
If KeyDown(205) MoveEntity cub,0.1*Elapsed,0,0

Вот теперь работать буит на любой машине без глюков (даже если тормозит, то замедления не случится)
Кстати, с анимацией всё точно так же. Нужно умножать на Elapsed скорость проигрывания анимации
Привожу полный код проги:
Global BeforeRender, AfterRender, Elapsed
Graphics3D 1280,1024,32,1
BackBuffer()
light=CreateLight()
timer=CreateTimer(300)
;таймер-ограничитель fps. Число в скобках - максимальное fps.
;Здесь, в общем-то ограничитель не нужен,
;почему я его тут поставил читай ниже
cam=CreateCamera()
cub=CreateCube()
PositionEntity cub,0,-10,20
BOT=LoadAnimMesh("01.B3D")
ScaleEntity BOT,.05,.05,.05
PositionEntity BOT,0,1,20

LoadAnimSeq BOT,"01.B3D"
PointEntity cam,bot

Repeat
BeforeRender = MilliSecs()
If KeyDown(200) MoveEntity cub,0,0,0.05*Elapsed
If KeyDown(208) MoveEntity cub,0,0,-0.05*Elapsed
If KeyDown(203) MoveEntity cub,-0.05*Elapsed,0,0
If KeyDown(205) MoveEntity cub,0.05*Elapsed,0,0
If KeyDown(57) And AnimSeq=0 Animate BOT,1,.02*Elapsed,1,0
WaitTimer(timer) ; Процедура ограничения fps. Уберёшь эту команду -
;ограничения не буит.
UpdateWorld()
RenderWorld()
Font=LoadFont("Arial cyr",30,True)
SetFont(Font)
Color 0,255,0
Text 640,50,"Стрелки - управление кубиком",True,True
Text 640,75,"Пробел - начало анимации",True,True
Text 640,100,"Escape - выход",True,True
AfterRender = MilliSecs()
Flip 0
Elapsed = AfterRender - BeforeRender
Until KeyHit(1)

End


Я вставил ограничитель кадросекунд специально чтобы вы могли убедиться: работа программы не зависит от FPS, сами ставьте любые значения и проверяйте.
Вместо файла 01.b3d возьмите любой .b3d-шный файл, переименуйте в 01.b3d и закиньте в папку с прогой.
Хе-хе. Не так уж всё и сложно. Между прочим, я всё сам сделал и прописал, у знакомых на форуме тока команды спрашивал. Насчёт ограничения FPS. Ограничить - тоже вариант, но есть причины, по которым его не следует использовать:
1. Если машина мощная, то почему бы не использовать её потенчиал, делая столько fps, скоко этоа машина может выдавать. А если поставим ограничение в 30 кадров (хотя машина может выдать и 70), то пользователь не обрадуется да и самому неприятно.
2. Если же машина наоборот слишком слабая, то кол-во кадров в секунду упадёт и упадёт скорость работы самой игры (если мы можем поставить максимальное fps, то минимальное уже не ограничишь - не тянет машина и всё тут), так как скорость работы игры зависит от fps. Снижается fps => снижается скорость работы игры.
Надеюсь, понятно всё объяснил. А вот с моим стабилизатором при любом fps на любой машине работать будет с одинаковой скоростью. Почитай там код, разберёшься как модели свои вставлять и т.д.
И, чуть не забыл. Использовать ограничитель fps следует если вы делаете простенькую игрушку нетребовательную к ресурсам компа. (т.к. стабилизатор тормозит сильнее чем ограничитель). Поставишь ограничение в 30 кадров - и этого хватит чтоб сыгарть в простенькую аркаду. Для серьёзных проектов пользуйся ограничителем.

Хух.... Выложился на полную катушку. Кто тут админ? За хорошие, полные и досканальные ответы тут не полагается, скажем, звёздочек под аватаром или там смена статуса (Достал меня статус "Any Key'щик", хочу "АК-47")? Лана, я ж прикольнулся. (Но было бы приятно)
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием