I am writing a player controller and I am getting the player movement on two axes (X, Y). The values can roughly be -1, 0, 1 on each axis. Positive values point UP and to the RIGHT. It is impossible for both values to be zero based on a previous check I make.
Based on their combination I want to determine the direction the player is facing. There are eight possible directions for the player to take. I use the enum: FacingDirection, to pass the direction.
Example to clarify:
IfX = 1andY = 0then the player is moving towards the RIGHT side of the screen.If
X = -1andY = -1then the player is moving towards DOWN LEFT corner of the screen.
I have come up with two possible solutions to this problem, but I wish to know which one is more efficient.
Both solutions use _inputs, which is a 2D vector, to get the values for X and Y.
Solution A
private FacingDirection findMoveDirection() {
int x = 0, y = 0;
float testing = _inputs.x;
for(int i = 0; i < 2; i++) {
int temp;
if (testing != 0) {
temp = (testing > 0) ? 1 : -1;
} else {
temp = 0;
}
if (i < 1) {
x = temp;
} else {
y = temp;
break;
}
testing = _inputs.y;
}
int check = x + y;
switch (check) {
case 2 : {
return FacingDirection.UP_RIGHT;
}
case -2 : {
return FacingDirection.DOWN_LEFT;
}
case 1 : {
if (x > 0) {
return FacingDirection.RIGHT;
} else {
return FacingDirection.UP;
}
}
case 0 : {
if (x > 0) {
return FacingDirection.DOWN_RIGHT;
} else {
return FacingDirection.UP_LEFT;
}
}
case -1 : {
if (x < 0) {
return FacingDirection.LEFT;
} else {
return FacingDirection.DOWN;
}
}
default : {
Debug.LogWarning("Something went wrong while determining moving direction. Returning DOWN as moving direction.");
return FacingDirection.DOWN;
}
}
Solution B
This is a more straight-forward if/else approach.
private FacingDirection findMoveDirection() {
float x = _inputs.x, y = _inputs.y;
if (x != 0) {
if (x > 0) {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_RIGHT;
} else {
return FacingDirection.DOWN_RIGHT;
}
} else {
return FacingDirection.RIGHT;
}
} else {
if (y != 0) {
if (y > 0) {
return FacingDirection.UP_LEFT;
} else {
return FacingDirection.DOWN_LEFT;
}
} else {
return FacingDirection.LEFT;
}
}
} else {
if (y > 0) {
return FacingDirection.UP;
} else {
return FacingDirection.DOWN;
}
}
}