Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 25.06.2009, 11:36   #16
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Сообщение от SBJoker Посмотреть сообщение
1. Все переменные твоей функции должны быть глобальными
2. deltatime должна быть типа float (#)
3. На deltatime нужно умножать любое действие которое в игре должно быть стабилизировано по фпс, т.е. вместо MoveEntity ent, 10,0,0 пишем MoveEntity ent, 10*deltatime,0,0 и т.д.

Смысл умножения на делтатайм это "двигать вещи во столько раз быстрее во сколько раз наш фпс меньше проектного"

З.Ы. а FPSCount должна быть глобальной! А если она глобальная то можно невозвращать её значение из функции.
Вот это очень полезная для меня информация!! Спасибо большое будем пробовать))
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 11:52   #17
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг


Global FPSTime,FPSCount,FPSCountTemp

delta# = 60.0 / FPSCount
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3

Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
TurnEntity Cube,0,1*delta,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()

Flip 
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
		FPSTime = MilliSecs()
		FPSCount = FPSCountTemp
		FPSCountTemp = 0
	EndIf
	FPSCountTemp = FPSCountTemp + 1
End Function

ЧТо делаю не так?

Последний раз редактировалось Unodeya, 25.06.2009 в 12:08.
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 12:26   #18
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Дельта тайминг

Ндэ...

Давай вместе разберм твой код и посмеёмся.
Global FPSTime,FPSCount,FPSCountTemp
Все настоящие программисты указывают тип переменных, это и нагляднее и много проблемм предупреждает, поэтому лучше так:
Global FPSTime%,FPSCount%,FPSCountTemp%
Global delta#=1
А вот теперь главная шутка:
delta# = 60.0 / FPSCount
В чём прикол? Да просто тут мы в самом начале делим 60 на переменную FPSCount в которой чуть выше видно что хранится 0.
Что будет если разделить любое число на ноль? Правильно, получится бесконечность... т.к. в любом числе бесконечное число такого мелкого числа как ноль.

Вопрос знатакам: зачем мы в главном цикле каждый раз вызываем функцию Init_Count_FPS()?
Правильно: чтобы узнать текущий фпс, ведь условия меняются и фпс надо считать постоянно. Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции Init_Count_FPS()?

Теперь инструкция: строку delta# = 60.0 / FPSCount перенести в новое место сразу после строки Init_Count_FPS() и перед Flip

Серьёзно, нужно как то уметь "читать" свой код.
__________________

Последний раз редактировалось SBJoker, 25.06.2009 в 12:37.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
NitE (25.06.2009), Unodeya (25.06.2009)
Старый 25.06.2009, 12:35   #19
jimon
 
Сообщений: n/a
Ответ: Дельта тайминг

Unodeya
deltatime должна высчитыватся каждый кадр
 
Ответить с цитированием
Старый 25.06.2009, 13:03   #20
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Дельта тайминг

Ты главное не переживай, все когда-то начинали, не у всех гладко было с перенаправлением мозга на программирование с обычного мышления. Давай разбираться вместе... Сейчас я пошагово разберу твой код и покажу, где ошибки, и как с ними справиться. Поехали:

Global FPSTime,FPSCount,FPSCountTemp
Тут ты молодец, мы завели новые глобальные переменные, разве что стоит добавить delta сюда же

delta# = 60.0 / FPSCount
Теперь давай немножко подумаем. У нас есть ФПС игры, который скачет от 20 до 120 (к примеру) в течение игры. Соответственно, и дельта (определяющая скорость действий в игре) должна изменяться вместе с ним, верно же?
Но ты поставил дельту до главного цикла.
Окей, если еще не понятно, о чем я, давай пройдемся по значениям переменных:
Первая строчка кода - объявлены FPSTime,FPSCount,FPSCountTemp, все они равны 0
Вторая строчка кода - ты заводишь дельту, и даешь ей значение 60/0

Поехали дальше

Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
PositionEntity camera, 0,2,-3

Global Cube=CreateCube()

AmbientLight 155,155,155
Тут и сказать нечего, все хорошо, все работает

А дальше идет твой главный цикл:
Repeat

