今天要做的是google在2016年推出的萬聖節的小遊戲
1.1
在上面畫出線條
讓滑鼠按下去的時候有線可以畫出來
但放開時線條會消失
void mouseReleased(){
background(255);
}
加入角色:玩家、ghost
*ghost移動時會有殘影,如果在void draw()函式裡加入background(255)來清背景,
ghost不會有殘影,但線就不會有殘影,看不到線被畫完整,需解決*
解決按下滑鼠能夠畫出有殘影的線(這一步畫出的是圓點)
執行畫面
放開滑鼠按鍵,線條消失
*用倒過來的for迴圈*
用正的for迴圈會清不乾淨,效率也慢
將圓點改成線條
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);
}
要減1,不然會超過範圍,導致執行當機
執行畫面
2.1
畫出橫線到一定的長度變紅線
算差距
執行畫面
所以在它們前面各自加上stroke(0)
把顏色改成黑色
處理程式的小Bug:線條畫太快會沒有辦法變色 (因為沒有累積到變色的量)
改成float讓計算更精細
將x跟y的移動累積量相加做開根號
來解決畫太快沒法變色的問題
執行畫面
畫出往右上會變綠色的線條
往右下:green_part1
往右上:green_ok
畫完往右下 畫往右上
if(green_part1==false && rightdown>150) green_part1 = true; else if(green_part1==true && rightup>150)green_ok = true;
執行畫面
ArrayList<PVector>pt = new ArrayList<PVector>(); void setup(){ size(400,400); background(255); } float ghostX = 400,ghostY = 20; void mouseDragged(){//按下mouse鍵,再拖它 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); //if(mousePressed)line(mouseX,mouseY,pmouseX,pmouseY); strokeWeight(4);//線條變粗 float dpx=0,dpy=0;//要看p.x和p2.x的差距 p.y和p2.y的差距 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; 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);//累積x的移動量 dpy += abs(p2.y - p.y);//累積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; } if(dpx>100 && dpy<40) stroke(255,0,0);//type1紅色的橫線 else if(dpx<40 && dpy>100) stroke(0,0,255);//type2藍色的直線 else if(green_ok) stroke(0,255,0);///type3全部完成 //else if(green_part1) stroke(0,128,0);//暗暗的綠色,type3的前半段, else if(yellow_ok) stroke(255,255,0);//type4全部完成 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(){ //background(255); for(int i=pt.size()-1;i>=0;i--){//倒過來的for迴圈 pt.remove(i); } }
沒有留言:
張貼留言