Microsoft Small Basic

Program Listing: CQV406-0
' Sample of Another Turtle 0.2
' Copyright (c) 2012 Nonki Takahashi. All rights reserved.
'
' History:
' 0.2 2012/11/28 Added AT_MoveTo() and AT_Turn(CQV406-0).
' 0.1 2012/11/25 Created. (CQV406)
'
AT_Init()
AT_Show()
Turtle.Show()
Turtle.PenUp()
distance = 20
GraphicsWindow.KeyDown = OnKeyDown
Timer.Interval = 1000
Timer.Tick = OnTick

Sub OnTick
Turtle.Move(distance)
AT_Move()
EndSub

Sub OnKeyDown
key = GraphicsWindow.LastKey
If key = "Right" Then
angle = 90
Turtle.Turn(angle)
AT_Turn()
ElseIf key = "Left" THen
angle = -90
Turtle.Turn(angle)
AT_Turn()
EndIf
angle = Turtle.Angle
GraphicsWindow.Title = angle
EndSub

Sub AT_Init
' Another Turtle | Initialize
AT_SIZE = 16
AT_OFFSET = AT_SIZE / 2 - 2
AT_obj = Shapes.AddImage("http://www.nonkit.com/smallbasic.files/AnotherTurtle.png")
Shapes.HideShape(AT_obj)
AT_x = Turtle.X
AT_y = Turtle.Y
AT_angle = Turtle.Angle
Shapes.Move(AT_obj, AT_x - AT_OFFSET, AT_y - AT_OFFSET)
EndSub

Sub AT_Show
' Another Turtle | Show
Shapes.ShowShape(AT_obj)
EndSub

Sub AT_Move
' Another Turtle | Move
' param distance
AT_x = AT_x + distance * Math.Sin(Math.GetRadians(AT_angle))
AT_y = AT_y - distance * Math.Cos(Math.GetRadians(AT_angle))
Shapes.Animate(AT_obj, AT_x - AT_OFFSET, AT_y - AT_OFFSET, 1000)
EndSub

Sub AT_MoveTo
' Another Turtle | Move to given position
' param x
' param y
Stack.PushValue("local", x)
Stack.PushValue("local", y)
x = x - AT_x
y = y - AT_y
Math_CartesianToPolar()
angle = a + 90 - AT_angle
distance = r
AT_Turn()
AT_Move()
y = Stack.PopValue("local")
x = Stack.PopValue("local")
EndSub

Sub AT_Turn
' Another Turtle | Turn Right
' param angle
If angle > 0 Then
sa = 1
Else
sa = -1
EndIf
For a = AT_angle To AT_angle + angle Step sa
Shapes.Rotate(AT_obj, a)
Program.Delay(5)
EndFor
AT_angle = AT_angle + angle
If AT_angle < 0 Then
AT_angle = AT_angle + 360
ElseIf 360 <= AT_angle Then
AT_angle = AT_angle - 360
EndIf
EndSub

Sub AT_TurnRight
' Another Turtle | Turn Right
For angle = AT_angle To AT_angle + 90
Shapes.Rotate(AT_obj, angle)
Program.Delay(5)
EndFor
AT_angle = angle - 1
EndSub

Sub Math_CartesianToPolar
' Math | convert cartesian coodinate to polar coordinate
' param x, y - cartesian coordinate
' return r, a - polar coordinate
r = Math.SquareRoot(x * x + y * y)
If x = 0 And y > 0 Then
a = 90 ' [degree]
ElseIf x = 0 And y < 0 Then
a = -90
Else
a = Math.ArcTan(y / x) * 180 / Math.Pi
EndIf
If x < 0 Then
a = a + 180
ElseIf x > 0 And y < 0 Then
a = a + 360
EndIf
EndSub