[bmx] collision by Jesse [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:42

Previous topic - Next topic

BlitzBot

Title : collision
Author : Jesse
Posted : 1+ years ago

Description : a way to checks if a point is inside the rectangular area of a rotated image.  
with a little bit of modifications, it can work with any size  rotated rectangle.


Code :
Code (blitzmax) Select
SuperStrict
Type Tentity

Field x:Float
Field y:Float
Field image:TImage
Field angle:Float
Field x1:Float
Field y1:Float
Field x3:Float
Field y3:Float

Function Create:Tentity(x:Float,y:Float,image:TImage,angle:Float)
Local e:Tentity = New Tentity
e.x = x
e.y = y
e.image = image
e.angle = angle
e.x1:Float = -image.handle_x
e.y1:Float = -image.handle_y
e.x3:Float =  image.width - image.handle_x
e.y3:Float =  image.height - image.handle_y
Return e
End Function

Method collidedpoint:Int(px:Float,py:Float)
px = px - x
py = py - y
Local tx:Float = px*Cos(-angle) - py*Sin(-angle)
Local ty:Float = py*Cos(-angle) + px*Sin(-angle)  
If tx > x1  
If ty >y1
If tx < x3
If ty < y3
Return True
EndIf
EndIf
EndIf
EndIf
Return False
End Method

Method display()
SetRotation angle
DrawImage image,x,y
SetRotation 0
DrawOval x-3,y-3,6,6
End Method

End Type

Local img:TImage = CreateImage(64,64)
Local pixls:Int Ptr = Int Ptr(LockImage(img).pixels)
For Local i:Int = 0 Until img.width*img.height
pixls[Rand(img.width*img.height-1)] = $ff00ff00
Next

SetImageHandle img,32,-32

Graphics 800,600
Local entity:tentity = Tentity.Create(300,300,img,45)

Local angle:Float  = 0

Repeat
Cls()
entity.angle = angle
If entity.collidedpoint(MouseX(),MouseY())
DrawText "collided",400,300
EndIf
entity.display()
angle :-.5
Flip()
Until KeyDown(key_escape)


Comments : none...