Title : RTS Drag Select
Author : zoqfotpik
Posted : 1+ years ago
Description : This is the drag select we're all familiar with from RTS games. Knock yourselves out.
Code :
' RTS Drag Select
' By ZoqFotPik
Type dragrect ' a mousedrag rect
Field upperleft:Int, upperright:Int, lowerleft:Int, lowerright:Int
End Type
Global objects:TList = New TList
Type selectobject
Field x:Int
Field y:Int
Field selected:Int
Method draw()
SetColor 255,255,255
DrawRect x-5,y-5,10,10
If selected = 1
SetColor 0,255,0
DrawRect x-10,y-10,15,15
EndIf
End Method
End Type
Graphics 640, 480
For i = 1 To 100
Local tempobj:selectobject = New selectobject
tempobj.x = Rand(640)
tempobj.y = Rand(480)
objects.addlast(tempobj)
Next
Global selectx:Int
Global selecty:Int ' these are the x and y origins of a select box
Global selectflag:Int ' is a selectbox active?
Print leastof(5,10)
Print greaterof(5,10)
While Not KeyHit(KEY_ESCAPE)
Cls
If MouseDown(1)
If Selectflag = 0
selectflag = 1
selectx = MouseX()
selecty = MouseY()
EndIf
EndIf
Local tempobj2:selectobject = New selectobject
For tempobj2 = EachIn objects
tempobj2.draw()
Next
If selectflag = 1
SetColor 0,255,0
DrawLine selectx, selecty, MouseX(), selecty
DrawLine MouseX(),selecty, MouseX(),MouseY()
DrawLine MouseX(),MouseY(), selectx,MouseY()
DrawLine selectx,MouseY(),selectx,selecty
If Not MouseDown(1)
selectflag = 0
Local ux:Int = leastof (MouseX(),selectx)
Local uy:Int = leastof(MouseY(),selecty)
Local lx:Int = greaterof(MouseX(),selectx)
Local ly:Int = greaterof(MouseY(),selecty)
For tempobj2 = EachIn objects
If tempobj2.x > ux And tempobj2.y > uy And tempobj2.x<lx And tempobj2.y <ly
tempobj2.selected = 1
Else
tempobj2.selected = 0
EndIf
Next
EndIf
EndIf
Flip
Wend
'leastof and greaterof are necessary in case of a leftward or upward drag of the select box
Function leastof(n1:Int, n2:Int)
Local least:Int
If n1>n2 least = n2
If n2>n1 least = n1
Return least
End Function
Function greaterof(n1:Int, n2:Int)
Local greater:Int
If n1>n2 greater= n1
If n2>n1 greater= n2
Return greater
End Function
Comments :
virtlands(Posted 1+ years ago)
{ The files are actually *.BMX files. }Color Cycling and Procedural Critters :: <font class="tiny"> <a href="http://uploadingit.com/file/xnrveey7fjoc93mk/Color Cycling and Procedural Critters_3089.bmx" target="_blank">http://uploadingit.com/file/xnrveey7fjoc93mk/Color%20Cycling%20and%20Procedural%20Critters_3089.bmx</a> </font>RTS Drag Effect :: <font class="tiny"> <a href="http://uploadingit.com/file/dmoxb7q8pplmotpz/RTS Drag Select_3088.bmx" target="_blank">http://uploadingit.com/file/dmoxb7q8pplmotpz/RTS%20Drag%20Select_3088.bmx</a> </font>Image Recursion :: <font class="tiny"> <a href="http://uploadingit.com/file/kv2u1husmv3ulyob/Image Recursion_3087.bmx" target="_blank">http://uploadingit.com/file/kv2u1husmv3ulyob/Image%20Recursion_3087.bmx</a> </font>[ RTS Drag Effect screenshot: ][img]imagizer.imageshack.us/a/img802/8319/y4bf.html"> [img]imagizer.imageshack.us/a/img571/3012/gjjc.html">
_PJ_(Posted 1+ years ago)
What might be of note, that whenever dragging a selection rectangle, the change of state between selected and non-selected only ever occurs when the rectangle boundary intersects with the dimensions of the position of the entities.Therefore, depending on how many potential selectable entities there are, it may be quicker to check for this 'collision' rather than continuous checks for the positions of every entity.