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=17861)

ligala 10.02.2013 22:21

Перемещение объектов
 
Помогите пожалуйста. Необходимо создать несколько объектов (к примеру 5), чтобы при клики на одном из них он выделялся (менял цвет, типа активный, либо рамка появлялась). Затем, при клике в любой части экрана, данный объект начинал туда перемещаться.
Я новичок в этом деле... написал, что-то типа такого

Код:

Graphics3D 840,580

SetBuffer BackBuffer()

kr1=0;
kr2=0;

cam=CreateCamera()

PositionEntity cam,0,5,0

 
lit=CreateLight()

cur=CreateSphere(8)

EntityColor cur,255,215,0

PositionEntity cur,0,1,15

EntityPickMode cur, 2
NameEntity cur, "cur1"

cur2=CreateSphere(8)

EntityColor cur2,55,55,55

PositionEntity cur2,0,5,20

EntityPickMode cur2, 2
NameEntity cur2, "cur22"

;pln=CreatePlane()

;tex=LoadTexture("floor.jpg")

;ScaleTexture tex,10,10

;EntityTexture pln,tex

Repeat

If MouseHit(1) = True
  pos = CameraPick(cam,MouseX(),MouseY())

  If pos
          name$ = EntityName(pos)
          If name = "cur1"
              EntityColor cur, 155,155,155
                kr1=1
     
          If name = "cur22"
              EntityColor cur2, 100,100,210
                kr2=1

          EndIf

          EndIf

       
  EndIf
EndIf
   
    If MouseHit(2) = True And kr1=1

        mh%=MouseX()
        mj%=MouseY()
        mk%=MouseZ()

        MoveEntity cur,mh*.01,mj*0.01,0

    EndIf
   
    If MouseHit(2) = True And kr2=1

        mh%=MouseX()
        mj%=MouseY()
        mk%=MouseZ()

        MoveEntity cur2,mh*.01,0,-mj*0.01

    EndIf

UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End

Создал две сферы, одна выделяется вторая нет... Движения как такового тоже нет. Сфера перепрыгивает не совсем понятно куда.
Помогите пожалуйста реализовать, лучше не используя тот бред, который я написал. Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!

Shtamp 11.02.2013 08:01

Ответ: Перемещение объектов
 
вместо mousehit() лучше использовать Getmouse()
Эм, если будет время отпишусь)

St_AnGer 11.02.2013 10:50

Ответ: Перемещение объектов
 
Цитата:

Сообщение от ligala (Сообщение 252357)
Помогите пожалуйста. Необходимо создать несколько объектов (к примеру 5), чтобы при клики на одном из них он выделялся (менял цвет, типа активный, либо рамка появлялась). Затем, при клике в любой части экрана, данный объект начинал туда перемещаться.
Я новичок в этом деле... написал, что-то типа такого


Graphics3D 840,580

SetBuffer BackBuffer()

kr1=0;
kr2=0;

cam=CreateCamera()

PositionEntity cam,0,5,0


lit=CreateLight()

cur=CreateSphere(8)

EntityColor cur,255,215,0

PositionEntity cur,0,1,15

EntityPickMode cur, 2
NameEntity cur, "cur1"

cur2=CreateSphere(8)

EntityColor cur2,55,55,55

PositionEntity cur2,0,5,20

EntityPickMode cur2, 2
NameEntity cur2, "cur22"

;pln=CreatePlane()

;tex=LoadTexture("floor.jpg")

;ScaleTexture tex,10,10

;EntityTexture pln,tex

Repeat

If MouseHit(1) = True
pos = CameraPick(cam,MouseX(),MouseY())

If pos
name$ = EntityName(pos)
If name = "cur1"
EntityColor cur, 155,155,155
kr1=1

If name = "cur22"
EntityColor cur2, 100,100,210
kr2=1

EndIf

EndIf


EndIf
EndIf

If MouseHit(2) = True And kr1=1

mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()

MoveEntity cur,mh*.01,mj*0.01,0

EndIf

If MouseHit(2) = True And kr2=1

mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()

MoveEntity cur2,mh*.01,0,-mj*0.01

EndIf

UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End


Создал две сферы, одна выделяется вторая нет... Движения как такового тоже нет. Сфера перепрыгивает не совсем понятно куда.
Помогите пожалуйста реализовать, лучше не используя тот бред, который я написал. Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!



Ну прям сразу - MouseX/Y/Z узнаёт координаты указателя мыши на экране, а не в 3d-пространстве. Поэтому и сфера у тебя перемещается в непонятно какие координаты.

Что бы узнать место куда ты ткнул мышью в 3d-пространстве нужно создать какую нибудь поверхность с EntityPickMode равное 2 (у тебя был plane, раскоментируй например его), если не нравится скрыть её с помощью EntityAlpha, почитать справку и использовать следующие команды при нажатии на кнопку мыши:
CameraPick(cam, MouseX(), MouseY())
PositionEntity(cur, PickedX(), PickedY(), PickedZ()).

