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
\$\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\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.