|
3D-программирование Вопросы, касающиеся программирования 3D мира |
18.04.2006, 20:14
|
#1
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
:'((
Graphics3D 800,600,16,2
SetBuffer BackBuffer()
Global a#=40
Global speed#=.25
Global time#=0
Global Distance#=0
Global font16=LoadFont ("Arial Cyr",22)
SetFont font16; включаем шрифт
camera=CreateCamera()
PositionEntity camera,0,50,35
RotateEntity camera,90,0,0
light=CreateLight()
RotateEntity light,45,0,0
Global player=CreateCube()
Color 255,255,255
Repeat
Cls
UpdateWorld
RenderWorld
Text 0,0,"Прошел игрок "+Distance#
Text 0,25,"Позиция игрока по оси Z "+EntityZ(player)
Text 0,50,"Счетчик движения " +count_step
Text 0,75,"Переменная " + a#
Flip
If KeyHit(1)
FreeFont font16
End
End If
Forever
Вот шаблон, который я мучаю уже много-много дней!
Как только я не пытался сделать уже это перемещение! И мне это даже в какой-то степени удалось, по формуле distance#=time#*speed#, днако если спиид был больше чем 1.25, то пять ничего не вышло
Пожалуйста, подскажите как реализовать плавное перемещение на 5 блицевских единиц, то при этом, если увеличивалась скорость, то (по логике) уменьшалось время прохождения этих 5-ти клеток ...
Как это реализовать!? Уже совем не знаю
|
(Offline)
|
|
18.04.2006, 21:46
|
#2
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
StepDistance#=PlayerSpeed# / CurrentFPS#
?
|
(Offline)
|
|
18.04.2006, 21:59
|
#3
|
|
вот так думаю по пральнее будет
StepDistance#=(PlayerSpeed# * фпс_когда_ета_скорость_нормальная ) / CurrentFPS#
|
|
|
18.04.2006, 22:38
|
#4
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Global a#=40
Global speed#=.25
Global time#=0
Global Distance#=0
Global font16=LoadFont ("Arial Cyr",22)
SetFont font16; включаем шрифт
Graphics3D 640,480,16,2
Const UPS#=60
camera=CreateCamera()
PositionEntity camera,0,50,35
RotateEntity camera,90,0,0
light=CreateLight()
RotateEntity light,45,0,0
Global player=CreateCube()
Color 255,255,255
l=CreateLight()
period#=1000/UPS#
time=MilliSecs()-period#
Repeat
Repeat
elapsed#=MilliSecs()-time#
Until elapsed#
ticks=elapsed#/period#
tween#=Float(elapsed# Mod period#)/Float(period#)
For k=1 To ticks
time#=time#+period#
UpdateWorld
Distance#=Speed# / UPS#
If a#=40 And KeyHit (28) Then a#=0
If a#<40
MoveEntity player,0,0,speed#
a#=a#+1
End If
If KeyHit(1)
FreeFont font16
End
End If
Next
RenderWorld tween
Text 0,0,"Прошел игрок "+Distance#
Text 0,25,"Позиция игрока по оси Z "+EntityZ(player)
Text 0,50,"Счетчик движения " +count_step
Text 0,75,"Переменная " + a#
Text 0,100, "ФПС "+ups#
Flip
Forever
Вот я благополучно все использовал в коде, но почему-то переменная, которая должна показывать какую дистанцию прошел игрок, никак не хочет показывать эту дистанцию..
А мне нужно как раз именно дистанцию знать (что бы не позволять игроку на высокой скорости "пролетать" большем, чем расстояние в 5 блиц. единиц например)
|
(Offline)
|
|
18.04.2006, 22:48
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Я бы для этого использовал твининг, рассчет скорости зависящей от FPS конечно хорошо, но проще обновлять игру 30 раз в секунду, чем n=FPS раз в секунду...
Вот стандартный шаблон:
...
period=1000/FPS ; FPS определяет, сколько раз в сеунду будет обновляться игра, если FPS = 30, то игра будет обнавляться 30 раз, но текущая скорость кадров не будет от этого зависеть, даже если она будет меньше 30.
time=MilliSecs()-period
While Not KeyHit(1)
Repeat
elapsed=MilliSecs()-time
Until elapsed
;Сколько кадров прошло
ticks=elapsed/period
;положение между предидущим и следующим кадрами (от 0 до 1)
;при значении не равном 0 или 1 блитц достраивает промежуточные кадры
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
' сохранение текущего положения всех объектов для расчета промежуточного их положения между текущим и новым положением (CaptureWorld)
If k=ticks Then CaptureWorld
UpdateGame();Обновление игры
UpdateWorld
Next
RenderWorld tween
Flip
Wend
End
Таким образом StepDistance# = Const, если надо ускорить игрока, то просто надо увеличить StepDistance#, замедлить -уменьшить StepDistance#, но не надо ее рассчитывать при каждом обновлении игры.
Не волнуйся, если поймешь не сразу
PS: эта часть кода из примера MAK->CASTLE
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:02.
|