Hi guys thanks for all the replies, I suppose it was hard to explain what I'm trying to do. Here's what I have so far, you will see what I mean, it's just trying to move to the closest point on screen depending on the direction the user presses. It's nearly there (thanks for the tips) but its just not working right.
If anyone can see what I'm trying to do and can point out where I'm going wrong that would be great.
Thanks again,AL.
Function FindAngle#( x1#,y1#,x2#,y2# )
a#=ATan2(x2-x1,y2-y1)
Return 180-a#
End Function
Function Distance#(x#,y#,z#,x2#,y2#,z2#)
value#=Sqr((x#-x2#)*(x#-x2#)+(y#-y2#)*(y#-y2#)+(z#-z2#)*(z#-z2#))
Return value#
End Function
Function TurnDirection(facing#,pivot#)
diff = facing#-pivot
While diff>180
diff=diff-360
Wend
While diff<-180
diff=diff+360
Wend
If diff<0 Then Return -1 Else Return 1
Return 0
End Function
Type LocationBox
Field x:Float
Field y:Float
Field width:Int
Field height:Int
Field angle:Float
Field distance:Float
Method Compare(otherObject:Object)
l:LocationBox = LocationBox(otherObject)
Return distance - l.distance
End Method
End Type
Type Scaler
'
' The scalerbox is a cursor type object that also holds a list of on screen targets
'
'
Field x:Float ' current x position
Field y:Float ' current y position
Field targetX:Float
Field targetY:Float
Field newx1# , newy1# , plong# , phigh# , dist# , highv# , longv#
Field list:TList=CreateList()
Field closest:LocationBox=Null
Field minang#=999'
Field mindist#=9999'
Method SetTarget(x,y)
'
' Sets the initial x,y coordinates of the target
'
targetX=x
targetY=y
End Method
Method FindTarget(direction)
'
' Pass this a direction and it will setup new target coordinates by
' parsing the target list and finding the closest object with an angle
' closest to the required direction
'
' 0: Up(0)
' 1: Right(90)
' 2: Down(180)
' 3: Left(270)
'
'
'
For a:LocationBox=EachIn list
a.angle=FindAngle( x, y, a.x, a.y )
a.distance=Distance( a.x, a.y, 0, x, y, 0)
'Print a.angle
'Print a.distance+", "+a.angle
Next
'Print ""
'SortList list ' list is now sorted with the closest nodes at the top
' now we need to find the node with the angle closest to the supplied angle
minang#=999'
mindist#=9999'
closest=Null
For a:LocationBox=EachIn list
'
' 360/0
'
' 270 x 90
'
' 180
'
' Print a.angle
' Print a.distance+", "+a.angle
'
If direction=1
If a.x>x
If Abs(a.angle-90)>10 And Abs(a.angle-90)<50 And a.distance>10 And a.distance<mindist
mingang=Abs(a.angle-90)
mindist=a.distance
closest=a
End If
End If
End If
If direction=2
If a.y>y
If Abs(a.angle-180)>10 And Abs(a.angle-180)<50 And a.distance>10 And a.distance<mindist
mingang=Abs(a.angle-180)
mindist=a.distance
closest=a
End If
End If
End If
If direction=3
If a.x<x
If Abs(a.angle-270)>10 And Abs(a.angle-270)<50 And a.distance>10 And a.distance<mindist
mingang=Abs(a.angle-270)
mindist=a.distance
closest=a
End If
End If
End If
If direction=4
If a.y<y
If a.angle>270 Then
If Abs(a.angle-360)>10 And Abs(a.angle-360)<50 And a.distance>10 And a.distance<mindist
mingang=Abs(a.angle-360)
mindist=a.distance
closest=a
End If
Else
If a.angle>10 And a.angle<50 And a.distance>10 And a.distance<mindist
mingang=a.angle
mindist=a.distance
closest=a
End If
End If
End If
End If
If closest<>Null
targetX=closest.x
targetY=closest.y
End If
Next
End Method
Method AddTarget(x, y, width, height)
'
' Adds a new target for the cursor
'
locations:LocationBox = New LocationBox
locations.x = x
locations.y = y
locations.width = width
locations.height = height
ListAddLast list,locations
End Method
Method Update()
'
' Called every frame, moves the cursor to the current target coordinates.
'
plong=x-(adjustx#+targetX)
phigh=y-(adjusty#+targetY)
If phigh<0 Then highv=-1 Else highv=1
If plong<0 Then longv=-1 Else longv=1
dist=0+Sqr((plong*longv)+(phigh*highv))
adjustx:+(plong/dist)
adjusty:+(phigh/dist)
x:-adjustx
y:-adjusty
For a:LocationBox=EachIn list
DrawRect a.x, a.y, a.width, a.height
DrawText Abs(a.angle-90), a.x, a.y+20
Next
For a:LocationBox=EachIn list
a.angle=FindAngle( x, y, a.x, a.y )
a.distance=Distance( a.x, a.y, 0, x, y, 0)
'Print a.angle
'Print a.distance+", "+a.angle
DrawText mingang+","+mindist,200,200
Next
End Method
End Type
Type hbox Extends Scaler
Field image:TImage
Method New()' constructor
'DrawText "Initialised" , 0 , 0
ImageName:String="http::www.2dgamecreators.com/tutorials/gameprogramming/basic/blobship_1-1.png"
image:TImage=LoadImage(LoadBank(ImageName))
If image=Null
Print "Not able to load image file. Program aborting"
End
EndIf
End Method
Method Delete() 'destructor
'DrawText "Terminated" , 0 , 20
End Method
Method Render()
Update()
Update()
'DrawText x+" "+y, 100,100
'DrawText x , 100 , 100
SetBlend(ALPHABLEND)
SetAlpha(.75)
DrawImage image, x-ImageWidth(image)/2, y-ImageHeight(image)/2
SetAlpha(1)
SetBlend(SOLIDBLEND)
End Method
End Type
Graphics 1024,768,32
SetColor 255,0,255
test:hbox = New hbox
test.AddTarget(50, 50, 10, 10)
test.AddTarget(150, 100, 10, 10)
test.AddTarget(250, 200, 10, 10)
test.AddTarget(650, 100, 10, 10)
test.AddTarget(50, 400, 10, 10)
test.AddTarget(450, 500, 10, 10)
test.AddTarget(750, 600, 10, 10)
'test.SetTarget(10, 10)
test.FindTarget(1)
While Not KeyHit(KEY_ESCAPE)
test.Render()
'test.FindTarget(2)
'If KeyHit(KEY_RIGHT) test.SetTarget(900, 20)
If KeyHit(KEY_RIGHT) test.FindTarget(1)
If KeyHit(KEY_DOWN) test.FindTarget(2)
If KeyHit(KEY_LEFT) test.FindTarget(3)
If KeyHit(KEY_UP) test.FindTarget(4)
'x1#=0
'y1#=0
'x2#=MouseX()
'y2#=MouseY()
'z1#=0
'z2#=0
'DrawText Sqr((x1#-x2#)*(x1#-x2#)+(y1#-y2#)*(y1#-y2#)+(z1#-z2#)*(z1#-z2#)),0,0
'DrawText FindAngle( 1024/2,768/2,MouseX(),MouseY() ),500,500
Flip 1
Cls
Wend
'WaitKey