내비게이션 액션

01. 집으로 가기

재간둥이 알버트 로봇이 맘껏 뛰어 놀다가 집으로 돌아갈 시간이 되었다. 집으로 가면서 슈퍼마켓에도 들리도록 하자.

알버트 로봇을 주어진 위치로 이동시키는 프로그램을 작성하시오.

새 프로젝트 만들기를 참고하여 안드로이드 프로젝트와 플래시 파일을 만들자. 플래시가 종료될 때 호출되는 리스너 함수를 등록하고, activate() 메소드를 호출하여 스마트 로봇 론처와 연결하도록 하자.

 import flash.events.Event;
 import org.smartrobot.android.SmartRobot;
 import org.roboid.robot.Robot;

 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
 SmartRobot.activate();

 function handleDeactivate(evt:Event):void
 {
     SmartRobot.deactivate();
 }

Navigation 액션의 객체를 얻기 위해서는 Action 클래스의 obtain(actionId:String) 메소드에서 actionId에 Action.Navigation.ID를 입력하면 된다.

 import flash.events.Event;
 import org.smartrobot.android.SmartRobot;
 import org.roboid.robot.Robot;
 import org.smartrobot.android.action.Action;

 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
 SmartRobot.activate();
 
 var action:Action = Action.obtain(Action.Navigation.ID); // 액션 객체를 얻는다.
 action.activate(); // 액션을 시작한다.

 function handleDeactivate(evt:Event):void
 {
     action.deactivate(); // 액션을 중지한다.
     action.dispose(); // 액션을 폐기한다.
     SmartRobot.deactivate();
 }

handleDeactivated 메소드에서 액션을 중지 및 폐기하였지만 어디에서 해도 상관은 없다. 플래시가 종료되기 전에 액션을 모두 폐기하여야 한다는 것만 잊지 않도록 하자.

내비게이션 패드 위에서 움직여야 하므로 사용하는 내비게이션 패드의 크기를 입력하도록 하자. Navigation 액션에는 패드 크기를 나타내는 디바이스로 COMMAND_PAD_SIZE가 있다. 여기서는 가로 108, 세로 76 크기의 패드를 사용하였다.

 import flash.events.Event;
 import org.smartrobot.android.SmartRobot;
 import org.roboid.robot.Robot;
 import org.smartrobot.android.action.Action;
 import org.roboid.robot.Device;

 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
 SmartRobot.activate();
 
 var action:Action = Action.obtain(Action.Navigation.ID);
 var padSizeDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
 padSizeDevice.writeAt(0, 108); // 가로 크기
 padSizeDevice.writeAt(1, 76); // 세로 크기
 action.activate();

 function handleDeactivate(evt:Event):void
 {
     action.deactivate();
     action.dispose();
     SmartRobot.deactivate();
 }

Navigation 액션에는 이동할 위치를 쓰는 디바이스로 COMMAND_WAYPOINTS가 있다. 알버트 로봇이 이동하는 중간 경로와 마지막 위치를 나타내며, 입력하는 배열의 크기는 2의 배수이어야 한다. 홀수 번째 값은 X축 좌표, 짝수 번째 값은 Y축 좌표 값이며, 현재 위치에서 (80, 20)으로 이동한 후 다시 (90, 50)으로 이동하고자 한다면 배열 값을 [80, 20, 90, 50]으로 입력하면 된다.

또한, 마지막 위치에 도착한 후 알버트 로봇이 바라보는 방향을 쓰는 디바이스로 COMMAND_FINAL_ORIENTATION이 있다. -179도부터 180도까지의 값을 가질 수 있으며, 내비게이션 패드의 X축 방향이 0도이다.

 import flash.events.Event;
 import org.smartrobot.android.SmartRobot;
 import org.roboid.robot.Robot;
 import org.smartrobot.android.action.Action;
 import org.roboid.robot.Device;

 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
 SmartRobot.activate();
 
 var action:Action = Action.obtain(Action.Navigation.ID);
 var padSizeDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
 padSizeDevice.writeAt(0, 108);
 padSizeDevice.writeAt(1, 76);
 var waypointsDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_WAYPOINTS);
 var finalOrientationDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_FINAL_ORIENTATION);
 waypointsDevice.writeArray([ 80, 20, 90, 50 ]); // (80, 20)으로 이동한 후 (90, 50)으로 이동한다.
 finalOrientationDevice.write(-90); // 마지막 위치에 도착한 후 -90도 방향을 바라본다.
 action.activate();

 function handleDeactivate(evt:Event):void
 {
     action.deactivate();
     action.dispose();
     SmartRobot.deactivate();
 }

집에 도착한 후에는 저녁 식사를 해야 하는데 이를 위해서는 집에 도착했다는 것을 알아야 한다. Action 클래스의 setOnCompletedListener(callback:Function) 메소드를 사용하여 내비게이션이 완료되었을 때 호출되는 리스너 함수를 등록할 수 있다.

 import flash.events.Event;
 import org.smartrobot.android.SmartRobot;
 import org.roboid.robot.Robot;
 import org.smartrobot.android.action.Action;
 import org.roboid.robot.Device;

 NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
 SmartRobot.activate();
 
 var action:Action = Action.obtain(Action.Navigation.ID);
 action.setOnCompletedListener(onActionCompleted);
 var padSizeDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_PAD_SIZE);
 padSizeDevice.writeAt(0, 108);
 padSizeDevice.writeAt(1, 76);
 var waypointsDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_WAYPOINTS);
 var finalOrientationDevice:Device = action.findDeviceById(Action.Navigation.COMMAND_FINAL_ORIENTATION);
 waypointsDevice.writeArray([ 80, 20, 90, 50 ]);
 finalOrientationDevice.write(-90);
 action.activate();

 function onActionCompleted(action:Action):void
 {
     // 액션이 완료되었다.
 }

 function handleDeactivate(evt:Event):void
 {
     action.deactivate();
     action.dispose();
     SmartRobot.deactivate();
 }