Это если мне не изменяет память.
Ну, думаю, пищу для размышлений дал.


апд

А вторая сфера не выделяется потому что у тебя неверно организовано условие на MouseHit(1).

Код:

If MouseHit(1) = True
        pos = CameraPick(cam,MouseX(),MouseY())
       
        If pos
                name$ = EntityName(pos)
                If name = "cur1"
                        EntityColor cur, 155,155,155
                        kr1=1
                Else if name = "cur22"
                        EntityColor cur2, 100,100,210
                        kr2=1
                EndIf
       
        EndIf
 EndIf

Сравни своё условие и как я его исправил. Разница видна.

ligala 11.02.2013 23:31

Ответ: Перемещение объектов
 
Большое спасибо! Буду думать. О результатах отпишусь!

burovalex 13.02.2013 12:21

Ответ: Перемещение объектов
 
Цитата:

Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!
И MouseHit за цикл достается только один раз, при повторном вызове результата не быдет.

Я обычно делаю так

Код:

Global mx,my,mz,msx,msy,msz,MouseHit1,mouseHit2

While ...
ReadMouse()
....
Wend
End

Function ReadMouse()
mx=MouseX()  ...
msx=MouseXSpeed()  ...
MouseHit1=MouseHit(1)
End Function

А после вызова MouseRead уже пользуешься MouseHit1 без ограничений, и сокращениями удобнее пользоватьсяв формулах

ligala 13.02.2013 23:31

Ответ: Перемещение объектов
 
Спасибо. Учту.
У меня новый набор вопросов =(
Что-то тяжело идет (5 лет не программировал)...
В общем решил, пока, сделать меню. Сделал что-то убогое, отдаленно напоминающее. Но вот не знаю как фоновую картинку вставить. Точнее вставляю, но она становится на передний план затуляя надписи (старт, выход). Может ли данная картинка быть .gif (анимацией). Помогите, пожалуйста решить данную проблему.

Вот код моего меню:

Graphics3D 640, 480, 16, 1
SetBuffer BackBuffer()

Global fontB=LoadFont("Verdana",82)
Global FontM=LoadFont("Verdana",32)

Global GameScr=0

Global aa=LoadImage("1.jpg")
;==================================
;main cycle

Repeat

Select GameScr

Case 0

UpdateStartScreen()

DrawImage aa, 0,0

End Select

Flip

Until KeyHit(1)

;=================================
;Functions
;=================================

Function UpdateStartScreen()

Cls

tShift=0
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,240-12,100,32) tShift=1
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,280-12,100,32) tShift=2

SetFont FontB ;setup font
Color 255,100,40
Text 320,150,"Project",True,True

SetFont FontM

If tShift=1 Color 0,255,0 Else Color 255,0,0
Text 320,240, "Start model",True,True

If tShift=2 Color 0,255,0 Else Color 255,0,0
Text 320,280, "Quit",True,True

Color 250,200,0

cursor=LoadImage("cursor.bmp")
DrawImage cursor, MouseX(),MouseY()
;Text MouseX(),MouseY(),"*",True,True

If MouseHit(1)

Select tShift

Case 1

End

Case 2

End

End Select

EndIf

End Function


2. Хочу добавить опции, чтобы можно было выбрать разрешение. Пока не знаю как. Или чтоб само подстраивалось по пользовательское...

3. Думал сделать не просто надписи (старт, выход), а параллелепипеды, натянуть на них текстуры, но можно ли как-то на них потом писать, т.е. поверх текстуры?

4. Не пойму как можно вставить видео при запуске игры. Типа заставки.

5. Это правда не относиться к меню, но можно ли забрать из файла матрицу, а потом вернуть преобразованную в другой файл (или хотя бы в этот же)?

6. Читал, что на цетере были статьи по созданию инвентаря, но сайт сейчас не работает, поделитесь, пожалуйста, опытом. Правда мне не инвентарь нужен, а панель состояния. Типа какое в руках у персонажа1 оружие, а какое у персонажа2 и т.д.

Люди добрые помогите, пожалуйста.

St_AnGer 14.02.2013 01:32

Ответ: Перемещение объектов
 
Цитата:

Сообщение от ligala (Сообщение 252675)
Спасибо. Учту.
У меня новый набор вопросов =(
Что-то тяжело идет (5 лет не программировал)...
В общем решил, пока, сделать меню. Сделал что-то убогое, отдаленно напоминающее. Но вот не знаю как фоновую картинку вставить. Точнее вставляю, но она становится на передний план затуляя надписи (старт, выход). Может ли данная картинка быть .gif (анимацией). Помогите, пожалуйста решить данную проблему.

Вот код моего меню:

Graphics3D 640, 480, 16, 1
SetBuffer BackBuffer()

Global fontB=LoadFont("Verdana",82)
Global FontM=LoadFont("Verdana",32)

Global GameScr=0

Global aa=LoadImage("1.jpg")
;==================================
;main cycle

Repeat

Select GameScr

Case 0

UpdateStartScreen()

DrawImage aa, 0,0

End Select

Flip

Until KeyHit(1)

;=================================
;Functions
;=================================

Function UpdateStartScreen()

Cls

tShift=0
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,240-12,100,32) tShift=1
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,280-12,100,32) tShift=2

