带有switch语句的主菜单

问题描述 投票:0回答:1

因此,对于一个学校项目,我必须使用名为“处理”的程序来创建游戏。我正在使用switch语句创建一个主菜单。为此,我想使用“开始”,“帮助”和“退出”按钮。我想使用这些按钮来更改switch语句的变量。因此,我正在使用“ mousePressed”。问题是我按下哪个按钮,结果与“退出”按钮相同。有人可以给我提示如何更好地构建菜单甚至使按钮正常工作吗?我正在使用Processing上名为“ 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 
}
java button switch-statement processing
1个回答
0
投票

查看mousePressed事件的工作方式。您可以使用此信息有用。

为了实现通过单击按钮来更改Page变量的目标,有多个选项。首先,我将介绍一种更简单的方法,即不需要导入而只需检查坐标的方法。然后,我将执行相同的操作,但要使用controlP5。

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。设计controlP5按钮

我不是ControlP5专家,所以我们会紧贴基础知识。

直言不讳,您提供的代码已经成熟了,而且没有很多行,因此,除了指出问题出在哪里,我还将为您提供一些行之有效的骨架代码,并在其上构建一些代码理解。我将为您提供工具,然后您就可以使您的项目正常工作。

设计按钮时,如果将它们全部设计在同一对象中,则它们将共享某些属性。例如,您所有的按钮将同时可见或不可见。您不需要一直重绘它们,因为它们已经处理了,因此您需要使用另一种方法进行管理。

您应该将按钮设计为全局对象(就像以前一样),然后将它们添加到最有意义的ControlP5对象中。如果需要,每个对象可以有一个按钮,如果链接在一起,则可以有多个按钮,例如,同时出现的所有“菜单”按钮可以归同一对象所有。如果整个程序只设计一次,请按setup()方法设计按钮。当然,如果这不只是一项家庭作业,则可能要避免将按钮设置为全局按钮,但是将它们保留在内存中以进行较短的项目会容易得多。

按钮的“名称”也是单击该按钮时它将尝试调用的方法的名称。两个按钮不能共享相同的“名称”。按钮可以具有一个设置值,该设置值将发送到它们所调用的方法。

您无需使用Processing的鼠标事件即可使按钮起作用。它们是独立的:它们具有自己的事件,例如单击或检测鼠标在其上的时间。 Here's the documentation for the full list of the methods included in the ControlP5 buttons

您无需管理draw()循环中的按钮。他们自己管理。

以下是一些基本代码来演示我刚才所说的内容。您可以将其复制并粘贴到新的Processing项目中,然后运行它以查看发生了什么。

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 + "\n" + 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());
}

您应该可以在此示例中进行扩展以完成您的项目,但是如果您有困难,请在此处进行评论并提出其他问题。玩得开心!

© www.soinside.com 2019 - 2024. All rights reserved.