我正在编写一个小程序,其中有25个点的数组。每个点都有自己的位置,大小和颜色,并且在使用图形库(Allegro)时,我有一种在屏幕上打印它们的方法。
我需要同时打印并使用:
for (int i = 0; i < m_size ; i++)
{
points[i].move();
points[i].draw();
}
一个接一个地打印它们。绝对更好的方法是:
for (int i = 0; i < m_size ; i++)
{
points[0].move();
points[0].draw();
points[1].move();
points[1].draw();
// ...
points[24].move();
points[24].draw();
}
这当然不是最佳解决方案;但效果很好。问题是,有没有办法将第二个选项减少到更少的行数?
编辑:
void Particula::move(){
// Modifies private position attributes.
m_x += rand() % 50;
m_y += rand() % 50;
}
void Particula::draw(){
// Draws the point given its private attributes.
printf("Drawing circle... \n");
// printf ("[ DEBUG:] X: %f, Y: %f, Radius: %f", m_x, m_y, m_radius);
al_draw_filled_circle(m_x, m_y, m_radius, m_color); // Draws the point.
al_flip_display(); // Updates the display.
}
预期结果是:
答案 0 :(得分:0)
如果我理解正确,那么您的第二个代码块应该只执行一次,没有for
循环。否则,将一次又一次打印这些点。
绝对更好的是...
根据这种理解,这是“绝对”错误的。您必须编写冗长且可能错误的代码;它没有比for
循环版本更优化-如果(它认为)解压缩更好,则普通编译器会解压缩循环。 (通常是正确的),因此不需要手动拆包。
答案 1 :(得分:0)
据我阅读的Allegro文档,渲染似乎是基于类似位图的对象完成的。 因此,您可以尝试先将点绘制到缓冲区位图,例如
BITMAP *bmp = create_bitmap(320, 200); // make a bitmap in RAM
clear_bitmap(bmp); // zero the memory bitmap
putpixel(bmp, x, y, color); // draw onto the memory bitmap
blit(bmp, screen, 0, 0, 0, 0, 320, 200); // copy it to the screen
但对于每个点都使用for循环。
请注意,这只是假设的结果,因为我从未使用过Allegro。
代码从以下位置复制:http://www.allegro.free.fr/onlinedocs/en/index009.html
答案 2 :(得分:0)
像这样修改代码就可以了:
for(int i = 0; i < N; i++) // being N a variable number.
{
for (int h = 0; h < m_size; h++)
{
point[h].move();
point[h].draw();
}
al_flip_display();
al_clear_to_color(al_map_rgb(0,0,0));
al_rest(0.1);
}