forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Выбор одного объекта или множества (http://forum.boolean.name/showthread.php?t=16950)

polopok 22.06.2012 20:56

Выбор одного объекта или множества
 
Вот реализовал выбор мышью в 2д одного или несколько объектов.
Единственно пока не устранил ,если выбрать объект и прервать движение ,то следующий выбранный объект продолжит движение предыдущего.

Управление :
Выбор - левой кнопкой мыши (пикнуть или рамкой)
когда объект выбран или несколько (нажав левую кнопку )объект движется в координаты (пикнутые :-D ).
Сброс - правая кнопка мыши
Сам код:
Код:

Global a.tip
Global mouse=False , sel = False

Type tip
        Field x , y , selected
End Type

For i = 0 To 10
        a.tip = New tip
        a\x = Rnd(100,700)
        a\y = Rnd(100,500)
        a\selected = False
Next


        Graphics 800,600,2
SetBuffer BackBuffer()


While Not KeyHit(1)
ClsColor 100,100,120
Cls


For aa.tip = Each tip

        If MouseDown(2)=True Then
        aa\selected = False
        sel = False
        mouse=False
        oldx =MouseX()
        oldy =MouseY()
        dx=MouseX()
        dy=MouseY()
        End If

If sel = False Then
                If mouse=False Then
                        If MouseDown(1)=True Then
                                mouse=True
                                oldx =MouseX()
                                oldy =MouseY()
                                dx=MouseX()
                                dy=MouseY()
                        End If
                Else
                        dx=MouseX()
                        dy=MouseY()
                        If MouseDown(1)=False Then
                                mouse=False
                        End If
                End If

        If dx<oldx  Then
                x=dx
                w=oldx -dx
        Else
                x=oldx
                w=dx-oldx
        End If
        If dy<oldy Then
                y=dy
                h=oldy-dy
        Else
                y=oldy
                h=dy-oldy
        End If

        If mouse=True Then
                Line  dx ,dy , oldx ,dy
                Line  oldx ,dy , oldx ,oldy
                Line  oldx ,oldy , dx ,oldy
                Line  dx ,oldy , dx ,dy       
        End If
       
        If RectsOverlap(aa\x-5,aa\y-5,10,10,x,y,w,h)=True Or Dis(dx,dy, aa\x,aa\y)<25 Then
        aa\selected = True
        If mouse = False Then sel = True
        Else
        aa\selected = False
        sel = False
        End If
               
Else
        If MouseDown(1)=True Then
                down = True
                dxx=MouseX()
                dyy=MouseY()
        Else
                If aa\x = dxx And aa\y = dyy Then down = False
        End If
End If


       
        If aa\selected = True Then
                        If down = True
                                If aa\x < dxx Then aa\x = aa\x +1
                                If aa\x > dxx Then aa\x = aa\x -1
                                If aa\y < dyy Then aa\y =aa\y +1
                                If aa\y > dyy Then aa\y =aa\y -1
                        End If
                Text aa\x,aa\y-10,"select"                       
        End If

        Text aa\x+2,aa\y+2,"@"
        Plot aa\x+5,aa\y+5
Next


       
        Text 10,20,"dx - "+dx+" dy - "+dy+" oldx - "+oldx +" oldy - "+oldy+" dxx - "+dxx+" dyy - "+dyy 
        Text 10,30," sel - "+sel +" down - "+down+" mouse - "+mouse
Flip
Wend
Delete Each tip
End

Function Dis(X1,Y1, xx,yy)
Return Abs(((xx-X1)*(xx-X1)+(yy-Y1)*(yy-Y1))^0.5)
End Function


polopok 23.06.2012 21:07

Ответ: Выбор одного объекта или множества
 
Ну вот свершилось ! :wild:
вот полностью рабочий код :
кто желает может оптимизировать ...

Код:

Global a.tip
Global mouse=False , sel = False , down = False

Type tip
        Field x , y , x2 , y2 , selected
End Type

For i = 0 To 100
        a.tip = New tip
        a\x = Rnd(100,700)
        a\y = Rnd(100,500)
        a\x2 =0
        a\y2 =0
        a\selected = False
Next


        Graphics 800,600,2
SetBuffer BackBuffer()
speed = 1 ;скорость движения

While Not KeyHit(1)
ClsColor 100,100,120
Cls


For aa.tip = Each tip
;FlushMouse

        If MouseDown(2)=True Then
                aa\selected = False
                sel = False
                mouse=False
                dist = 0
                oldx =MouseX()
                oldy =MouseY()
                dx=MouseX()
                dy=MouseY()
                aa\x2=0
                aa\y2=0
        End If

       
If sel = False Then
                If mouse=False Then
                        If MouseDown(1)=True Then
                                mouse=True
                                oldx =MouseX()
                                oldy =MouseY()
                                dx=MouseX()
                                dy=MouseY()
                        End If
                Else
                                dx=MouseX()
                                dy=MouseY()
                        If MouseDown(1)=False Then
                                mouse=False
                        End If
                End If

        If mouse=True Then
                Line  dx ,dy , oldx ,dy
                Line  oldx ,dy , oldx ,oldy
                Line  oldx ,oldy , dx ,oldy
                Line  dx ,oldy , dx ,dy       
        End If
       
        If dx<oldx  Then
                x=dx
                w=oldx -dx
        Else
                x=oldx
                w=dx-oldx
        End If
        If dy<oldy Then
                y=dy
                h=oldy-dy
        Else
                y=oldy
                h=dy-oldy
        End If
       
        If RectsOverlap(aa\x-5,aa\y-5,10,10,x,y,w,h)=True Or Dis(dx,dy, aa\x,aa\y)<25 Then
        aa\selected = True
        If mouse = False Then sel = True
        Else
        aa\selected = False
        sel = False
        End If
               
Else
                       

                If MouseDown(1)=True Then
                        down = True
                        aa\x2=MouseX()
                        aa\y2=MouseY()
                        dist = Abs(((aa\x-aa\x2)*(aa\x-aa\x2)+(aa\y-aa\y2)*(aa\y-aa\y2))^0.5) 
                End If
End If
Next
For aa.tip = Each tip
                                For aa2.tip = Each tip
                                        If aa2 <> aa Then       
                                                If Abs(((aa\x-aa2\x)*(aa\x-aa2\x)+(aa\y-aa2\y)*(aa\y-aa2\y))^0.5) < 10 Then ; дистанция столкновения объектов (10 - радиус )
                                                        Local  f = Rnd (1,4)
                                                        Select f
                                                                Case 1
                                                                        aa2\x2= aa2\x2+ 10 ; отклонение объектов (10 - дистанция смещения )
                                                                        aa2\y2 = aa2\y2+10       
                                                                Case 2
                                                                        aa2\x2=  aa2\x2+ 10       
                                                                        aa2\y2 = aa2\y2- 10                                                       
                                                                Case 3
                                                                        aa2\x2= aa2\x2- 10       
                                                                        aa2\y2 = aa2\y2+ 10
                                                                Case 4
                                                                        aa2\x2= aa2\x2- 10       
                                                                        aa2\y2 = aa2\y2- 10
                                                        End Select

                                                EndIf
                                        EndIf                       
                                Next               
                                       
                        If dist  = 0 Then
                        down = False
                        aa\x = aa\x
                        aa\y = aa\y                               
                        End If

        If aa\selected = True Then
       
                        If down = True And dist > 0 Then
                        friction = speed * dist / 25
                                If aa\x < aa\x2 Then aa\x = aa\x + friction
                                If aa\x > aa\x2 Then aa\x = aa\x - friction
                                If aa\y < aa\y2 Then aa\y =aa\y + friction
                                If aa\y > aa\y2 Then aa\y =aa\y - friction                       
                        End If
                Text aa\x,aa\y-10,"select"                       
        End If

        Text aa\x+2,aa\y+2,"@"
        Plot aa\x+5,aa\y+5
       
Next


       
        Text 10,20,"dx - "+dx+" dy - "+dy+" oldx - "+oldx +" oldy - "+oldy+" dxx - "+dxx+" dyy - "+dyy 
        Text 10,30," sel - "+sel +" down - "+down+" mouse - "+mouse
Flip
Wend
Delete Each tip
End

Function Dis(X1,Y1, xx,yy)
Return Abs(((xx-X1)*(xx-X1)+(yy-Y1)*(yy-Y1))^0.5)
End Function



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

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