Я делаю астероиды Атари в C. Когда я использую rotate_coordinates()
координаты корабля под определенным углом, корабль начинает вращаться вокруг своей оси со скоростью;если я увеличу угол, это увеличит скорость этого вращения.Я использую библиотеки SDL2 для создания всей графической части игры.
У меня есть тип структуры ship_t
, где он имеет все параметры моего корабля:
typedef struct{
float x_pos;
float y_pos;
float vx;
float vy;
float angle;
float power;
}ship_t;
Затем, в основном я запрашиваю память для указателя на ship_t, я создаю корабль с начальными координатами.
ship_t *ship = malloc(sizeof(ship_t));
ship_new(ship);
Затем начинается время, в случаях нажатия клавиш функции получаютуказатель на ship_t, чтобы иметь возможность изменять угол и мощность корабля.
case SDLK_RIGHT:
ship_rotate_right(ship);
//This returns ship->angle += (PI/20)
break;
case SDLK_LEFT:
ship_rotate_left(ship);
//This returns ship->angle -= (PI/20)
break;
Затем, пока я вызываю функцию, которая строит график корабля:
ship_draw(ship);
Где ship_draw ():
ship_draw(const ship_t *ship){
plotter("SHIP", scale, ship->x_pos, ship->y_pos, ship->angle);
}
Моя функция для построения каждого спрайта в игре:
bool plotter(const *char name,float scale ,float x, float y, float angle){
sprite_t *ptr = malloc(sizeof(sprite_t));
if(ptr==NULL)
return false;
// I have all the sprites on a list that previously load in dynamic memory.
// I search the name of my sprite(in this case the SHIP) and then
// I get the coordinates with the pointer ptr.
ptr = list_search(lista_sprites,name,strcmp);
//ptr->n is the length of the rows of the matrix that contains the coordinates of the SHIP
rotate_coordinates(ptr->coords,ptr->n,angle);
for(int i=0 ; i < ptr->n -1; i++)
SDL_RenderDrawLine(
renderer,
ptr->coords[i][0] * scale + x,
WINDOW_HIGH - (ptr->coords[i][1] * scale + y),
ptr->coords[i+1][0] * scale +x ,
WINDOW_HIGH - (ptr->coords[i+1][1] * scale + y)
);
return true;
}
У меня есть функция rotate_coordinates()
, которая выглядит следующим образом:
void rotate_coordinates(float p[][2],size_t len,float angle){
size_t i;
float x_new,y_new;
float calc_cos = cos(angle);
float calc_sin = sin(angle);
for(i=0;i<len;i++){
x_new = p[i][0]*calc_cos - p[i][1]*calc_sin;
y_new = p[i][0]*calc_sin + p[i][1]*calc_cos;
p[i][0] = x_new;
p[i][1] = y_new;
}
}
Корабль должен вращать меня только на шаг, который я даю ему, это PI / 20. Но вращается вокруг своей оси.То же самое для астероидов, они всегда вращаются вокруг своей оси.
С другой стороны, мне нужно, если я вызываю функцию rotate_coordinates
внутри плоттера, так как именно в этой функции я получаюкоординаты моего корабля из динамической памяти.