Я создаю двигатель.Почти все работает нормально.Я даже могу делать игры с этим.
Я играю в ролевые игры и решил позволить точкам стрелять друг в друга.У меня уже есть функция для перемещения точек.Но эта функция не линейна.
Итак, это то место, куда я не могу пойти.Мне нужно изменить эту функцию, чтобы сделать эти траектории линейными.Таким образом, я могу запустить пулю или стрелку в точках, и это будет прямо к ним.
Это функция, которую я сейчас имею:
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;
}
}
}
}