## 5/4 let points = [[1,10], [4,10], [4,11], [11,9], [10,8], [15,5], [16,4], [16,1], [16,-1], [15,-1], [11,1], [9,2], [7,1], [5,-1], [1,-1], [0,0], [3,1], [1,1], [-2,0], [-6,-2], [-9,-6], [-9,-7], [-7,-9], [-7,-11], [-8,-12], [-9,-11], [-11,-10], [-13,-11], [-15,-11], [-17,-12], [-17,-10], [-15,-7], [-12,-6], [-11,-6], [-10,-3], [-8,2], [-5,6], [-3,9], [-4,10], [-5,10], [-2,12], [1,11],[4,10]]; //利用串列設定點 var fill_colors = "f7cac9-fddbdb-d0e4f5-b3cee5".split("-").map(a=>"#"+a) var line_colors = "9f86c0-be95c4-e0b1cb".split("-").map(a=>"#"+a) class Obj{ // 宣告一個類別,針對畫 constructor(args){ //預設值,基本資料(物件顏色、移動速度、大小) // this.p = args.p || {x: random(width), y: random(height)} //描述該物件初始位置 this.p = args.p || createVector(random(width),random(height)) // this.v = {x: random(-1,1), y: random(-1,1)} //描述該物件的移動速度 this.v = createVector(random(-1,1),random(-1,1)) this.size = random(4,8) //描述該物件的放大倍率 this.color = random(fill_colors) //描述該物件的充滿顏色 this.stroke = random(line_colors) //描述該物件的線條顏色 } draw(){ //劃出單一物件形狀 push() //執行push()後,依照設定,設定原點(0,0)位置 translate(this.p.x, this.p.y) //以該物件位置為原點 scale(this.v.x<0?-1:1,-1) fill(this.color) stroke(this.stroke) strokeWeight(2) beginShape() for(var k=0; k < points.length-1; k=k+1){ // line(points[k][0]*this.size,points[k][1]*this.size,points[k+1][0]*this.size,points[k+1][1]*this.size) vertex(points[k][0]*this.size,points[k][1]*this.size) //只要設定一個點,當指令到endShape()。會把所有的點串接在一起 // curveVertex(points[k][0]*this.size,points[k][1]*this.size) //畫線為圓弧"for(var k=0; k < points.length-1; k=k+1)" } endShape() pop() //執行pop(),遠點回到視窗左上角 } update(){ //移動程式碼 // this.p.x = this.p.x + this.v.x //x軸目前位置(this.p.x)加上移動速率(this.v.x) // this.p.y = this.p.y + this.v.y //y軸目前位置(this.p.y)加上移動速率(this.v.y) this.p.add(this.v) //設定好像亮後使用add,就可與上面兩行指令一樣的效果 //知道滑鼠位置<建立一個滑鼠向量 let mouseV = createVector(mouseX,mouseY) //把滑鼠的位置轉圜為一個向量值 let delta = mouseV.sub(this.p).limit(this.v.mag()*2) //sub計算出滑鼠所在位置向量(mouseV)到物件向量(this.p) this.p.add(delta) if(this.p.x<=0 || this.p.x>=width){ //x軸碰到左邊(<=0),或是碰到右邊(>=0) this.v.x = -this.v.x //x速度方向改變 } if(this.p.y<=0 || this.p.y>=height){ //y軸碰到上面(<=0),或是碰到下面(>=0) this.v.y = -this.v.y //y速度方向改變 } } isDOPHINInRanger(){ //功能 : 判斷滑鼠按下的位置是否在物件範圍內 let d = dist(mouseX,mouseY,this.p.x,this.p.y) //計算兩點之間距離,放到d變數內 if(d<15*this.size){ return true //滑鼠與物件的距離小於物件寬度,代表碰觸(回傳至true) } else{ return false } } } var dophin //目前要處理的物件,暫時放在dolphin變數內 var dophins = [] //產生所有的物件 var score = 0 function setup() { createCanvas(windowWidth, windowHeight); for(var i=0; i<20; i=i+1){ dophin = new Obj({}) //產生一個新的Obj class元件 dophins.push(dophin) //把dophin物件放到dophins陣列內 } } function draw() { background(255); // for(var j=0; j<dophins.length; j=j+1){ // dophin = dophins[j] // dophin.draw() // dophin.update() // } for(let dophin of dophins){ dophin.draw() dophin.update() } textSize(30) text(score,50,50) } function mousePressed(){ //=================產生物件=================// // dophin = new Obj({ // p:{x:mouseX, y:mouseY}}) //產生一個新的Obj class元件 // dophins.push(dophin) //把dophin物件放到dophins陣列內(丟到倉庫) //=========================================// //=================刪除物件=================// for(let dophin of dophins){ //檢查每一物件 if(dophin.isDOPHINInRanger()){ dophins.splice(dophins.indexOf(dophin),1) //從倉庫dophins取出被滑鼠按到的物件編號(dophins.indexOf(dophin)),只取1個 score = score + 1 } } //=========================================// }