我正在使用C ++,Allegro5和代码块。在写一个非常基本的Asteroids敲门之前,我正在尝试编写一个测试程序。唯一的规则是使用C ++,Allegro,没有精灵或位图(这特别需要使用线条和形状等基元)。
我在quadrant1中绘制形状,在相对原点平移的quadrant2中重绘它,将其重新绘制为旋转一定角度的三个,最后在quadrant4中重新绘制它。
第1部分和第2部分工作正常。我的问题是旋转功能。它没有旋转正确的量,或根本没有旋转。小于90时,它会旋转输入度数的一半。之后,它不会旋转或根本不绘制。
我将在下面发布旋转方法代码。我知道它很臃肿,需要清理(我只是修改了一些修复1,2和4的逻辑),但我真的需要旋转方面的帮助。 我想我正在使用atan2而且我已经转向了
void rotation (float degrees)
{
ALLEGRO_COLOR color_black = al_map_rgb(0,0,0);
ALLEGRO_COLOR color_blue = al_map_rgb(150,150,150);
ALLEGRO_COLOR color_orange = al_map_rgb(255,135,135);
ALLEGRO_COLOR color_red = al_map_rgb(255,0,0);
al_clear_to_color(al_map_rgb(255,255,255)); //clear screen to white
//draw black grid
al_draw_line(400,0, 400,600, color_black, 4.0);
al_draw_line(0,300, 800,300, color_black, 4.0);
al_draw_line(200,0, 200,600, color_black, 1.0);
al_draw_line(600,0, 600,600, color_black, 1.0);
al_draw_line(0,150, 800,150, color_black, 1.0);
al_draw_line(0,450, 800,450, color_black, 1.0);
float rx[13], ry[13];
float phi, theta, radius; //phi original angle theta added angle of rotation
float ycenter = 0, xcenter = 0; //later will be used with varying object position
theta = degrees * PI/180.0;
for (int i = 0; i < 13; i++)
{
phi = atan2(yarray[i], xarray[i]);
radius = sqrt(pow((xarray[i]-xcenter),2.0) + pow((yarray[i]-ycenter),2.0));
rx[i] = xarray[i] + radius * cos(phi + theta);
ry[i] = yarray[i] + radius * sin(phi + theta);
}
float x = quad[2][0];
float y = quad[2][1];
al_draw_triangle(x+rx[0],y+ry[0], x+rx[1],y+ry[1], x+rx[2],y+ry[2], color_red, 10);
al_draw_filled_triangle(x+rx[3],y+ry[3], x+rx[4],y+ry[4], x+rx[5],y+ry[5], color_orange);
al_draw_filled_triangle(x+rx[6],y+ry[6], x+rx[7],y+ry[7], x+rx[8],y+ry[8], color_blue); //body
al_draw_filled_triangle(x+rx[9],y+ry[9], x+rx[10],y+ry[10], x+rx[11],y+ry[11],color_blue); //wing
al_draw_filled_ellipse(x+rx[12],y+ry[12], 4, 8, color_black); //cockpit
al_flip_display();
}
答案 0 :(得分:0)
我用纸张和大量的印刷声明完成了所有的回答。我不得不删除rx和ry的xarray和yarray。见下文。
rx[i] = radius * cos(phi + theta);
ry[i] = radius * sin(phi + theta);
内容替换 rx [i] = xarray [i] + radius * cos(phi + theta); ry [i] = yarray [i] + radius * sin(phi + theta);