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

Lavatar 14.01.2009 02:16

Выбор объекта, как сделать?
 
Здорова, такой вопросик:
Создал кучу мешей и теперь надо организовать их выбор, там у меня чувак бродит-вид от первого лица, надо чтобы при наведении мыши (то бишь прицела) объект подсвечивался (то есть было видно, что на него навели мышь), а при нажатии ЛКМ осуществлялась его деактивация (причем если он не нажал ЛКМ и отвел прицел в сторону-тоже деактивация), а также какой либо счетчик считает его выбранным. Причем надо чтобы это происходило 1 раз, а потом сколько не наводи, не щелкай - ничего не происходит. Как бы один раз использовал - и все...
Уже голову сломал - и все безрезультатно, не получается...

impersonalis 14.01.2009 02:29

Ответ: Выбор объекта, как сделать?
 
CameraPick ?

NitE 14.01.2009 21:35

Re: Выбор объекта, как сделать?
 
))) делай каконить пик - потом всё что хошь, а потом поменый переменную котору проверял при пике на что-то другое (ну чтоб тока 1 раз можно было использовать)

Lavatar 14.01.2009 23:37

Ответ: Выбор объекта, как сделать?
 
Да, реализовывал выбор через CameraPick, вот функция:
Function MouseTest()
Local mx#,my#
mx#=MouseX()
my#=MouseY()
Local pick

pick=CameraPick (camera,mx#,my#); выбирает объект, находящийся в области просмотра камеры и координатах mx и my (в данном случае указателя мыши)
If pick<>0 Then ;если указатель мыши находится на объекте
SelectEntity PickedEntity()
If MausHitR Then; если нажата правая клавиша мыши
DeleteTex PickedEntity();
EndIf

If MausHitL Then
SelectBox PickedEntity()
EndIf

EndIf
End Function

А вот функции SelectEntity PickedEntity(), DeleteTex PickedEntity(), SelectBox PickedEntity() у меня реализовать никак не получалось, уже как только не пробовал...

NitE 15.01.2009 00:19

Re: Выбор объекта, как сделать?
 
Код:

Graphics3D 800,600,32,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

light=CreateLight()
cam=CreateCamera()
MoveEntity cam,0,0,-30

Type cube
Field scale#
Field cube
Field work
Field life
Field x#
Field y#
Field col1
Field col2
Field col3
End Type


Function nCreateCube()
c.cube = New cube
c\scale = Rnd(.5,1.4)
c\cube=CreateCube()
c\work=1
c\life=100
c\x=Rnd(-20,20)
c\y=Rnd(-20,20)
c\col1=Rnd(255)
c\col2=Rnd(255)
c\col3=Rnd(255)

ScaleEntity c\cube,c\scale,c\scale,c\scale
EntityColor c\cube,c\col1,c\col2,c\col3
PositionEntity c\cube,c\x,c\y,0
EntityPickMode c\cube,1
End Function







Repeat

If MouseHit(1)
pick=CameraPick(cam,MouseX(),MouseY())

ent = pick
For c.cube = Each cube
If pick=c\cube
EntityColor c\cube,255,0,0
c\work=0

EndIf
Next
EndIf



For c.cube = Each cube
If c\work=0
c\life=c\life-1
If c\life=<0
FreeEntity c\cube
Delete c
EndIf
EndIf
Next





If KeyHit(57)
For cik=1 To 5
ncreatecube()
Next
EndIf

UpdateWorld
RenderWorld


Text 20,20,pick
Flip


Until KeyHit(1)
End


Lavatar 16.01.2009 11:08

Ответ: Выбор объекта, как сделать?
 
Разобрался в твоем коде, хорошо сделан, только не совсем то... Видишь тут какая проблема, у тебя кубы исчезают после отметки, а надо сделать такую ситуацию: Допустим на доме решетка, и мне надо проверить целая ли она, я подхожу, визуально осматриваю, а после осмотра щелкаю на нее (причем когда я навожу на нее курсор-она подсвечивается). Она помечается как осмотренная, т.е. заносится в какой-то счетчик и перестает реагировать на наведение курсора и на щелчки ЛКМ. При этом если я не щелкаю на нее, а просто отвел курсор в сторону она перестает подсвечиваться, а если еще раз навел - опять подсвечивается, пока не щелкну на ней ЛКМ... такая вот задачка Решетка то никуда не девается после осмотра:)
Кстати я только начал программировать, с графикой вроде разобрался, а в типах и движении - вообще тяжело дается:)

Alex_Noc 17.01.2009 10:58

Ответ: Выбор объекта, как сделать?
 
Тип присвой обьектам пикнутым новый и все - в чем проблема то :)

Lavatar 17.01.2009 13:42

Ответ: Выбор объекта, как сделать?
 
Алекс, NitE спасибо, получилось, что хотел...

Alex_Noc 17.01.2009 22:21

Ответ: Выбор объекта, как сделать?
 
в боке спасибо нада говорить :) ---> вон тама кнопярочка

Damp 18.01.2009 11:27

Ответ: Выбор объекта, как сделать?
 
