forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Плавное перемещение игрока (http://forum.boolean.name/showthread.php?t=864)

Fant 18.04.2006 20:14

:'((
Код:

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-ти клеток ...

Как это реализовать!? Уже совем не знаю!!!

Diplomat 18.04.2006 21:46

StepDistance#=PlayerSpeed# / CurrentFPS#
?
>:(

jimon 18.04.2006 21:59

вот так думаю по пральнее будет
StepDistance#=(PlayerSpeed# * фпс_когда_ета_скорость_нормальная ) / CurrentFPS#

Fant 18.04.2006 22:38

Код:

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 блиц. единиц например)

pax 18.04.2006 22:48

Я бы для этого использовал твининг, рассчет скорости зависящей от 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


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot