AppTitle "RTS Unit Selection Example by Eikon 03.30.05" ; Updated 05.16.06 to deselect units not in rect and ; to also support inverted select rects (drawn backwards) Graphics 640, 480, 16, 2 SetBuffer BackBuffer() SeedRnd MilliSecs() Type Obj Field X%, Y% Field C%[2], Char$ Field Sel End Type For i = 1 To 10 ; Create 10 random units o.Obj = New Obj o\X = Rand(40, 600): o\Y = Rand(20, 460) ; Position o\Char$ = Chr$(Rand(33, 126)) ; Character o\Sel = False ; Not Selected ; Color o\C[0] = Rand(78, 255) o\C[1] = Rand(78, 255) o\C[2] = Rand(78, 255) Next Global mX, mY While Not KeyDown(1) For o.Obj = Each Obj If o\Sel = False Color o\C[0], o\C[1], o\C[2] Else Color 255, 255, 0 Text o\X, o\Y, o\Char$ Next If MouseDown(1) Then ; Begin dragging If mX + mY = 0 Then mX = MouseX(): mY = MouseY() ; Mark start point Else ; Release If mX + mY <> 0 Then ; User was selecting tmpX = mX: tmpY = mY tmpX2 = MouseX(): tmpY2 = MouseY() If MouseX() < mX Then tmpX = MouseX(): tmpX2 = mX ; Invert rect x If MouseY() < mY Then tmpY = MouseY(): tmpY2 = mY ; Invert rect y ; Check for selected units For o.Obj = Each Obj If o\X >= tmpX And o\X <= tmpX + (tmpX2 - tmpX) And o\Y > tmpY And o\Y <= tmpY + (tmpY2 - tmpY) Then ; Inside the rect o\Sel = True Else ; Not selected o\Sel = False EndIf Next EndIf mX = 0: mY = 0 ; Reset EndIf If mX + mY <> 0 Then ; User is selecting tmpX = mX: tmpY = mY tmpX2 = MouseX(): tmpY2 = MouseY() If MouseX() < mX Then tmpX = MouseX(): tmpX2 = mX ; Invert rect x If MouseY() < mY Then tmpY = MouseY(): tmpY2 = mY ; Invert rect y Color 0, 255, 0: Rect tmpX, tmpY, tmpX2 - tmpX, tmpY2 - tmpY, 0 ; Draw Selection Rect EndIf Color 255, 255, 255: Text 1, 1, "Click and drag to select units" Flip: Cls Wend: End