2023年10月26日 星期四

再...再課7單... - 互動技術概論 - Week07 - 畫線魔法

 快到萬聖節了,Google有出一個黑貓的畫線魔法小遊戲。

今天要寫出類似的小遊戲。


先讓滑鼠可以畫出線條。


程式碼:

void setup()
{
  size(400, 400);
  background(255);
}
void draw()
{
  if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
}
----------------------------------------------------------------------------
但是上個程式畫出的線不會消失,所以加上讓線消失的程式。
程式碼:
void setup()
{
  size(400, 400);
  background(255);
}
void draw()
{
  if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
}
void mouseReleased()
{
  background(255);
}
----------------------------------------------------------------------------
加上會靠近我們的鬼。

程式碼:
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void draw()
{
  ellipse(200,200,  15,15);
  if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  background(255);
}
----------------------------------------------------------------------------
但因為要除去鬼的移動軌跡會順便刪掉畫線的線條,所以我們用ArrayList讓它幫忙把線連起來。

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  ellipse(200,200,  15,15);
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size(); i++)
  {
    PVector p = pt.get(i);
    ellipse(p.x, p.y, 3, 3);
  }
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  background(255);
}
----------------------------------------------------------------------------
再加上倒過來的for迴圈。 (因為這樣從陣列之中減少任一個數值,如果是正的
迴圈,那移動一個數值會從第一個開始,有空格就要往前移動,這樣很浪費時間。
如果是反的迴圈,那只要移動後面的就好,就不用浪費時間。)
這樣線就會出現了,滑鼠放開也會自動消失。

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  ellipse(200,200,  15,15);
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size(); i++)
  {
    PVector p = pt.get(i);
    ellipse(p.x, p.y, 3, 3);
  }
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
把剛剛上面的迴圈也改一下。

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  ellipse(200,200,  15,15);
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
  }
  ellipse(ghostX,ghostY,15,15);
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
再來是累積x的移動量,然後讓橫的線條變色。 (修改是紅色的部分)

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  ellipse(200,200,  15,15);
  ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
 }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}

----------------------------------------------------------------------------
再來讓垂直的線 (y) 移動一定距離變成藍色。 (修改是紅色的部分)
程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
 }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
再來把往右下的線變成綠色。

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  int rightdown = 0;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x>0 && p2.y - p.y>0) rightdown++;
 }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else if(rightdown>30) stroke(0, 255, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
因為滑鼠移動太快程式不會跑出綠色的線,所以修改了移動距離的程式碼。

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x>0 && p2.y - p.y>0) rightdown += sqrt(dpx*dpx + dpy*dpy);
 }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else if(rightdown>150) stroke(0, 255, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
讓打勾會變成綠色的。 (上)
程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, rightup=0;
  boolean green_part1 = false, green_ok = false;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);//ellipse(p.x, p.y, 3, 3);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x>0 && p2.y - p.y>0) rightdown += sqrt(dpx*dpx + dpy*dpy);
    if(p2.x - p.x>0 && p2.y - p.y<0) rightup += sqrt(dpx*dpx + dpy*dpy);
    ellipse(p.x, p.y, 10, 10);
    if(green_part1 == false && rightdown>150) green_part1 = true;
    else if (green_part1 == true && rightup>150) green_ok = true;
 }
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else if(green_ok) stroke(0, 255, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}

----------------------------------------------------------------------------
讓打勾往下會變成深綠色,勾起來會變成亮綠色。 (下)

程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, green_rightup=0;
  boolean green_part1 = false, green_ok = false;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x>0 && p2.y - p.y>0) rightdown += sqrt(dpx*dpx + dpy*dpy);
    if(green_part1 && p2.x - p.x>0 && p2.y - p.y<0) green_rightup += sqrt(dpx*dpx + dpy*dpy);
    //ellipse(p.x, p.y, 10, 10);
    if(green_part1 == false && rightdown>150) green_part1 = true;
    else if (green_part1 == true && green_rightup>150) green_ok = true;
 }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else if(green_ok) stroke(0, 255, 0);
  else if(green_part1) stroke(0, 128, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}
----------------------------------------------------------------------------
加上向上的勾勾變成黃色。
程式碼:
ArrayList<PVector> pt = new ArrayList<PVector>();
void setup()
{
  size(400, 400);
  background(255);
}
float ghostX=400, ghostY=20;
void mouseDragged()
{
  pt.add(new PVector(mouseX, mouseY));
}
void draw()
{
  background(255);
  strokeWeight(1);
  stroke(0); ellipse(200,200,  15,15);
  stroke(0); ellipse(ghostX,ghostY,15,15);
  strokeWeight(4);
  float dpx=0, dpy=0;
  float rightdown = 0, green_rightup=0;
  float rightup = 0, yellow_rightdown=0;
  boolean green_part1 = false, green_ok = false;
  boolean yellow_part1 = false, yellow_ok = false;
  //if(mousePressed) line(mouseX, mouseY, pmouseX, pmouseY);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    dpx += abs(p2.x - p.x);
    dpy += abs(p2.y - p.y);
    if(p2.x - p.x>0 && p2.y - p.y>0) rightdown += sqrt(dpx*dpx + dpy*dpy);
    if(green_part1 && p2.x - p.x>0 && p2.y - p.y<0) green_rightup += sqrt(dpx*dpx + dpy*dpy);
    
    if(p2.x - p.x>0 && p2.y - p.y>0) rightup += sqrt(dpx*dpx + dpy*dpy);
    if(yellow_part1 && p2.x - p.x>0 && p2.y - p.y>0) yellow_rightdown += sqrt(dpx*dpx + dpy*dpy);
    //ellipse(p.x, p.y, 10, 10);
    if(green_part1 == false && rightdown>150) green_part1 = true;
    else if (green_part1 == true && green_rightup>150) green_ok = true;
    
    if(yellow_part1 == false && rightup>150) yellow_part1 = true;
    else if (yellow_part1 == true && yellow_rightdown>150) yellow_ok = true;
 }
  println(rightdown);
  if(dpx>100 && dpy<40) stroke(255, 0, 0);
  else if (dpx<40 && dpy>100) stroke(0, 0, 255);
  else if(green_ok) stroke(0, 255, 0);
  //else if(green_part1) stroke(0, 128, 0);
  else if(yellow_ok) stroke(255, 255, 0);
  else stroke(0);
  for(int i=0; i<pt.size()-1; i++)
  {
    PVector p = pt.get(i), p2 = pt.get(i+1);
    line(p.x, p.y, p2.x, p2.y);
  }
  float dx=200-ghostX, dy=200-ghostY, len = sqrt(dx*dx+dy*dy);
  ghostX += dx / len / 3;
  ghostY += dy / len / 3;
}
void mouseReleased()
{
  for(int i=pt.size()-1; i>=0; i--)
  {
    pt.remove(i);
  }
  //background(255);
}

沒有留言:

張貼留言