PointEntity camera,cube
TurnEntity Cube,0,1*delta,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount
Тут тоже все хорошо, все радужно. Но вспоминаем, чему равняется на данный момент дельта (а после этого она нигде не менялась) и делаем кое-какой вывод

Init_Count_FPS()

Flip 
Until KeyHit(1)
End
Конец твоего главного цикла.
Давай немножко отойдем в сторону от темы и подумаем, как в общих чертах должна работать программа:

<инициализация>

<вход в цикл>
<тело главного цикла>
<выход из цикла>

<функции>
Вот в общих чертах и все.
Инициализация - это создание условий для запуска главного цикла, т.е. создание глобальных переменных, присвоение им _начальных_ (обрати на это, пожалуйста, внимание) значений, создание объектов, которые нужны будут на протяжение всей игры (например, камера, свет), вызова функций, которые должны быть вызваны до запуска главного цикла (например, у меня такая есть - запускает создание игровых объектов)

В теле главного цикла происходит основная жизнь программы, то, что ты видишь на экране (или не видишь, если твоя программа не должна ничего выводить). Естественно, конструкция цикла применяется не всегда, а только в тех случаях, когда необходимо многочисленное или постоянное до соблюдения каких-либо условий выполнение какого-либо блока программы. В твоем случае таким блоком является сочетание логика + отрисовка.
Важно понять одну вещь: компьютер делает не то, что ты хочешь, чтобы он сделал, а то, что ты ему скажешь сделать. Если ты хочешь, чтобы изменилось значение переменной - напиши правило, по которому оно должно измениться, и напиши его там, где она должна измениться...
Еще важно тут то, что главный цикл выполняется как и любая программа, строчка за строчкой, и пока очередь выполнения не дойдет до какого-либо строки, код этой строки НЕ ВЫПОЛНИТСЯ.

Ну, что такое функция ты похоже в общих чертах понимаешь.


Ну и напоследок, какую же ошибку ты допустил? Ошибка заключается в том, что ты нигде в главном цикле не изменил свою дельту

П.С.
Постарался без рыбы, только удочками..
П.П.С.
А, черт, опоздал...
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.

Последний раз редактировалось Taugeshtu, 25.06.2009 в 13:04. Причина: адд(
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Taugeshtu за это полезное сообщение:
newman (25.06.2009), Program23 (08.07.2010), Unodeya (25.06.2009)
Старый 25.06.2009, 13:25   #21
Dzirt
Элита
 
Аватар для Dzirt
 
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений
(для 3,833 пользователей)
Ответ: Дельта тайминг

Ize'g0re +1 за розжовку материала новичку.
(судя по количеству сообщений,последние самое адское за всю истороию)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Taugeshtu (25.06.2009)
Старый 25.06.2009, 13:38   #22
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Всем большое спасибо! В особенности: SBJoker,Ize'g0re,Jimon!
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 13:47   #23
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Сообщение от SBJoker Посмотреть сообщение
Ндэ...
Так какого %$#@! мы дельтатайм то считаем в самом начале, а не сразу после вызова функции Init_Count_FPS()?


Серьёзно, нужно как то уметь "читать" свой код.
Знаешь посмеялся я над тем, что писал в начальных постах, что я вызываю дельту перед инициализацией графики. И ты меня не поправил.. Серьёзно, нужно уметь читать все посты, если ты пытаешься помочь.. З.Ы А так я думаю ты парень не плохой.

Global FPSTime%,FPSCount%,FPSCountTemp%
Global delta#=1
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3
CameraClsColor camera,155,100,200
Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
MoveEntity Cube,0,0.01*Delta#,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()
delta# = 60.0 / FPSCount
Flip 
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
		FPSTime = MilliSecs()
		FPSCount = FPSCountTemp
		FPSCountTemp = 0
	EndIf
	FPSCountTemp = FPSCountTemp + 1
End Function
Но не работает.

Последний раз редактировалось Unodeya, 25.06.2009 в 13:53.
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 14:34   #24
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Дельта тайминг

фантастика !
интересно почему так
Global FPSTime%=MilliSecs(),FPSCount%=60,FPSCountTemp%
Global delta#=1
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()


Global camera=CreateCamera()
PositionEntity camera, 0,2,-3
CameraClsColor camera,155,100,200
Global Cube=CreateCube()

AmbientLight 155,155,155

Repeat

PointEntity camera,cube
MoveEntity Cube,0,0.01*Delta#,0



UpdateWorld
RenderWorld

Text 5,20,"FPS:" +FPSCount

Init_Count_FPS()
delta# = 60.0 / FPSCount
Flip 
Until KeyHit(1)
End

Function Init_Count_FPS()
If (MilliSecs()-FPSTime)>=1000 Then
		FPSTime = MilliSecs()
		FPSCount = FPSCountTemp
		FPSCountTemp = 0
	EndIf
	FPSCountTemp = FPSCountTemp + 1
End Function
работает, а так как у тебя - нет ?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Unodeya (25.06.2009)
Старый 25.06.2009, 15:03   #25
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Спасибо.. Почему тогда когда я ставилю Flip 0 всё равно всё двигается быстро....
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 15:28   #26
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Дельта тайминг

Сообщение от Unodeya Посмотреть сообщение
Знаешь посмеялся я над тем, что писал в начальных постах, что я вызываю дельту перед инициализацией графики. И ты меня не поправил.. Серьёзно, нужно уметь читать все посты, если ты пытаешься помочь.. З.Ы А так я думаю ты парень не плохой.
Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.

Количество и качество помощи обычно зависит от правильно поставленого вопроса автором (конкретность, ясность), от уровня его притязаний на помощь форумчан (от простого вопроса до "напишите за меня программу".) ну и от уже заработаного авторитета на форуме. Несекрет что особенно наглых запоминают и игнорируют темы с их авторством.

Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).

Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Unodeya (25.06.2009)
Старый 25.06.2009, 15:54   #27
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Сообщение от SBJoker Посмотреть сообщение
Я думаю тут никто необязан перечитывать пару страниц текста и исправлять ошибки.
Форум это место где на добровольных началах люди помогают друг другу.

