none
Pac-Man is moving too fast RRS feed

  • Question

  • I am making a pac-man clone on unity using c# using a node based movement system at each turn. The problem is instead of moving at a set speed pac-man moved ridiculously fast.

    could anybody please help. I have pasted the code below.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class PacMan : MonoBehaviour {
        
        public float speed = 2.0f;

        private Vector2 direction = Vector2.zero;
        private Vector2 nextDirection;

        private Node currentNode, previousNode, targetNode;

    // Use this for initialization
    void Start () {

            Node node = GetNodeAtPosition(transform.localPosition);

            if (node != null) {

                currentNode = node;
                Debug.Log (currentNode);
            }

            direction = Vector2.left;
            ChangePosition (direction);
    }

    // Update is called once per frame
    void Update () {

            CheckInput ();

            Move();

            UpdateOrientation();
    }

        void CheckInput () {

            if (Input.GetKeyDown (KeyCode.LeftArrow)) {

                ChangePosition(Vector2.left);

            } else if (Input.GetKeyDown (KeyCode.RightArrow)) {

                ChangePosition(Vector2.right);

            } else if (Input.GetKeyDown (KeyCode.UpArrow)) {

                ChangePosition(Vector2.up);

            } else if (Input.GetKeyDown (KeyCode.DownArrow)) {

                ChangePosition(Vector2.down);
            }
        }

        void ChangePosition (Vector2 d) {

            if (d != direction)
                nextDirection = d;

            if (currentNode != null) {

                Node moveToNode = CanMove (d);

                if (moveToNode != null) {

                    direction = d;
                    targetNode = moveToNode;
                    previousNode = currentNode;
                    currentNode = null;
             
                }
            }
        }

        void Move () {

            if (targetNode != currentNode && targetNode != null) {

                if (OverShotTarget ()) {

                    currentNode = targetNode;

                    transform.localPosition = currentNode.transform.position;

                    Node moveToNode = CanMove (nextDirection);

                    if (moveToNode != null)
                        direction = nextDirection;

                    if (moveToNode == null)
                        moveToNode = CanMove(direction);

                    if (moveToNode != null)
                    {

                        targetNode = moveToNode;
                        previousNode = currentNode;
                        currentNode = null;

                    } else {
                        direction = Vector2.zero;
                    }

                } else {

                    transform.localPosition += (Vector3)(direction * speed) * Time.deltaTime;
                }
            }
        }

        void MoveToNode (Vector2 d) {

            Node moveToNode = CanMove (d);

            if (moveToNode != null) {

                transform.localPosition = moveToNode.transform.position;
                currentNode = moveToNode;
            }
        }

        void UpdateOrientation() {

            if (direction == Vector2.left) {

                transform.localScale = new Vector3(-1, 1, 1);
                transform.localRotation = Quaternion.Euler(0, 0, 0);

            } else if (direction == Vector2.right) {

                transform.localScale = new Vector3(1, 1, 1);
                transform.localRotation = Quaternion.Euler(0, 0, 0);

            }
            else if (direction == Vector2.up) {

                transform.localScale = new Vector3(1, 1, 1);
                transform.localRotation = Quaternion.Euler(0, 0, 90);

            } else if (direction == Vector2.down) {

                transform.localScale = new Vector3(1, 1, 1);
                transform.localRotation = Quaternion.Euler(0, 0, 270);

            }
        }

        Node CanMove (Vector2 d) {

            Node moveToNode = null;

            for (int i = 0; i < currentNode.neighbours.Length; i++) {

                if (currentNode.validDirections [i] == d) {

                    moveToNode = currentNode = currentNode.neighbours[i];
                    break;
                }
            }

            return moveToNode;
        }

        Node GetNodeAtPosition (Vector2 pos) {

            GameObject tile = GameObject.Find ("Game").GetComponent<GameBoard> ().board[(int)pos.x, (int)pos.y];

            if (tile != null) {

                return tile.GetComponent<Node>();
            }

            return null;
        }

        bool OverShotTarget () {

            float nodeToTarget = LengthFromNode(targetNode.transform.position);
            float nodeToSelf = LengthFromNode(transform.localPosition);

            return nodeToSelf > nodeToTarget;
        }

        float LengthFromNode (Vector2 targetPosition) {

            Vector2 vec = targetPosition - (Vector2)previousNode.transform.position;
            return vec.sqrMagnitude;
        }

    }


    Wednesday, October 3, 2018 7:48 AM

All replies

  • Hi,

    I don't know what is included in unity engine but you need some time sync. It should sync you game tick with real time, so it's the same speed on any hardware und you can control the speed. Maybe there is already something in the engine to do this.

    Greetings, Chris


    • Edited by DerChris88 Wednesday, October 3, 2018 9:52 AM
    Wednesday, October 3, 2018 9:52 AM
  • This is really a question for the Unity forums, but if you look at the many many examples provided by Unity you will see that it provides a means for determining your framerate and synching your time.

    E.g. Unity - Manual: Time and Framerate Managment

    • Proposed as answer by DerChris88 Wednesday, October 3, 2018 11:33 AM
    Wednesday, October 3, 2018 10:55 AM