forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   В какой объект ткнули (http://forum.boolean.name/showthread.php?t=4883)

Данил 28.10.2007 22:04

В какой объект ткнули
 
Незнаю, поймете ли вы меня... В общем над этой проблемой уже целый день мучаюсь...

Имеется объекты Окно1 и Окно2. Они оба находятся в одном листе. Выполнчет обновление по очереди - ОкноN .


Нужно узнать, куда ткнули. То есть, в какой объект именно.


Проблема в том, что постоянно получается, что ткнули по объекту не тому. То есть, если у нас Окно1 внизу, а Окно2 выше, но в списках по другому, а ткнули мы, допустим, как на рисунке, то получается, что выбрано Окно1, а не Окно2. Хотя оно выше. То есть мы выбрали объект через другой (визуально).

Так же все объкты имеют переменную Z. Окно1 , допустим, Z=0, а Окно2 : Z=1 . Как-то надо с этими высотами работать, и , сделать так, чтобы через верхний объект нельзя было выбрать нижний.


В общем, как-то из-за положения в списке и из-за Z у нас получается выбрать объект через объект.. как-то надо сделать ограничение, но моего ума не хватило... *даун* ...

Надеюсь ,вы меня поняли. помогите, плиз. Объясните... промучалсо весь день... :"(
[blitz]

Global SGUIWindow:TList=New TList
Global GUI_Z = 0
Global MX, MY, MD, MH


'Главный тип
Type TGUI
Field Name$
Field X,Y
Field Width,Height

Field Text$
Field Image

Field Z
'Прорисовка

Field Visible
'0 - не рисуем
'1 - рисуем темным
'2 - Рисуем нормально

Field Number
'Группа.
Field DrapNDrop[4]

Method UpdateWindow ()

If MH=1 And MX > X And MX < X + width And MY > Y And MY < Y + Height Then GUI_Z:+1 ; Z=GUI_Z
'Таскаем окно
'Если нажали на той полоске, то записываем координаты мыши - х координата окна
If MH=1 And MX > X And MX < X + width And MY > Y And MY < Y + 25 Then
DrapNDrop[0] = MX-X
DrapNDrop[1] = MY-Y
DrapNDrop[2] = 1
End If

'Если драпдроп включен, то перемещаем.
If DrapNDrop[2] = 1
X = MX-DrapNDrop[0]
Y = MY-DrapNDrop[1]
End If

'Если не нажата, то выклчаем драпндроп
If MD=0 Then DrapNDrop[2] = 0
End Method

Method DrawWindow ()
//РИСУЕМ
End Method

Function CreateGUI_Window:TGUI (x,y,width,height,text$,name$,button,number,Visibl e )
Local GUI_Window:TGUI=New TGUI
//СОЗДАЕМ
GUI_Window.z = GUI_Z
GUI_Z:+1
ListAddLast(SGUIWindow , GUI_Window)
Return GUI_Window
End Function

End Type




TGUI.CreateGUI_Window (5,5,630,445,"Create Game","Window",0,1,1 )
TGUI.CreateGUI_Window (120,5,30,45,"Create","Window",0,2,1 )

While Not KeyDown (Key_Escape)
Cls
TileImage Image

MX = MouseX()
MY = MouseY()
MD = MouseDown(1)
MH = MouseHit(1)
Value=GetChar()

For i = 0 To GUI_Z

For GUI_Window:TGUI=EachIn SGUIWindow
If GUI_Window.Z = i Then GUI_Window.UpdateWindow ; GUI_Window.DrawWindow ()
Next

Next

Flip
Wend

[/blitz]

Данил 28.10.2007 22:11

Re: В какой объект ткнули
 
Кстати, если таскать маленькое окно через большое, то фокус так же остается над большим. но надо, чтобы вообще нельзя было таскать маленькое через большое (и большое через маленькое, и т.д..)

jimon 28.10.2007 22:14

Re: В какой объект ткнули
 
Данил
обрабатывай только то окно которое находится активным (в фокусе)
остальные отрубай из цикла обновления

Данил 28.10.2007 22:16

Re: В какой объект ткнули
 
Хм. А как же быть? Ну, как выбрать-то другое окно... Если выбрано Окно1, но нет коллизии визуально. А надо выбрать Окно2... Как в таком случае быть?

johnk 28.10.2007 22:34

Re: В какой объект ткнули
 
Реализуй возможность "таскания" окон.

Данил 28.10.2007 22:55

Re: В какой объект ткнули
 
Реализовано уже.

jimon 28.10.2007 23:26

Re: В какой объект ткнули
 
Данил
если не можеж представить всю работу ГУИ с фокусом
то тогда сортируй список окон по их видимости :)

Данил 28.10.2007 23:32

Re: В какой объект ткнули
 
jimon
Ну, список, сам, вроде как, сортировать не обязательно. у меня идет соритровка объектов по мере возрастания Z.


Как сделать, чтобы через один объект нельзя ыбло попасть по другому? какое ограничение?

If MouseX()>X And MouseX()<X+Width And MouseY()>Y And MouseY()<Y+Height Then ...

Я уже как-то сделал, что фокус остается на окне, если мы нажимаем через него на другое. ЭТо правильно. Но нижне окно можно таскать через верхнее. .как это исправить. .надо какую-то проверку на координаты.. хз толко какую..

jimon 28.10.2007 23:37

Re: В какой объект ткнули
 
если курсор попадает в рабочую область окна которое находится в фокусе
то нафиг обрезать остальное обновление

если курсор попадает на заголовок окна - работать с заголовком

Данил 29.10.2007 00:30

Re: В какой объект ткнули
 
jimon
Спасибо! Оказывается так все просто. 3 сточки кода ,при чем одна из них - End if... класс. .и все работает.. осталось убрать тока странное мерчание этих самых окон.. и будет все круто..

moka 29.10.2007 12:46

Re: В какой объект ткнули
 
Я сделал так: завожу список сортировки, и рендерю исходя из него окна, и обновляю тоже, поэтому обновляються сперва те что самые ближние, и далее по мере заслонённости, тем самым, если мы выбрали какое-то окно, присваеваем его эллемент к глобале, и уже далее если эта переменная <> Null, просто у других окон даже не проверяем на выделение. Оптимально. ;)
Важно только Оптимально реализовать сортировку списка, отвечающего за последовательность рендеров и обновлений.

Данил 29.10.2007 12:47

Re: В какой объект ткнули
 
Хы. Я как-то все через жопу, извиняюсь, сделал ,но почему-то все нормалньо работает... как всегда...


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

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