快到萬聖節了,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); }










沒有留言:
張貼留言