2024年12月9日 星期一

week14

 week14_01_draw_line_mouseDragged_mouseButton_LEFT_RIGHT



1.右鍵拖曳會往下滴

2.左鍵畫圖


程式碼


//week14_01_draw_line_mouseDragged_mouseButton_LEFT_RIGHT


void setup(){

  size(500,500);

}

int x=-1,y=-1;

void draw() {

  if(x!=-1) {

    ellipse(x,y,1,1);

    y++; //y變大就會越來越長,像是往下滴水

  }

}


void mouseDragged(){

  if(mouseButton==LEFT) line(mouseX,mouseY,pmouseX,pmouseY);

  if(mouseButton==RIGHT) {

    x = mouseX;

    y = mouseY;

  }

}


week14_02_draw_lines_loadPixels_pixels_updatePixels


1.取出像素

2.碰到不是白色的線就會變成亂數色彩


程式碼


//week14_02_draw_lines_loadPixels_pixels_updatePixels


void setup(){

  size(500,500);

  background(255);

}

void draw(){

  //pixels

  

}

void mouseDragged(){

  if(mouseButton==LEFT) { //左鍵拖曳時

    line(mouseX,mouseY,pmouseX,pmouseY);//本來的線是灰黑色的

    loadPixels();//取出畫面的像素

    //println(pixels[0]);白色是-1

    for(int i=0;i<width*height;i++) {//全部的點都巡一次色彩

      if(pixels[i]!=-1) pixels[i] = color(random(255),random(255),random(255));

    }//如果{不是白色}就是有畫面碰到pixels,都變成亂數彩色

    updatePixels();//若有修改要在放回去

  }

}


week14_03_draw_lines_rain_PImage_creatImage_img




1.攔住球


程式碼


//week14_03_draw_lines_rain_PImage_creatImage_img

PImage img;

