Ola, sou Lísias e gostaria de saber se alguém poderia me ajudar nessa tarefa tão difícil para finalizar minha biblioteca.
Eu fiz um motor de jogos, e nele já consegui implementar todas as funções básicas para um uso primário. Fazendo a criação de jogos simples através dela.
Mas estou desenvolvendo um rpg, e resolvi fazer com que os personagens atirem a longa distância. Porém, para que isso aconteça, tenho que fazer com que o objeto a ser atirado sempre corra em linha reta.
Criei uma função que faz com que todos os objetos se movam na tela, mas ela não funciona de uma maneira linear. O que posso modificar nessa função para que ela me proporcione isso?
static STATUS place_user_move(OBJECT_SET * U, BP32 x, BP32 y) {
if (U == NULL)return (Off);
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);
}
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);
return (place_user_move(U, x, y));
}
return (Off);
}
#define sign(x) ((x > 0) ? 1 : ((x < 0) ? -1 : 0) )
PLACE_CALL STATUS PLACE_TYPE place_user_straight(CHAINED * user, BP32 x1, BP32 y1) {
if (user && USER_C(user->it)->object && bit_is_on(USER_C(user->it)->object->status, OBJECT_VISIBLE)) {
OBJECT_SET * O = USER_C(user->it)->object;
BP32 dx, dy;
dx = x1 - O->x_route;
dy = y1 - O->y_route;
static BP32 x = -1, y = -1, p = -1;
if (x == -1)x = O->x_route;
if (y == -1)y = O->y_route;
if (p == -1)p = 2 * dy - dx;
printf("x %lf y %lf\n", x, y);
if (x < x1) {
if (p >= 0) {
y = y + 1;
p = p + 2 * dy - 2 * dx;
} else {
p = p + 2 * dy;
}
x = x + 1;
} else {
O->x_route = x;
O->y_route = y;
x = -1;
y = -1;
p = -1;
return (On);
}
O->x_route = x;
O->y_route = y;
x = -1;
y = -1;
p = -1;
}
return (Off);
}
Esses são os códigos que já fiz, tentei adaptar o ultimo com o Bresenham.
Mas até agora não tive sucesso.
Alguém sabe o que alterar para funcionar?
Aqui está meu motor funcionando e uma animação do meu jogo: