基於Processing實現《黑客帝國》代碼雨

他來了,他來了,初中的時候看了《黑客帝國》,簡直太震撼了,從拍攝的角度來說,裏面的特效領先現今國內電影特效幾條街,而且還是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;}}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章