本文介紹了帶有Switch語句的主菜單的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
因此,對于一個學校項目,我必須用一個名為‘Processing’的程序創建一個游戲。
我正在使用Switch語句創建一個主菜單。為此,我想使用按鈕‘Start’、‘Help’和‘Exit’。我想使用這些按鈕來更改Switch語句的變量。因此,我使用”MICESEPRESSED”。問題是,我按的是哪個按鈕,給我的結果和‘退出’按鈕一樣。有沒有人能給我一些建議,教我如何更好地組織我的菜單,甚至讓我的按鈕工作起來?我正在使用一個名為‘ControlP5’的處理庫來制作按鈕。
以下是我到目前為止的代碼:
int mode; // 1: intro screen, 2: game , 3: game over
final int INTRO = 1;
final int PLAY = 2;
final int GAMEOVER = 3;
//==============================================================
void setup(){
size(1920,1080);
mode = 1;
}
//========================================================
void draw(){
if(mode == 1){
introScreen();
}
else if (mode == 2){
gameItself();
}
else if (mode == 3){
gameOver();
}
else println("mode error");{
}
}
void introScreen(){
mode = 1;
static int Page = 0;
import controlP5.*;
ControlP5 cp5;
cp5= new ControlP5(this);
switch(Page){
case 0: // main menu
cp5.addButton("Start").setValue(0).setPosition(1420,250).setSize(400,100);
cp5.addButton("Exit").setValue(0).setPosition(1420,650).setSize(400,100);
cp5.addButton("Help").setValue(0).setPosition(1420,450).setSize(400,100);
break;
case 1: //help menu
cp5.addButton("Back").setValue(0).setPosition(1420,450).setSize(400,100);
break;
}
public void Start(){
if(mousePressed){
mode = 2; // switching to the game itself
}
println("Start");
}
public void Exit(){
if(mousePressed){
exit(); }
println("Exit");
}
public void Help(){
Page = 1;
println("Help");
}
public void Back(){
if(mousePressed){
Page = 0;
}
println("Back");
}
void gameItself(){
// game and stuff
}
void gameOver(){
//gameover
}
推薦答案
查看mousePressed事件的工作原理。您可能會使用此信息。
要實現通過單擊按鈕更改Page
變量的目標,有多個選項。首先,我將使用更簡單的,不需要導入但只需檢查坐標的那個。然后我將執行相同的操作,但使用的是控件P5。
1.只是檢查點擊的位置
我將使用最基本的方法:檢測”點擊”并檢查它的坐標是否在按鈕內。
首先,我們將添加mouseClicked()
方法。每次按下鼠標按鈕時都會調用此方法。
// I'm typing this out of IDE si there may be some quirks to fix in the code
void mouseClicked() {
switch(Page) {
case 0:
if (mouseX > 1420 && mouseX < 1420+400 && mouseY > 250 && mouseY < 250+100) {
// You're in the main menu and Start was clicked
}
if (mouseX > 1420 && mouseX < 1420+400 && mouseY > 650 && mouseY < 650+100) {
// You're in the main menu and Exit was clicked
}
if (mouseX > 1420 && mouseX < 1420+400 && mouseY > 450 && mouseY < 450+100) {
// You're in the main menu and Help was clicked
}
// You should use 'else if' instead of 3 different if, but I coded it like that so it would be easier to see the small differences between the coordinates
case 1:
if (mouseX > 1420 && mouseX < 1420+400 && mouseY > 450 && mouseY < 450+100) {
// You're un the help menu and Back was clicked
}
}
}
如您所見,我只是使用您的按鈕的坐標和大小來檢查單擊是否位于其中。這是一種忍者的方式讓我擺脫這個問題。我不知道您對編程的了解有多深,否則我會建議您構建一個處理用戶輸入的類,但對于像家庭作業這樣的小練習來說,這種方法很容易管理。
2.設計控件P5按鈕
我不是ControlP5專家,因此我們將密切關注基本知識。
我會直截了當地說,您提供的代碼充滿了問題,而且沒有太多行,所以我不會指出哪里出了問題,而是給您一些可以工作的框架代碼,您可以在這些代碼上建立一些理解。我會給你工具,然后你就可以讓你的項目工作了。
當您設計按鈕時,如果您在同一對象中設計它們,它們將共享一些屬性。例如,您的所有按鈕將同時可見或不可見。您不需要一直重新繪制它們,因為它們已經處理了這一點,所以您需要使用其他方法來管理它們。
您應該將按鈕設計為全局對象(就像您所做的那樣),并將它們添加到ControlP5對象中,這是最有意義的。如果你愿意,你可以讓每個對象有一個按鈕,或者如果它們鏈接在一起,你可以有多個按鈕,例如,同時出現的所有”菜單”按鈕可能屬于同一個對象。如果您只為整個程序設計一次按鈕,請使用setup()
方法設計按鈕。當然,如果這不僅僅是一個家庭作業,您可能希望避免按鈕是全局的,但將它們保存在內存中以用于短項目會容易得多。
按鈕的”名稱”也是當您單擊它時它將嘗試調用的方法的名稱。兩個按鈕不能共享相同的”名稱”。按鈕可以有一個設置值,該值將被發送到它們調用的方法。
您不需要使用Processing的鼠標事件來使按鈕工作。它們是自給自足的:它們有自己的事件,比如被點擊或檢測鼠標何時經過它們。Here’s the documentation for the full list of the methods included in the ControlP5 buttons。
您不需要管理draw()
循環中的按鈕。他們自己管理。
下面是一些框架代碼,用于演示我剛才所說的內容。您可以將其復制并粘貼到新的處理項目中,然后運行它以查看正在進行的操作。
ControlP5 cp5;
ControlP5 flipVisibilityButton;
int Page = 0;
void setup() {
size(1920, 800);
textAlign(CENTER, CENTER);
textSize(60);
fill(255);
cp5 = new ControlP5(this); // this is ONE object, which will own buttons.
cp5.addButton("MenuButton0") // this is the name of the button, but also the name of the method it will call
.setValue(0) // this value will be sent to the method it calls
.setPosition(1420, 250)
.setSize(400, 100);
cp5.addButton("MenuButton1")
.setValue(1)
.setPosition(1420, 450)
.setSize(400, 100);
cp5.addButton("MenuButton2")
.setValue(2)
.setPosition(1420, 650)
.setSize(400, 100);
flipVisibilityButton = new ControlP5(this); // this is a different object which own it's own controls (a button in this case)
flipVisibilityButton.addButton("flipVisibility")
.setValue(2)
.setPosition(200, height/2)
.setSize(200, 100);
}
void draw() {
// No button management to see here
background(0);
// showing which button has been pressed while also keeping watch to see if the mouse is over one of the cp5 buttons
text(Page + "
" + cp5.isMouseOver(), width/2, height/2);
}
void MenuButton0(int value) {
ChangePage(value);
}
void MenuButton1(int value) {
ChangePage(value);
}
void MenuButton2(int value) {
ChangePage(value);
}
void ChangePage(int value) {
Page = value;
}
void flipVisibility(int value) {
// When the buttons are invisible, they are also unclickable
cp5.setVisible(!cp5.isVisible());
}
您應該能夠在此示例上展開您的項目,但如果您有困難,請毫不猶豫地在此處進行評論并提出進一步的問題。玩得開心!
這篇關于帶有Switch語句的主菜單的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,