главное меню с переключателем - PullRequest
0 голосов
/ 27 апреля 2020

Итак, для школьного проекта мне нужно создать игру с программой под названием «Обработка». Я создаю главное меню с помощью оператора switch. Для этого я хочу использовать кнопки «Пуск», «Справка» и «Выход». Я хотел бы использовать эти кнопки для изменения переменных оператора switch. Поэтому я использую "mousePressed". Проблема в том, какая кнопка, которую я нажимаю, дает тот же результат, что и кнопка «Выход». Может ли кто-нибудь дать мне советы о том, как я могу лучше структурировать свое меню или даже заставить мою кнопку работать? Я использую библиотеку обработки, называемую 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 
}

1 Ответ

0 голосов
/ 29 апреля 2020

Посмотрите, как работает событие mousePressed . Вы можете использовать эту информацию полезной.

Чтобы достичь цели по изменению переменной Page, нажимая кнопки, существует несколько вариантов. Во-первых, я сделаю go с более простым, который не требует импорта, а просто проверяет координаты. Тогда я сделаю то же самое, но с controlP5.

1. Просто проверяя, где щелкают щелчки

Я go с самым основным c одним: обнаружение "щелчка" и проверка, находятся ли его координаты внутри кнопки.

Во-первых, мы добавим метод 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(), если вы разрабатываете их только один раз для всей программы. Конечно, если это было больше, чем домашнее задание, вы можете не использовать кнопки как глобальные, но будет гораздо легче сохранить их в памяти для короткого проекта.

«Имя» Кнопка - это также имя метода, который он попытается вызвать, если вы нажмете на него. Две кнопки не могут иметь одно и то же имя. Кнопки могут иметь заданное значение, которое будет отправлено вызываемому методу.

Вам не нужно использовать события мыши при обработке кнопок для работы кнопок. Они самодостаточны: у них есть свои собственные события, например, когда на них нажимают или определяют, когда мышь над ними. Вот документация для полного списка методов, включенных в кнопки ControlP5 .

Вам не нужно управлять кнопками в draw() l oop. Они управляют собой.

Вот код скелета, демонстрирующий то, что я только что сказал. Вы можете скопировать и вставить его в новый проект обработки и запустить его, чтобы увидеть, что происходит.

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());
}

Вы сможете расширить этот пример, чтобы выполнить свой проект, но если у вас возникнут трудности, не Не стесняйтесь комментировать здесь и задавать дополнительные вопросы. Веселись!

...