линия траектории в с - PullRequest
0 голосов
/ 02 июля 2019

Я создаю двигатель.Почти все работает нормально.Я даже могу делать игры с этим.

Я играю в ролевые игры и решил позволить точкам стрелять друг в друга.У меня уже есть функция для перемещения точек.Но эта функция не линейна.

Итак, это то место, куда я не могу пойти.Мне нужно изменить эту функцию, чтобы сделать эти траектории линейными.Таким образом, я могу запустить пулю или стрелку в точках, и это будет прямо к ним.

Это функция, которую я сейчас имею:

PLACE_CALL STATUS PLACE_TYPE place_user_route(CHAINED * user, BP32 x, BP32 y) {
    if (user && USER_C(user->it)->object && bit_is_on(USER_C(user->it)->object->status, OBJECT_VISIBLE)) {
        OBJECT_SET * U = USER_C(user->it)->object;
        if (U->x_route == x && U->y_route == y) {
            obj_where_stop_all(U);
            return (On);
        }
        //printf("xs %f ys %f\n",object->x_speed,object->y_speed);
        if (U->x_route == x) {
            if (U->y_route > y) {
                U->y_route += -U->y_speed;
                U->where_stop_but(U, NORTH);
                if (U->y_route < y) {
                    U->y_route = y;
                    U->where_stop(U);
                    return (On);
                }
            }
            if (U->y_route < y) {
                U->y_route += U->y_speed;
                U->where_stop_but(U, SOUTH);
                if (U->y_route > y) {
                    U->where_stop(U);
                    U->y_route = y;
                    return (On);
                }
            }
            return (Off);
        }
        if (U->y_route == y) {
            if (U->x_route > x) {
                U->x_route += -U->x_speed;
                U->where_stop_but(U, WEST);
                if (U->x_route < x) {
                    U->where_stop(U);
                    U->x_route = x;
                    return (On);
                }
            }
            if (U->x_route < x) {
                U->x_route += U->x_speed;
                U->where_stop_but(U, EAST);
                if (U->x_route > x) {
                    U->where_stop(U);
                    U->x_route = x;
                    return (On);
                }
            }

            return (Off);
        }
        if (U->x_route > x) {
            U->x_route += -U->x_speed;
            if (U->x_route < x)U->x_route = x;
            if (U->y_route > y) {
                U->y_route += -U->y_speed;
                U->where_stop_but_and(U, NORTH, WEST);
                if (U->y_route < y)U->y_route = y;
            }
            if (U->y_route < y) {
                U->where_stop_but_and(U, SOUTH, WEST);
                U->y_route += U->y_speed;
            }
        }
        if (U->x_route < x) {
            U->x_route += U->x_speed;
            if (U->x_route > x)U->x_route = x;
            if (U->y_route < y) {
                U->y_route += U->y_speed;
                U->where_stop_but_and(U, SOUTH, EAST);
                if (U->y_route > y)U->y_route = y;
            }
            if (U->y_route > y) {
                U->y_route += -U->y_speed;
                U->where_stop_but_and(U, NORTH, EAST);
                if (U->y_route < y)U->y_route = y;
            }
        }
    }
    return (Off);
}

что я могу изменить для этого кодавести себя как прямо?

Вот часть игровой работы:

https://www.youtube.com/watch?v=nuLi_lB6c4Y&feature=youtu.be

Вот функция, которую я сделал, но она не совсем прямая;

PLACE_CALL void straight_line(CHAINED * user, BP32 x, BP32 y) {
    if (user) {
        OBJECT_SET * U = USER_C(user->it)->object;
        BP32 x_distancy = (x > U->x_route) ? round(x - U->x_route) : round(U->x_route - x);
        BP32 y_distancy = (y > U->y_route) ? round(y - U->y_route) : round(U->y_route - y);
        if (x_distancy && y_distancy) {
            if (x_distancy != y_distancy) {
                //if (U->x_speed_old != U->x_speed)U->x_speed_old = U->x_speed;
                //if (U->y_speed_old != U->y_speed)U->y_speed_old = U->y_speed;
                U->x_speed = (x_distancy / y_distancy) * U->resistance;
                U->y_speed = (y_distancy / x_distancy) * U->resistance;
            } else {
                if (U->x_speed != U->y_speed) {
                    //if (U->x_speed_old != U->x_speed)U->x_speed_old = U->x_speed;
                    //if (U->y_speed_old != U->y_speed)U->y_speed_old = U->y_speed;
                    U->x_speed = (U->x_speed > U->y_speed) ? U->x_speed : U->y_speed;
                    U->y_speed = (U->y_speed > U->x_speed) ? U->y_speed : U->x_speed;
                }
            }
        } else {
            if (!x_distancy && !y_distancy) {
                //U->x_speed = U->x_speed_old;
                //U->y_speed = U->y_speed_old;
                U->x_route = x;
                U->y_route = y;
            }
            if (x_distancy && !y_distancy) {
                U->x_speed = (x_distancy / (x_distancy * U->resistance));
                //U->y_speed = U->y_speed_old;
                U->y_route = y;
            }
            if (y_distancy && !x_distancy) {
                U->y_speed = (y_distancy / (y_distancy * U->resistance));
                //U->x_speed = U->x_speed_old;
                U->x_route = x;
            }
            if (U->x_speed < 1 && U->y_speed < 1) {
                //U->x_speed = U->x_speed_old;
                //U->y_speed = U->y_speed_old;
                U->x_route = x;
                U->y_route = y;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...