Показать сообщение отдельно
Старый 24.10.2008, 22:28   #1
ELIAS
Знающий
 
Аватар для ELIAS
 
Регистрация: 31.08.2008
Адрес: Arrakis
Сообщений: 234
Написано 6 полезных сообщений
(для 6 пользователей)
Вопрос Выделить и переместить объект мышкой!

Всем привет
Собираюсь делать на блитце редактор карт для своей игры. Его образец в принципе у меня уже есть, сделан на дарке про... Вся задача лишь в том чтобы переписать его на блитц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
(Offline)
 
Ответить с цитированием