|
2D-программирование Вопросы, касающиеся двумерного программирования |
22.06.2012, 20:56
|
#1
|
ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
Выбор одного объекта или множества
Вот реализовал выбор мышью в 2д одного или несколько объектов.
Единственно пока не устранил ,если выбрать объект и прервать движение ,то следующий выбранный объект продолжит движение предыдущего.
Управление :
Выбор - левой кнопкой мыши (пикнуть или рамкой)
когда объект выбран или несколько (нажав левую кнопку )объект движется в координаты (пикнутые ).
Сброс - правая кнопка мыши
Сам код:
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
|
(Offline)
|
|
23.06.2012, 21:07
|
#2
|
ПроЭктировщик
Регистрация: 17.07.2009
Сообщений: 182
Написано 51 полезных сообщений (для 71 пользователей)
|
Ответ: Выбор одного объекта или множества
Ну вот свершилось !
вот полностью рабочий код :
кто желает может оптимизировать ...
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
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:12.
|