Всем привет
Собираюсь делать на блитце редактор карт для своей игры. Его образец в принципе у меня уже есть, сделан на дарке про... Вся задача лишь в том чтобы переписать его на блитц3д)))
Но сразу же столкнулся с проблемой...Не могу сделать алгоритм для выделения и перемещения и вращения объекта мышкой... На дарке с этим проблем не было, так как этот код был в хелпе!
чтобы было понятно о чем идёт речь можно скачать отсюда примерчик
Скачать PMforForum.rar с WebFile.RU
900 кб.
Вообще код достаточно непростой, по крайней мере для меня) Именно код перемещения и вращения мышью...Всё остальное то в этом примере я сам писал...
Ну вот, кто нить знает как забабацать это в блитце??? Желательно кодом
Вот везде есть этот пример для выделения объекта мышью...Но перемещения и вращения я ещё не встречал... Надеюсь на Вашу помощь
Вот кстати код уж выкину заодно:
Ну написан на дарке...но с комментами...Там самое трудное функция drag_object... Именно её мне и надо но в блитц!
Rem Выбираем объект
Rem Создан: 14/07/2003 18:54:11
rem Запуск приложения
sync on : sync rate 60
rem Создаем пол
make object plain 1,300,300
position object 1,0,-50,200
xrotate object 1,270
rem Создаем объект, который будем тащить
make object cube 999, 50
hide object 999
make object cube 2,100
position object 2, 0,0,200
make object Sphere 3,100
position object 3, 0,0,200
rem Устанавливаем камеру и свет
set point light 0,-100,500,-100
position camera -200,0,-200
point camera 0,0,0
rem Основной цикл
do
If keystate(15)=1
Wait 400
If Tab = 0
Tab =1
else
Tab = 0
endif
endif
rem Вызываем подпрограмму, чтобы тащить объект
gosub _drag_object
rem Подсказка пользователю
center text 320,20,"Щелкните на объекте и удерживайте кнопку мыши, чтобы тащить объект."
center text 320,40,"Вращение по правой кнопке мыши."
center text 320,60,"Жмите TAB для включения режима управления камерой! Управляйте клавишами стрелками!)))"
center text 320,80,"Жмите ещё раз TAB для выхода из режима управления камерой"
center text 320,100,"Используйте колёсико мыши для приближения\удаления"
rem Обновляем экран
sync
rem Конец цикла
loop
_drag_object:
if mouseclick()=0 then pickmode=0 : cursorobj=0
mclick=mouseclick()
if mclick>0
if pickmode=0
cursorobj=pick object(mousex(),mousey(),2,10)
if cursorobj>0
pickmode=mclick
pickdistance#=get pick distance()
pickfromx#=get pick vector x()
pickfromy#=get pick vector y()
pickfromz#=get pick vector z()
if pickmode=1
objx#=object position x(cursorobj)
objy#=object position y(cursorobj)
objz#=object position z(cursorobj)
else
objx#=object angle x(cursorobj)
objy#=object angle y(cursorobj)
objz#=object angle z(cursorobj)
pickdiffx#=mousemovey() : pickdiffx#=0
pickdiffy#=mousemovex() : pickdiffy#=0
endif
else
highlightobj=0
endif
endif
if pickmode>0
if pickmode=1
pick screen mousex(),mousey(),pickdistance#
picktox#=get pick vector x()
picktoy#=get pick vector y()
picktoz#=get pick vector z()
pickdiffx#=picktox#-pickfromx#
pickdiffy#=picktoy#-pickfromy#
pickdiffz#=picktoz#-pickfromz#
grid=0
if grid=1
pickdiffx#=int(pickdiffx#/5)*5
pickdiffy#=int(pickdiffy#/5)*5
pickdiffz#=int(pickdiffz#/5)*5
endif
position object cursorobj,objx#+pickdiffx#,objy#+pickdiffy#,objz#+pickdiffz#
else
pickdiffx#=pickdiffx#+mousemovey()
pickdiffy#=pickdiffy#+mousemovex()
grid=0
if grid=1
tpickdiffx#=int(pickdiffx#/22.5)*22.5
tpickdiffy#=int(pickdiffy#/22.5)*22.5
else
tpickdiffx#=pickdiffx#
tpickdiffy#=pickdiffy#
endif
rotate object cursorobj,wrapvalue(objx#-tpickdiffx#),wrapvalue(objy#-tpickdiffy#),objz#
endif
endif
endif
`Движение камеры
If Tab=1
crs#=0.2
am#=mousemovez()
r#=r#+am#
if r#<50 then r#=50
Y#=Y#+ mousemovez()
if upkey()=1
move camera 1
Y# = Newxvalue(Y#,Wrapvalue(Camera Angle z()),camspeDirectPoint#)
X# = Newxvalue(X#,Wrapvalue(Camera Angle Y()),camspeDirectPoint#)
Z# = Newzvalue(Z#,Wrapvalue(Camera Angle Y()),camspeDirectPoint#)
endif
if downkey()=1
X# = Newxvalue(X#,Wrapvalue(Camera Angle Y()),-camspeDirectPoint#)
Z# = Newzvalue(Z#,Wrapvalue(Camera Angle Y()),-camspeDirectPoint#)
endif
if leftkey()=1
X# = Newxvalue(X#,Wrapvalue(Camera Angle Y()-90),camspeDirectPoint#)
Z# = Newzvalue(Z#,Wrapvalue(Camera Angle Y()-90),camspeDirectPoint#)
endif
if rightkey()=1
X# = Newxvalue(X#,Wrapvalue(Camera Angle Y()+90),camspeDirectPoint#)
Z# = Newzvalue(Z#,Wrapvalue(Camera Angle Y()+90),camspeDirectPoint#)
endif
if keystate(210)=1
Y# = Y# + coef#
endif
if keystate(211)=1
Y# = Y# - coef#
endif
position object 999,X#,Y#,Z#
rem Эти строки кода объяснить сложно: они управляют камерой:)
inc a#,crs#*mousemovey()
inc b#,crs#*mousemovex()
e#=object position x(999)+r#*cos(270-b#)*cos(a#)
d#=object position y(999)+r#*sin(a#)
f#=object position z(999)+r#*sin(270-b#)*cos(a#)
position camera e#,d#,f#
point camera object position x(999),object position y(999),object position z(999)
endif
`Приближение и удаление камеры
camspeDirectPoint#=10
crs#=0.2
am#=mousemovez()
r#=r#+am#
if r#<50 then r#=50
Y#=Y#+ mousemovez()
position object 999,X#,Y#,Z#
e#=object position x(999)+r#*cos(270-b#)*cos(a#)
d#=object position y(999)+r#*sin(a#)
f#=object position z(999)+r#*sin(270-b#)*cos(a#)
position camera e#,d#,f#
point camera object position x(999),object position y(999),object position z(999)
return