Проблемы с поворотом координат моего корабля - PullRequest
0 голосов
/ 02 июля 2019

Я делаю астероиды Атари в 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 внутри плоттера, так как именно в этой функции я получаюкоординаты моего корабля из динамической памяти.

...