基于Processing实现《黑客帝国》代码雨
程序员文章站
2022-04-07 16:24:57
...
他来了,他来了,初中的时候看了《黑客帝国》,简直太震撼了,从拍摄的角度来说,里面的特效领先现今国内电影特效几条街,而且还是20年轻的事情了。里面最让我印象深刻的就是代码雨特效,记忆犹新啊,现在从事程序员有很大的原因是看了代码雨,感觉代码真的是无所不能。哈哈哈!!
电影特效:
processing 特效:
上源码:
static final int C_MAX_LIT=0xEE;
static final int C_NORMAL_LIT=0x66;
static final int C_BASIC_LIT=0x33;
static final int C_GRADIENT_LIT=0x11;
int pbRowCount=0;
int pbCharSetCount=0;
float pbTextGrid=0f;
String[] pbCharSet;
EcSingleLine[] pbLines;
void setup(){
//[ use this instead ]::fullScreen(P2D);
size(500,500);
frameRate(16);noStroke();
textAlign(LEFT,TOP);
//[ change size if necessary]::textSize(22);
pbTextGrid=textAscent()+textDescent();
pbRowCount=ceil(height/pbTextGrid);
int lpColumnCount=ceil(width/pbTextGrid);
pbLines=new EcSingleLine[lpColumnCount];
for(int i=0,s=pbLines.length;i<s;i++){
pbLines[i]=new EcSingleLine();
pbLines[i].cmX=i*ceil(pbTextGrid);
pbLines[i].cmDripHead=ceil(random(1,pbRowCount));
}//..~
pbCharSetCount=0x79-0x21;//..see the ascii table!!
pbCharSet=new String[pbCharSetCount];
for(int i=0,s=pbCharSet.length;i<s;i++){
pbCharSet[i]=new StringBuilder().append((char)(i+0x21)).toString();
}
}
void draw(){
background(0);
for(EcSingleLine it:pbLines){
it.ccUpdate();
if(random(1f)<0.2){
it.ccDrip();
}
}
}
void keyPressed(){switch(key){
case 'f':println(frameRate);break;
case 'q':exit();break;
default:break;
}}
class EcSingleLine{
int cmX=0;
int cmDripHead=0;
boolean cmDripping;
void ccUpdate(){
cmDripping=cmDripHead<(pbRowCount*2);
cmDripHead+=cmDripping?1:0;
int lpGreen;
for(int i=0;i<pbRowCount;i++){
if(i<cmDripHead){
lpGreen=C_MAX_LIT-(C_GRADIENT_LIT*(cmDripHead-i));
lpGreen=constrain(lpGreen,C_NORMAL_LIT,C_MAX_LIT);
fill(C_BASIC_LIT,lpGreen,C_BASIC_LIT);
}else{
fill(C_BASIC_LIT,C_NORMAL_LIT,C_BASIC_LIT);
}//..?
text(
pbCharSet[ceil(random(0,pbCharSetCount-1))],
cmX,
i*pbTextGrid
);
}
}
void ccDrip(){if(!cmDripping){cmDripHead=0;}}
}
上一篇: 一个程序员草根站长分享的站长经历和经验