SetFont FontB ;setup font
Color 255,100,40
Text 320,150,"Project",True,True

SetFont FontM

If tShift=1 Color 0,255,0 Else Color 255,0,0
Text 320,240, "Start model",True,True

If tShift=2 Color 0,255,0 Else Color 255,0,0
Text 320,280, "Quit",True,True

Color 250,200,0

cursor=LoadImage("cursor.bmp")
DrawImage cursor, MouseX(),MouseY()
;Text MouseX(),MouseY(),"*",True,True

If MouseHit(1)

Select tShift

Case 1

End

Case 2

End

End Select

EndIf

End Function


2. Хочу добавить опции, чтобы можно было выбрать разрешение. Пока не знаю как. Или чтоб само подстраивалось по пользовательское...

3. Думал сделать не просто надписи (старт, выход), а параллелепипеды, натянуть на них текстуры, но можно ли как-то на них потом писать, т.е. поверх текстуры?

4. Не пойму как можно вставить видео при запуске игры. Типа заставки.

5. Это правда не относиться к меню, но можно ли забрать из файла матрицу, а потом вернуть преобразованную в другой файл (или хотя бы в этот же)?

6. Читал, что на цетере были статьи по созданию инвентаря, но сайт сейчас не работает, поделитесь, пожалуйста, опытом. Правда мне не инвентарь нужен, а панель состояния. Типа какое в руках у персонажа1 оружие, а какое у персонажа2 и т.д.

Люди добрые помогите, пожалуйста.



1.
Код:

Global aa=LoadImage("1.jpg")
это я так понимаю загрузка фонового изображения? Если я правильно понял, то судя по твоему коду основного цикла оно и должно быть сверху, т.к. рисуется после всех изображений и текстов. Минимум что надо сделать - сначала отрисовывать фон, потом всё остальное. Основываясь на твоём коде это будет так:
Код:

Repeat

Select GameScr

Case 0

DrawImage aa, 0,0

UpdateStartScreen()

End Select

Flip

Until KeyHit(1)

Если в теории, то фоновое изображание вполне может быть gif-анимацией, см. пункт 4. В теории - потому что я лично не пробовал.

2. Что бы программа на блице запускалась с разрешением пользовательского экрана надо заместо разрешения экрана указать нули. В твоём случае Graphics3d 0, 0, 16, 1. Для начала этого хватит. Но вполне реально реализовать и смену разрешения, глубины и оконности, там впринципе ничего трудного и нету.

3. Реально, можно рисовать и писать в текстуры, и потом текстурировать. Смотри блицевский пример по команде CreateTexture. Но лучше использовать готовые текстуры с текстом, хотя это лично моё мнение.

4. В последних версиях блица появились команды OpenMovie, CloseMovie, DrawMovie и какие то ещё связанные с этим. Они же, кстати, открывают и рисуют *.gif картинки. В блице есть примеры по их использованию.

5.6. не компетентен в данных вопросах, хотя забать из файла и записать в файл можно что угодно, вопрос будет ли соблюдаться формат первоначального файла (если нужно конечно).

ligala 17.02.2013 16:48

Ответ: Перемещение объектов
 
Цитата:

2. Что бы программа на блице запускалась с разрешением пользовательского экрана надо заместо разрешения экрана указать нули. В твоём случае Graphics3d 0, 0, 16, 1. Для начала этого хватит. Но вполне реально реализовать и смену разрешения, глубины и оконности, там впринципе ничего трудного и нету.
Если использовать Graphics3d 0, 0, 16, 1, то как можно узнать то самое разрешение? Получается следующая беда, если писать Graphics3d 0, 0, 16, 1, то как подогнать картинки и видео под это разрешение? Возможно ли их растянуть/сузить или есть более изящное решение?

Можно подробнее про создание глубины и оконности?
Может есть утилиты для создания меню (какой-нить гуи менеджер или хз что) или примеры с коментами? Если есть какая-нибудь инфа поделитесь, пожалуйста. Т.к. помимо фона, так же съезжает и текст (start, quit и т.д., которые создаются так - Text 320,280, "Quit",True,True).

Может кто сталкивался с возможностью создания трехмерных букв, возможно даже отбрасывающих тени...

Большое спасибо за помощь!

Nex 17.02.2013 17:13

Ответ: Перемещение объектов
 
Цитата:

Сообщение от ligala (Сообщение 253021)
Если использовать Graphics3d 0, 0, 16, 1, то как можно узнать то самое разрешение?

Код:

width% = GraphicsWidth  ()
height% = GraphicsHeight ()



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

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