【问题标题】:What am I doing wrong with this for loop?我在这个 for 循环中做错了什么?
【发布时间】:2012-12-23 09:43:00
【问题描述】:

我正在使用 SDL 编写一段 C 代码,该代码应该用黑色和白色像素填充屏幕...它使用 for 循环填充屏幕并使用随机数来确定每个像素是黑色还是白色的。

它开始正常工作一秒钟,但它慢慢开始显示越来越多的白色像素,直到屏幕完全变白并保持这种状态。我不明白我在这里做错了什么。我让它在控制台中打印 num 中的数字,即使屏幕是白色的,它也会继续显示随机的 1 和 0,所以我认为问题存在于 if else 语句或 for 循环中的某个地方。

这是相关代码...

 /*outside main program loop*/
 17   int x, y, num;
 18   srand(time(0));

 /*inside main program loop*/
 28     for(y=0;y<=480;y++) { 
 29       for(x=0;x<=640;x++) {
 30         num = rand() % 2;
 31         if(num == 0) {
 32           pixelRGBA(screen, x, y, 255, 255, 255, 255);
 33         }
 34         else {
 35           pixelRGBA(screen, x, y, 0, 0, 0, 0);
 36         }
 37       }
 38     } 
 39     SDL_Flip(screen);

【问题讨论】:

  • 顺便说一句:srand(time(0)); 是中世纪。如果你不需要它来获得视觉效果,请不要随机化。

标签: c random for-loop sdl


【解决方案1】:

两个问题:

pixelRGBA(screen, x, y, 0, 0, 0, 0);

RGBA 表示您有 alpha,并且您已将 alpha 设置为透明,因此它不会渲染任何黑色像素。当 alpha 混合时,像素将乘以 alpha,现有像素乘以逆,然后将两个像素相加。因此,如果 alpha 为零,您将不会获得新像素和所有现有像素。

此外,您的循环是

for(y=0;y<480;y++)
{ 
    for(x=0;x<640;x++)
    {
        num = rand() % 2;
        if(num == 0) {
            pixelRGBA(screen, x, y, 255, 255, 255, 255);
        } else {
            pixelRGBA(screen, x, y, 0, 0, 0, 255);
        }
    }
} 

【讨论】:

    【解决方案2】:

    在一种情况下,您使颜色完全不透明,而在另一种情况下则完全透明。虽然 RGB 值确实应该在一种情况下为 0,在另一种情况下为 255,但我认为这两种情况下的 Alpha 值应该相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-12
      • 2018-05-30
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多