2024年12月2日 星期一

BK Week13 動畫+3D+俄羅斯方塊

Processing 程式碼

利用 array I frameCount 讓照片自動切換 看起來像影片
PImage [] img = new PImage[3];
void setup() {
  img[0] = loadImage("sinzl01.png");
  img[1] = loadImage("sinzl02.png");
  img[2] = loadImage("sinzl03.png");
}
int I = 0; //0,1,2,0,1,2,0,1,2...
void draw() {
  background(img[I]);
  if (frameCount%20==0) I = (I+1)%3;
}


利用 frameCount 讓 ellipse 在限制的範圍裡來回移動
void setup() {
  size(500, 300); //寬度是500,兩倍是1000
}

void draw() {
  background(#FFFFF2);
  float x = (frameCount*5 % 1000);
  if (x>500) x = 1000-x; //超過500範圍,就折回來
  for (int y=30; y<300; y+=50) {
    ellipse(x, y, 30, 30);
  }
}


用之前教過的 pushMatrix() popMatrix() 在裡面加上 frameCount
搭配 mouseX mouseY 讓火雞自己動也跟著滑鼠游標移動
PImage img;
void setup() {
  size(500, 300);
  img = loadImage("turkey.png");
  imageMode(CENTER);
}
void turky(int x, int y) {
  pushMatrix();
  translate(mouseX, mouseY);
  rotate(radians(frameCount));
  image(img, 0, 0);
  popMatrix();
}
void draw() {
  background(255);
  turky(mouseX, mouseY); //會跟著mouse動
  turky(100, 100); //左上角
  turky(400, 100); //右上角
  turky(100, 200); //左下角
  turky(400, 200); //右下角
}

利用 PShape pushMatrix() popMatrix() 畫出 3Dgundam
PShape gundam;
void setup() {
  size(500, 500, P3D); //小心P3D
  gundam = loadShape("Gundam.obj");
}
void draw() {
  background(#BBFF81); //淡綠色
  pushMatrix();
    translate(mouseX, mouseY);
    rotateY(radians(frameCount));
    rotate(radians(180));
    scale(10, 10, 10);
    shape(gundam, 0, 0); //shape(gundam, 0, 0, 250/2, 500/2)
  popMatrix();
}


多加一個 for迴圈 畫出好多個 Gundam
PShape gundam;
void setup() {
  size(500, 500, P3D); //小心P3D
  gundam = loadShape("Gundam.obj");
}
void draw() {
  background(#BBFF81); //淡綠色
  drawGundam(mouseX, mouseY);
  for (int x=0; x<=500; x+=500/4) {
    drawGundam(x, 300);
  }
}
void drawGundam(int x, int y) {
  pushMatrix();
    translate(x, y);
    rotateY(radians(frameCount));
    rotate(radians(180));
    scale(10, 10, 10);
    shape(gundam, 0, 0); //shape(gundam, 0, 0, 250/2, 500/2)
  popMatrix();
}


做出最簡單的俄羅斯方塊 可以利用方向建移動
void setup() {
  size(300, 600);
}
float x = 50, y = 50;
void draw() {
  background(0);
  fill(153, 0, 204);
  rect(x, y-25, 25, 25);
  rect(x+25, y, 25, 25);
  rect(x, y, 25, 25);
  rect(x, y+25, 25, 25);
  if (frameCount%50==0) y += 25;
}
void keyPressed() {
  if (keyCode==RIGHT) x += 25;
  if (keyCode==LEFT) x -= 25;
}


用 array 畫出俄羅斯方塊的背景
void setup() {
  size(240, 440); // y:20+2 x:10+2
}
void draw() {
  for (int i=0; i<22; i++) {
    for (int j=0; j<12; j++) {
      if (grid[i][j]==1) fill(119, 119, 119);
      if (grid[i][j]==0) fill(0);
      if (grid[i][j]==2) fill(153, 0, 204);
      rect(j*20, i*20, 20, 20);
    }
  }
}
int [][] grid = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

把剛剛的 if() 改成 c now 執行結果會跟上一個一樣
color [] c = {#000000, #777777, #9900CC, #CCCC00, #00B500, #CC0000}; //會有10種顏色
//黑,灰,紫,黃,綠,紅......
void setup() {
  size(240, 440); // y:20+2 x:10+2
}
void draw() {
  for (int i=0; i<22; i++) {
    for (int j=0; j<12; j++) {
      int now = grid[i][j];
      fill(c[now]);
      rect(j*20, i*20, 20, 20);
    }
  }
}
int [][] grid = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

讓俄羅斯方塊自動落下 觸底停止
color [] c = {#000000, #777777, #9900CC, #CCCC00, #00B500, #CC0000, #0000CC, #CC9900, #00000C, #FFFFFF}; //會有10種顏色
//黑,灰,紫,黃,綠,紅......
int T = 2;
void setup() {
  size(240, 440); // y:20+2 x:10+2
}
void draw() {
  for (int i=0; i<22; i++) {
    for (int j=0; j<12; j++) {
      int now = grid[i][j];
      fill(c[now]);
      rect(j*20, i*20, 20, 20);
    }
  }
  if (frameCount%50==0) {
    int bad=0; //一開始沒有壞掉
    for (int i=20; i>=1; i--) { //從下到上的迴圈
      for (int j=1; j<12-1; j++) { //最左右不動,中間才動
        if (grid[i][j]==9) { //如果是可以移動的主角,暫定是2,之後是0
          if (grid[i+1][j]!=0 && grid[i+1][j]!=9) bad=1;
        } //不能往下走
      }
    }
    if (bad==0) {
      for (int i=20; i>=1; i--) {
        for (int j=1; j<12-1; j++) {
          if (grid[i][j]==9) {
            grid[i-1][j] = 9;
            grid[i][j] = 0;
          }
        }
      }
    } else {
      for (int i=20; i>=1; i--) {
        for (int j=1; j<12-1; j++) {
          if (grid[i][j]==9) {
            grid[i][j] = T;
          }
        }
      }
    }
  }
}
int [][] grid = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};


沒有留言:

張貼留言