2023年1月11日 星期三

TC*(˙Ⱉ˙ฅ)​-week14

上週我們學習了如何將圖片讀入並且顯示出來
先來回顧一下上週的程式與成果

PImage home_img,start_img,rule_img;//封面,開始遊戲,規則介紹
void setup(){
  size(1200,750);//視窗長寬
  home_img = loadImage("home.png");//載入封面圖home.png
  start_img = loadImage("start.png");//載入開始遊戲鍵start.png
  rule_img = loadImage("rule.png");//載入規則介紹鍵rule.png
}
void draw(){//畫圖
  image(home_img,0,0,1200,750);//home圖片的x,y座標(0,0),(1200,600)是圖片寬高
  image(start_img,1000,600,150,75);//start圖片的x,y座標(650,600),(110,60)是圖片寬高
  image(rule_img,800,600,150,75);//rule圖片的x,y座標(850,600),(110,60)是圖片寬高
}


這周我們要學習的是如何將我們讀入的圖片製作成按紐
可以看到上周的成果有規則介紹以及開始遊戲,但沒有辦法點擊
因此我們要想辦法讓圖片被點擊後可以有所反應
那勢必會需要使用滑鼠點擊事件void mousePressed(){}//按下滑鼠時
以及利用boolean變數去控制按紐事件

用開始遊戲的圖片按鍵為例好了
1.boolean pressed_start=false;先宣告預設我們開始遊戲鍵是關閉的狀態

2.接下來設定當我們滑鼠按下開始遊戲鍵時會有什麼動作發生
void mousePressed(){
     if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100)        {}
}
上面這行就是用來判斷開始遊戲鍵的範圍大小,如果我們點擊這個區間的座標,就會發生什麼事

pressed_start=true;
這行是按下開始遊戲鍵被打開

3.這兩行結合起來的意思就是,當我們點擊區間座標符合的話,那麼開始遊戲鍵被打開就會成立,如以下程式碼

void mousePressed(){//按下滑鼠時
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    //判定圖片範圍,xy座標(1000,600),1000+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_start=true;
  }
}

以為這樣就可以使用按扭了嗎?NO、NO、NO!
我們還少了關鍵的要素,必須要在draw中顯示執行才可以
因此要加入當點擊按鈕成立後的後續行為
if(pressed_start==true)rect(1000,600,150,75);
//按下開始遊戲的按鈕後,畫一個x,y座標(1000,600),長寬(150,75)的矩形


我們將這1、3點結合起來,如果執行以下程式碼,圖片就可以被點擊
boolean pressed_start=false;
void mousePressed(){//按下滑鼠時
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    //判定圖片範圍,xy座標(1000,600),1000+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_start=true;
  }
}


我們來看看完整的程式碼與執行結果吧!
PImage home_img,start_img,rule_img;//命名圖片變數封面,開始遊戲,規則介紹
void setup(){
  size(1200,750);//視窗長寬
  home_img = loadImage("home.png");//載入封面圖home.png
  start_img = loadImage("start.png");//載入開始遊戲鍵start.png
  rule_img = loadImage("rule.png");//載入規則介紹鍵rule.png
}
void draw(){//畫圖
  image(home_img,0,0,1200,750);//home圖片的x,y座標(0,0),(1200,600)是圖片寬高
  image(start_img,1000,600,150,75);//start圖片的x,y座標(650,600),(110,60)是圖片寬高
  image(rule_img,800,600,150,75);//rule圖片的x,y座標(850,600),(110,60)是圖片寬高
  if(pressed_start==true)rect(1000,600,150,75);//按下開始遊戲的按鈕後

}
boolean pressed_start=false;
void mousePressed(){//按下滑鼠時
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    //判定圖片範圍,xy座標(1000,600),1000+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_start=true;
  }
}



另一邊也依樣畫葫蘆,這樣兩邊都可以點擊了
PImage home_img,start_img,rule_img;//讀入封面,開始遊戲,規則介紹
void setup(){
  size(1200,750);//視窗長寬
  home_img = loadImage("home.png");//載入封面圖home.png
  start_img = loadImage("start.png");//載入開始遊戲鍵start.png
  rule_img = loadImage("rule.png");//載入規則介紹鍵rule.png
}
void draw(){//畫圖
  image(home_img,0,0,1200,750);//home圖片的x,y座標(0,0),(1200,600)是圖片寬高
  image(start_img,1000,600,150,75);//start圖片的x,y座標(650,600),(110,60)是圖片寬高
  image(rule_img,800,600,150,75);//rule圖片的x,y座標(850,600),(110,60)是圖片寬高
  if(pressed_start==true)rect(1000,600,150,75);//按下開始遊戲的按鈕後
  if(pressed_rule==true)rect(800,600,150,75);//按下規則介紹的按鈕後
}
boolean pressed_start=false;
boolean pressed_rule=false;
void mousePressed(){//按下滑鼠時
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    //判定圖片範圍,xy座標(1000,600),1000+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_start=true;
  }
  if(800<mouseX && mouseX < 800+200 && 600<mouseY && mouseY<600+100){
  //判定圖片範圍,xy座標(800,600),800+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_rule=true;
  }
}



那如果希望按下按鈕的當下會進入白色框框,而不點擊時就會回復原狀該怎麼辦?
很簡單,只要多寫一個鬆開滑鼠的函式就好了void mouseReleased(){},並重新關閉按鍵,如:
pressed_start=false,後面就跟按下滑鼠的函式一樣,需要判定範圍

void mouseReleased(){//放開滑鼠
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    pressed_start=false;
  }
  if(800<mouseX && mouseX < 800+200 && 600<mouseY && mouseY<600+100){
    pressed_rule=false;
  }
}

完整程式碼
PImage home_img,start_img,rule_img;//讀入封面,開始遊戲,規則介紹
void setup(){
  size(1200,750);//視窗長寬
  home_img = loadImage("home.png");//載入封面圖home.png
  start_img = loadImage("start.png");//載入開始遊戲鍵start.png
  rule_img = loadImage("rule.png");//載入規則介紹鍵rule.png
}
void draw(){//畫圖
  image(home_img,0,0,1200,750);//home圖片的x,y座標(0,0),(1200,600)是圖片寬高
  image(start_img,1000,600,150,75);//start圖片的x,y座標(650,600),(110,60)是圖片寬高
  image(rule_img,800,600,150,75);//rule圖片的x,y座標(850,600),(110,60)是圖片寬高
  if(pressed_start==true)rect(1000,600,150,75);//按下開始遊戲的按鈕後
  if(pressed_rule==true)rect(800,600,150,75);//按下規則介紹的按鈕後
}
boolean pressed_start=false;
boolean pressed_rule=false;
void mousePressed(){//按下滑鼠時
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    //判定圖片範圍,xy座標(1000,600),1000+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_start=true;
  }
  if(800<mouseX && mouseX < 800+200 && 600<mouseY && mouseY<600+100){
  //判定圖片範圍,xy座標(800,600),800+200就是判定範圍有多寬,600+100就是判定範圍有多高
    pressed_rule=true;
  }
}
void mouseReleased(){//放開滑鼠
  if(1000<mouseX && mouseX < 1000+200 && 600<mouseY && mouseY<600+100){
    pressed_start=false;
  }
  if(800<mouseX && mouseX < 800+200 && 600<mouseY && mouseY<600+100){
    pressed_rule=false;
  }
}



這樣就有按紐的效果了~




沒有留言:

張貼留言