0
\$\begingroup\$

I am new to game development, and I have been building some game with LibGDX engine.

The following function might make you feel bad

The function I am going to show, is accepting the current rotation index of my player (player has 4 rotations, north, south, west, east). The function will return how much to jump in X to get the next tile according to his direction (angle) and the selected move (you can only select left, right or forward per turn):

public int getIncrementXForRotation(int rotationIndex) {
    switch(this) {
        case MOVE_FORWARD:
            switch(rotationIndex) {
                case Face.EAST:
                    return 1;
                case Face.SOUTH:
                    return 0;
                case Face.WEST:
                    return -1;
                case Face.NORTH:
                    return 0;
            }
        case MOVE_BACKWARD:
            switch(rotationIndex) {
                case Face.EAST:
                    return -1;
                case Face.SOUTH:
                    return 0;
                case Face.WEST:
                    return 1;
                case Face.NORTH:
                    return 0;
            }
        case MOVE_LEFT:
            switch (rotationIndex) {
                case Face.EAST:
                    return 0;
                case Face.SOUTH:
                    return 1;
                case Face.WEST:
                    return 0;
                case Face.NORTH:
                    return -1;
            }
        case MOVE_RIGHT:
            switch (rotationIndex) {
                case Face.EAST:
                    return 0;
                case Face.SOUTH:
                    return -1;
                case Face.WEST:
                    return 0;
                case Face.NORTH:
                    return 1;
            }
        case TURN_LEFT:
            switch(rotationIndex) {
                case Face.EAST:
                case Face.SOUTH:
                    return 1;
                case Face.WEST:
                case Face.NORTH:
                    return -1;
            }

        case TURN_RIGHT:
            switch(rotationIndex) {
                case Face.NORTH:
                case Face.EAST:
                    return 1;
                case Face.WEST:
                case Face.SOUTH:
                    return -1;
            }
    }
    return 0;
}

Same function for Y.

Now I looked at this, and i thought to myself.. north can be an 0, and east can be 90, and south can be 180 and west can be 270, am I right?

So there is a way to mathematically do these coordinate increment according to the angle, isn't there?

The reason I classified my player angles by `enums` is because each direction is an image.
\$\endgroup\$

1 Answer 1

1
\$\begingroup\$

Yes, you can do it with angles. However it's also easy to do it with a table. The main idea is to be consistent with directions, using 0, 1, 2, 3 in either clockwise or counterclockwise order. That way you can add directions together to represent rotations.

With tables:

int dx[4] = [1, 0, -1, 0];
int dy[4] = [0, 1, 0, -1];

public int getIncrementXForRotation(int rotationIndex) {
    /* let's assume your enum is 
        MOVE_FORWARD = 0, MOVE_RIGHT = 1, MOVE_BACKWARD = 2, MOVE_LEFT = 3
        and FACE_EAST = 0, FACE_SOUTH = 1, FACE_WEST = 2, FACE_NORTH = 3
     */
    int dir = (int(move_direction) + rotationIndex) % 4;
    return dx[dir];
}

With angles, if 0 = east, 1 = south, 2 = west, 3 = north, you can use dx = Math.cos(direction * Math.PI/2), dy = Math.sin(direction * Math.PI/2).

Depending on the orientation of your axes, you may have to flip the y direction (use -Math.sin instead of Math.sin).

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .