我的朋友为我的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);
}
我的问题是,此代码如何工作以及如何制作随机颜色
答案 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