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

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

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

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

Ответ
 
Опции темы
Старый 18.04.2006, 16:14   #1
Fant
Бывалый
 
Регистрация: 04.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, 17:46   #2
Diplomat
Дэвелопер
 
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений
(для 164 пользователей)
StepDistance#=PlayerSpeed# / CurrentFPS#
?
(Offline)
 
Ответить с цитированием
Старый 18.04.2006, 17:59   #3
jimon
 
Сообщений: n/a
вот так думаю по пральнее будет
StepDistance#=(PlayerSpeed# * фпс_когда_ета_скорость_нормальная ) / CurrentFPS#
 
Ответить с цитированием
Старый 18.04.2006, 18:38   #4
Fant
Бывалый
 
Регистрация: 04.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, 18:48   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,508
Написано 2,963 полезных сообщений
(для 5,252 пользователей)
Я бы для этого использовал твининг, рассчет скорости зависящей от 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
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плавное вращение..м? pepel 2D-программирование 2 01.10.2009 20:04
Перемещение вертексов PrgMan 3D-программирование 1 31.07.2009 17:37
Плавное перемещение камеры evel 3D-программирование 12 06.10.2007 17:34
Передвижение игрока Fant 3D-программирование 27 09.03.2007 18:29
Реализация игрока в FPS X-Ranger 3D-программирование 7 05.03.2007 23:09


Часовой пояс GMT +1, время: 03:28.


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