refactored PlayerController.move