Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 22.06.2012, 20:56   #1
polopok
ПроЭктировщик
 
Регистрация: 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
polopok
ПроЭктировщик
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com