Показать сообщение отдельно
Старый 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)