Только лучше не использовать CameraPick каждый цикл, на некоторых картах будут тормоза.
Лучше LinePick , при виде от 1-ого лица это не сложно.

Alex_Noc 28.01.2009 01:01

Ответ: Выбор объекта, как сделать?
 
А неужели не видно что не каждый цикл используеться пик , а определяеться после клика мыши :)

NitE 28.01.2009 02:52

Re: Выбор объекта, как сделать?
 
да лучше вообще блиц не использовать, тормозит уж очень...

Lavatar 28.01.2009 13:06

Ответ: Выбор объекта, как сделать?
 
Нет, не тормозит... тут еще проблема наклюнулась, создаю забор, с помощью CopyMesh размножаю, а копиям ПикМод не присваивается и получается, что только самый последний пролет на выбор реагирует, а остальной забор - нет. Перерисовывать с помощью каждый раз загружать объект неохота, там координатов много высчитывать. Может кто знает, как эту проблему решить:
Код:

.Zabor
; Создание забора через MESH объект===========================
fundament=CreateCube()
        PositionMesh fundament, 0,0,0
        ScaleMesh fundament,.16,.3,2
        PaintMesh fundament,brush5
stolb=CreateCube(): stolb2=CreateCube()
        PositionMesh stolb, xzab,0.5,zzab-9
        PositionMesh stolb2, xzab,30,zzab-7.2
        ScaleMesh stolb,.2,2,.2 :ScaleMesh stolb2,.25,.1,.25
        PaintMesh stolb,brush6: PaintMesh stolb2,brush6
ograda=CreateCube ()
        PositionMesh ograda, xzab,1.32,zzab
        ScaleMesh ograda,.0,1.3,2
        PaintMesh ograda,brush7
verx=LoadMesh ("Data\objects\verx.3ds")
        PositionMesh verx, -.07,1.9,-1.35
        ScaleMesh verx,1,1,1.2: PaintMesh verx,brush11

 ; объединение разных составляющих забора в один объект===========
;AddMesh stolb,fundament: AddMesh fundament,ograda
AddMesh stolb2,ograda: AddMesh verx,ograda: AddMesh stolb,ograda

FreeEntity stolb: FreeEntity stolb2:  FreeEntity verx

;рисуем колючую проволоку
        Koluch=CreateCylinder (28,False)
        PaintMesh Koluch,BrushKoluch: RotateMesh Koluch,90,0,0
        ScaleMesh Koluch,0.2,.2,1.8: BrushFX BrushKoluch,16
       
; Рисуем забор при помощи заданных ранее MESH ===========================================
PositionMesh ograda,-20.4,0,-18.3
PositionMesh Koluch,-20.4,3.1,-18.15
PositionMesh fundament,-20.4,0.1,-18.15
EntityFX Koluch,16: EntityPickMode ograda,2
EntityPickMode Koluch,2: EntityPickMode fundament,2
        For a=1 To 10
        CopyMesh ograda: CopyMesh Koluch: CopyMesh fundament
        PositionMesh ograda,0,0,4: PositionMesh Koluch,0,0,4
        PositionMesh fundament,0,0,4
        EntityType ograda,8: EntityType Koluch,8
        EntityFX Koluch,16: EntityPickMode ograda,2
        EntityPickMode Koluch,2: EntityPickMode fundament,2
Next
CopyMesh ograda: CopyMesh Koluch: CopyMesh fundament
PositionMesh ograda,0,0,16: PositionMesh Koluch,0,0,16
PositionMesh fundament,0,0,16
EntityType ograda,8: EntityType Koluch,8: EntityFX Koluch,16: EntityPickMode ograda,2: EntityPickMode Koluch,2
EntityPickMode fundament,2
For a=11 To 5
        CopyMesh ograda: CopyMesh Koluch: CopyMesh fundament
        PositionMesh ograda,0,0,4: PositionMesh Koluch,0,0,4
        PositionMesh fundament,0,0,4
        EntityType ograda,8: EntityType Koluch,8: EntityFX Koluch,16
        EntityPickMode ograda,2: EntityPickMode Koluch,2
        EntityPickMode fundament,2
Next


NitE 28.01.2009 15:58

Re: Выбор объекта, как сделать?
 
код читать лень но должно быть что-то вроде
Код:

zabor=loadmesh("shit")
for i=1 to 10
compymesh zabor
entitypickmode zabor,2,2
next


Lavatar 28.01.2009 18:02

Ответ: Выбор объекта, как сделать?
 
Чего-то не догоняю, откуда у entitypickmode zabor,2,2 второй параметр - цифра? В хелпе нарисовано, что он может быть только TRUE или FALSE...
В том-то и проблема, что я примерно так и делал... только объект я не грузил, а с помощью кубиков и текстур создавал... НО НЕ РАБОТАЕТ!!!
Еще вопрос - у меня игрок пока состоит из пивота, к которому крепятся камера и прямоугольник. Пытался определить расстояние от игрока до объекта (PickedEntity ()) с помощью EntityDistance (player,PickedEntity ()) - возвращает почему-то ноль, на какое бы расстояние к объекту не подходил... причем в качестве игрока проверял и камеру, и пивот и прямоугольник...


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

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