Beispiel #1
0
        /// <summary>
        /// Called every frame from Robot.update() if it's the current state (top of the stack)
        /// </summary>
        /// <param name="r">The robot to update</param>
        public override void update(Robot r)
        {
            bool finished = false;

            ////////////////////////////////////////////////////////////////////////////////////////
            // Initialize variables if necessary when first enter state
            ////////////////////////////////////////////////////////////////////////////////////////
            if (!initialized)
            {
                initialized = true;

                if (r.carriedResource == null)
                {
                    resume = true;
                }
                else
                {
                    Log.e(LogTag.ROBOT, "Initializing RobotPlaceResource, but robot is already carrying object.");
                    finished = true;
                }
            }

            ////////////////////////////////////////////////////////////////////////////////////////
            // Reset variables if robot is returning from another state
            ////////////////////////////////////////////////////////////////////////////////////////
            if (resume)
            {
                resume = false;

                Vector2 robotPosition = new Vector2(r.body.transform.position.x,
                                                    r.body.transform.position.z);
                if (Vector2.Distance(robotPosition, position) > retrievalDistance)
                {
                    r.pushState(new RobotStateTurn(position));
                    r.pushState(new RobotStateMove(position, retrievalDistance));
                }
                else
                {
                    GameObject resource = r.getObjectInFront();
                    if (resource != null && resource.CompareTag("Resource"))
                    {
                        Log.w(LogTag.ROBOT, "Robot " + r.id + " has picked up " + resource.transform.name);
                        resource.transform.SetParent(r.body.transform);
                        resource.transform.position = new Vector3(r.body.transform.position.x, 1.5f, r.body.transform.position.z);
                        r.carriedResource           = resource;
                        finished = true;
                    }
                    else
                    {
                        Log.e(LogTag.ROBOT, "Robot " + r.id + " isn't facing any resources");
                        r.pushState(new RobotStateSleep(2.0f)); // allow other robots to move out of the way
                    }
                }
            }

            ////////////////////////////////////////////////////////////////////////////////////////
            // Update: intentionally empty
            ////////////////////////////////////////////////////////////////////////////////////////

            ////////////////////////////////////////////////////////////////////////////////////////
            // Process messages: disabled here
            ////////////////////////////////////////////////////////////////////////////////////////

            ////////////////////////////////////////////////////////////////////////////////////////
            // "Clean up" robot state
            ////////////////////////////////////////////////////////////////////////////////////////
            if (finished)
            {
                r.popState();
            }
        }