void setup(){

  size(500,500);

  img = createImage(500,500,RGB);//用來畫圖的畫布

  img.loadPixels();

  for(int i=0;i<500*500;i++) {

    img.pixels[i] = color(#FFFFF2);//顏色-14的底

  }

  img.updatePixels();

}

int x = 250,y = 0;

void draw(){ //畫在套的資料夾(比喻)

  background(img);

  ellipse(x,y,20,20);//畫圓形

  if(img.pixels[x+y*500]==-14) y++;//沒有碰到其他顏色往下

}

void mouseDragged(){//畫在抵

  background(img);

  line(mouseX,mouseY,pmouseX,pmouseY);

  loadPixels();

  img.loadPixels();

  for(int i = 0;i<500*500;i++) img.pixels[i] = pixels[i];//把畫布的色彩搬到img裡面

  img.updatePixels();

  updatePixels();

}


week14_04_draw_lines_rain_ArrayList_PVector_p_pp





1.第一張圖片是註解前的版本

2.第二張用到資料結構的陣列PVector


程式碼

//week14_04_draw_lines_rain_ArrayList_PVector_p_pp

PImage img;

void setup(){

  size(500,500);

  img = createImage(500,500,RGB);//用來畫圖的畫布

}

int x = 250,y = 0;

ArrayList<PVector> p = new ArrayList<PVector>();

void draw(){ //畫在套的資料夾(比喻)

  background(img);

  //ellipse(x,y,20,20);//畫圓形

  for(PVector pp:p) {

    ellipse(pp.x,pp.y,20,20);

    if(pp.y<498 && img.pixels[int (pp.x)+int(pp.y)*500]==-16777216) pp.y++;  

  } //if(y<498 && img.pixels[x+y*500]==-16777216) y++;//沒有碰到其他顏色往下

}

void mouseDragged(){//畫在抵

  background(img);

  stroke(random(255),random(255),random(255));

  line(mouseX,mouseY,pmouseX,pmouseY);

  loadPixels();

  img.updatePixels();

  for(int i = 0;i<500*500;i++) {

    img.pixels[i] = pixels[i];

  }

  img.updatePixels();

  updatePixels();

  for(PVector pp:p) {

    ellipse(pp.x,pp.y,20,20);

  } 

}

void mousePressed(){

  if(mouseButton==RIGHT) {

    p.add(new PVector(mouseX,mouseY));

  }

}



week14_05_draw_lines_myFlood_x_y_c1_c2_pixels_isOK



1.右鍵畫圖,左鍵填色


程式碼

///week14_05_draw_lines_myFlood_x_y_c1_c2_pixels_isOK


void setup(){

  size(500,500);

  background(#FFFFF2);

}

void draw(){

  if(mousePressed && mouseButton==LEFT) line(mouseX,mouseY,pmouseX,pmouseY);

  if(mousePressed && mouseButton==RIGHT) {

    loadPixels();//畫面讀取到pixels[]陣列裡面

    color c1 = pixels[mouseX+mouseY*500]; ///原本的顏色

    color c2 = color(random(255),random(255),random(255));//亂數新色彩

    if(c1!=c2) myFloodFill(mouseX,mouseY,c1,c2);

    updatePixels();//把陣列的數值放回去

  }

}

boolean isOK(int x,int y,color c1) {

  if(x<0 || y<0 || x>=500 || y>=500) return false;//超過邊界不能做

  if(pixels[x+y*500]!=c1) return false;//色彩原本的c1色彩不同,就不要變色

  return true;

}

void myFloodFill(int x,int y,color c1,color c2){

  pixels[x+y*500] = c2;//這一格設定成新色彩

  if(isOK(x+1,y,c1))  myFloodFill(x+1,y,c1,c2);

  if(isOK(x-1,y,c1))  myFloodFill(x-1,y,c1,c2);

  if(isOK(x,y+1,c1))  myFloodFill(x,y+1,c1,c2);

  if(isOK(x,y-1,c1))  myFloodFill(x,y-1,c1,c2);

} //不要點太大區域,因為呼叫函示太多次


week14_06_cute_cursor





1.滑鼠鼠標換成自己想要的圖片


程式碼


//week14_06_cute_cursor

void setup(){

  size(500,500);

  PImage img = loadImage("cute.png");

  cursor(img);//滑鼠只能32X32

}

void draw(){

  background(#FFFFF2);

}


week14_07_cute_cursor_kitty_cursor


1.滑鼠鼠標換成自己想要的圖片10秒切一張


程式碼

//week14_07_cute_cursor_kitty_cursor

PImage imgCute,imgKitty;

void setup(){

  size(500,500);

  imgCute = loadImage("cute.png");

  imgKitty = loadImage("kitty.png");

  cursor(imgKitty);//滑鼠只能32X32

}

void draw(){

  background(#FFFFF2);

  if(frameCount%120==0) cursor(imgCute);

  if(frameCount%120==60) cursor(imgKitty);

}


week14_08_big_cursor_image_imagemode

1.放大


程式碼

//week14_08_big_cursor_image_imagemode

// 希望不只用 16x16 或 32x32,要更大

PImage imgBigCute, imgBigKitty, imgCursor; // 宣告三個圖片變數


void setup() {

  size(500, 500); // 設定畫布大小

  imgBigCute = loadImage("bigcute.png"); // 載入第一張圖片

  imgBigKitty = loadImage("bigkitty.png"); // 載入第二張圖片

  imgCursor = imgBigKitty; // 預設圖片為 imgBigKitty

}


void draw() {

  background(#FFFFF2); // 設定背景顏色為淡黃色

  

  imageMode(CENTER); // 設定圖片模式為以中心點為參考

  image(imgCursor, mouseX, mouseY); // 在滑鼠位置繪製當前圖片

  imageMode(CORNER); // 重置圖片模式為以左上角為參考

  

  // 每隔 120 幀切換圖片為 imgBigCute

  if (frameCount % 120 == 0) imgCursor = imgBigCute;

  

  // 每隔 120 幀中的第 60 幀切換圖片為 imgBigKitty

  if (frameCount % 120 == 60) imgCursor = imgBigKitty;

}

沒有留言:

張貼留言