Heres a super quick try at what i think you want, its very messy and uses sprites for display purposes, but the collision detection is not reliant on the them being sprites.
Rem Project: OOBB for 2d
Rem Created: 26/02/2004 19:18:26
Rem ***** Main Source File *****
Rem Quick try to create OOBB 2d collision detection!
rem Standard Setup Code
sync on : sync rate 60 : set text font "arial" : set text size 14 :
set text to bold : randomize timer() : hide mouse
rem Setup some important Variables
Object_number=15
Control=1
speed#=2.0
collision_return=0
rem Setup some vectors
global Uvector=1
global Vvector=2
global Wvector=3
rf=make vector2(Uvector)
rf=make vector2(Vvector)
rf=make vector2(Wvector)
rem setup types
type Object_info pos_x as float pos_y as float size_x as float size_y as float angle as float endtype
type coord_info X as float Y as float endtype
rem Setup Arrays
global dim Object(Object_number) as Object_info
rem *****************************************************************************************
rem **GAME LOOP******************************************************************************
rem Create some objects using a handy function for doing so :)
create_object(68.0, 25.0, 0.0, 0.0, 0.0, 1)
create_object(50.0, 70.0, 300.0, 300.0, 30.0, 2)
`randomly generate some more objects for better test!
for o=3 to Object_number
create_object(rnd(100.0)+5.0, rnd(100.0)+5.0, rnd(640.0), rnd(480.0), rnd(360.0), o)
next o
`reset to white for text
ink rgb(255.0, 255.0, 255.0), rgb(0,0,0)
rem create simple example loop
Do
rem control one of the objects
Object(control).pos_x=mousex()
Object(control).pos_y=mousey()
if mouseclick()=1 then Object(Control).angle=Object(Control).angle-speed#
if mouseclick()=2 then Object(Control).angle=Object(Control).angle+speed#
rem check for collision between control and all other objects in the game
for o=1 to Object_number
collision_return=0
if o<>Control
collision_return=Object_collision(Control, o)
endif
if collision_return>0 then exit
next o
rem display all of the objects
for o=1 to Object_number
rotate sprite o, Object(o).angle
paste sprite o, Object(o).pos_x, Object(o).pos_y
next o
`display a collision result if nessecary
text 0, 0, "Move the mouse to move one of the shapes, press mouse buttons to rotate"
text 0, 15, "COLLISION RESULT : " + str$(collision_return)
Sync
Loop
rem *****************************************************************************************
rem **FUNCTIONS WAZ ERE**********************************************************************
function Object_collision(ObjA, ObjB)
dim coord(2,4) as coord_info
rem firstly find four corners of both rectangles, which is simple really :).
for o=1 to 2
if o=1 then obj=ObjA
if o=2 then obj=ObjB
for c=1 to 4
if c=1 then signa#=-1.0 : signb#=-1.0
if c=2 then signa#=1.0 : signb#=-1.0
if c=3 then signa#=1.0 : signb#=1.0
if c=4 then signa#=-1.0 : signb#=1.0
coord(o,c).X=((signa#*object(obj).size_x/2.0)*cos(-object(obj).angle)) + ((signb#*object(obj).size_y/2.0)*sin(-object(obj).angle))+object(obj).pos_x
coord(o,c).Y=((-1.0*signa#*object(obj).size_x/2.0)*sin(-object(obj).angle)) + ((signb#*object(obj).size_y/2.0)*cos(-object(obj).angle))+object(obj).pos_y
next c
next o
rem check for intersection between all the lines!
intersection_result=0
return_value=0
for lineA=1 to 4
coordA1=lineA : coordA2=lineA+1
if coordA2>4 then coordA2=1
for lineB=1 to 4
coordB1=lineB : coordB2=lineB+1
if coordB2>4 then coordB2=1
intersection_result=intersect_test(coord(1,coordA1).X, coord(1,coordA1).Y, coord(1,coordA2).X, coord(1,coordA2).Y, coord(2,coordB1).X, coord(2,coordB1).Y, coord(2,coordB2).X, coord(2,coordB2).Y)
if intersection_result=1 then exit
next lineB
if intersection_result=1 then exit
next lineA
if intersection_result=1 then return_value=ObjB
endfunction return_value
`*******************************************************************************************
function intersect_test(X1 as float, Y1 as float, X2 as float, Y2 as float, X3 as float, Y3 as float, X4 as float, Y4 as float)
`setup variables
SMALL_NUM#=0.00000001
D as float
DU as float
DV as float
SI as float
TI as float
`default negative result
collision_return=0
set vector2 Uvector, X2-X1, Y2-Y1
set vector2 Vvector, X4-X3, Y4-Y3
set vector2 Wvector, X1-X3, Y1-Y3
D=perp(Uvector, Vvector)
`test if parallel lines
if abs(D)>SMALL_NUM#
SI=perp(Vvector, Wvector)/D
If SI>0 and SI<1
TI=perp(Uvector, Wvector)/D
If TI>0 and TI<1
collision_return=1
endif
endif
endif
endfunction collision_return
rem Calculate the perp product
function perp(VectorA, VectorB)
D as float
D=((x vector2(VectorA) * y vector2(VectorB)) - (y vector2(VectorA) * x vector2(VectorB)))
endfunction D
`*******************************************************************************************
function create_object(X as float, Y as float, pos_x as float, pos_y as float, angle as float, Number as integer)
Rem Firstly create the sprite
create bitmap 1, X, Y
ink rgb(rnd(255), rnd(255), rnd(255)), rgb(0, 0, 0)
box 0, 0, X, Y
get image Number, 0, 0, X, Y, 1
delete bitmap 1
Sprite Number, 0, 0, Number
offset sprite Number, X/2.0, Y/2.0
Hide sprite Number
Rem Setup array variables for easy access
Object(Number).pos_x=pos_x
Object(Number).pos_y=pos_y
Object(Number).size_x=X
Object(Number).size_y=Y
Object(Number).angle=angle
endfunction
EDIT: oops made a silly mistake
Defying the convention of an upright avatar since 1985