SDL,随机颜色发生器

时间:2012-11-15 20:40:02

标签: c++ random colors sdl

我的朋友为我的SDL程序提供了一些代码,我知道它是随机颜色,但我不知道它是如何工作的,这里是代码

 int unsigned temp = 10101;//seed
    for(int y = 0;y < times;y++){
        temp = temp*(y+y+1);
        temp = (temp^(0xffffff))>>2;
        //printf("%x\n",temp);
        SDL_FillRect(sprite[y],NULL,temp);
        SDL_BlitSurface(sprite[y],&paste[y],rScreen(),NULL);
        }

我的问题是,此代码如何工作以及如何制作随机颜色

2 个答案:

答案 0 :(得分:2)

你的朋友在他发明的一些业余PRNG中创建了一个“随机RGB值”,范围从0x000000到0xFFFFFF。

我将用注释解释代码:

这就是所谓的“种子”。将生成伪随机值序列的初始值。

 int unsigned temp = 10101; //seed 
然后我们得到了for循环:

 for(int y = 0;y < times;y++)
 {
    temp = temp*(y+y+1);
    temp = (temp^(0xffffff))>>2;

你的朋友试图进行复杂的乘法和求和以得到一个新的临时值,除以2(上面代码中的&gt;&gt; 2),然后用0xFFFFFFF掩盖得到一个值0x000000到0xFFFFFFF的范围(他错误地使用按位XOR ^而不是按位AND&amp;)

结果值用作SDL_FillRect()函数的RGB值。

    //printf("%x\n",temp);
    SDL_FillRect(sprite[y],NULL,temp);
    SDL_BlitSurface(sprite[y],&paste[y],rScreen(),NULL);
 }

答案 1 :(得分:1)

魔术在这四行中:

unsigned int temp = 10101; // seed - this seeds the random number generator

temp = temp * (y + y + 1); // this performs a multiplication with the number itself and y
// which is incremented upon each loop cycle
temp = (temp ^ 0xffffff) >> 2; // this reduces the generated random number
// in order it to be less than to 2 ^ 24
SDL_FillRect(sprite[y], NULL, temp); // and this fills the rectangle using `temp` as the color
// perhaps it interprets `temp` as an RGB 3-byte color value