A
awesomiser0207
Guest
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 == d) {
moveToNode = currentNode = currentNode.neighbours;
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;
}
}
Continue reading...
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 == d) {
moveToNode = currentNode = currentNode.neighbours;
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;
}
}
Continue reading...