Количество и качество помощи обычно зависит от правильно поставленого вопроса автором (конкретность, ясность), от уровня его притязаний на помощь форумчан (от простого вопроса до "напишите за меня программу".) ну и от уже заработаного авторитета на форуме. Несекрет что особенно наглых запоминают и игнорируют темы с их авторством.

Поэтому если хотите получить конкретный ответ на свой вопрос в этом столетии, задавайте его в правильной ветке форума, с подробным описанием проблемы и приведением проблемного куска кода объёмом не более 10-20 строк(это условно, но "много букаф" отпугивают).

Готовые решения алгоритмов ищите сами в соотв. ветках форума. Или на специализированых сайтах где вам за адекватное вознаграждение напишут что угодно.
По моему мои вопросы на данную тему заданы чётко, и каждое своё действия я описывал. А грубить мне начали конкретно ВЫ. Когда вы вступили в дискусиию по данному вопросу, мои вопросы были конкретизированны, а ВЫ, начали писать (грубо говоря) ненужную мне ахинею, которая была выражена в неуважительном ко мне тоне. Можете игнорировать мои вопросы. Но если существует комьюнити почему не помогать друг другу. Я всегда поделюсь своими знаниями и мне будет только приятно. P.S Я не мальнький ребенок, с которым можно разговаривать как ВАМ вздумается... Если не научились конкертно отвечать на вопросы просто не беритесь за это... Меньше вые%*%на и люди потянутся..- Это так, для жизни пригодиться..

Последний раз редактировалось Unodeya, 25.06.2009 в 16:12.
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 16:20   #28
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Дельта тайминг

почему почти все темы с вопросом по программированию заканчиваются именно так ?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Taugeshtu (25.06.2009)
Старый 25.06.2009, 16:29   #29
Unodeya
ПроЭктировщик
 
Аватар для Unodeya
 
Регистрация: 14.05.2009
Сообщений: 101
Написано 31 полезных сообщений
(для 67 пользователей)
Ответ: Дельта тайминг

Помогите пожалуйста, если убераю VSync(Flip 0) что = Увелечение FPS, то дельта не работает.. В чём проблема?Заранее спасибо.
(Offline)
 
Ответить с цитированием
Старый 25.06.2009, 16:35   #30
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Дельта тайминг

почитай, всё что есть в посте #2 этой темы - многое должно прояснится
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 02:38.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com