Как использовать логические функции для отображения различных «меню» обработки игры - PullRequest
1 голос
/ 30 сентября 2019

Я пишу код для версии "Flappy Bird". Я пытаюсь создать меню «Пуск», «Конец меню» и «Меню сложности». До сих пор я успешно справлялся с началом и концом, но изо всех сил пытаюсь показать меню сложности. Я считаю, что мой код также очень грязный и хотел бы привести его в порядок, но не уверен, с чего начать.

Я попытался добавить логическое значение "diff" и включить его как ложное в мои аргументы в методе mousePressed.

void mousePressed() {

  //START MENU
  if (menu==true&&end==false) {
    if (mouseX > 175 && mouseX < 625 && mouseY > 500 && mouseY < 600)      {
      menu = false;
      end = true;    
    }
    if (mouseX > 175 && mouseX < 625 && mouseY > 650 && mouseY < 750) {
      diff();
    }
  }

  //GAMEPLAY
  if (menu==false&&end==true) {
    b.bounce();
  }

  //END MENU
  if (menu==false&&end==false) {
    if (mouseX > 200 && mouseX < 600 && mouseY > 500 && mouseY < 600) {
      restart();
      b.bounce();
    }
    if (mouseX > 200 && mouseX < 600 && mouseY > 650 && mouseY < 750) {
      startMenu();
    }
  }
}

Я ожидал, что на выходе отобразится меню сложности, но оно показало толькоМеню сложности для одного кадра, затем снова вернуться в меню «Пуск».

1 Ответ

1 голос
/ 30 сентября 2019

Я предполагаю, что ваша функция diff() рисует меню сложности. Я также предполагаю, что у вас есть функция draw(), которая рисует вещи в зависимости от текущего состояния вашей игры (меню, игра, конечное меню и т. Д.).

Проблема в том, что вы рисуетеМеню сложности один раз, когда мышь нажимается на кнопку сложности, а затем она немедленно перезаписывается на draw().

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

Решение состоит в том, чтобы добавить состояние «меню сложности». Ваша draw() функция будет тогда работать примерно так:

void draw() {
    if (menu && !diff && !end) {
        drawMenu();
    } else if (!menu && diff && !end) {
        diff();
    } else if (!menu && !diff && end) {
        //Why do you draw the game when end is TRUE?
        drawGame();
    } else if (!menu && !diff && !end) {
        //Why do you draw the end menu when end is FALSE?
        drawEndMenu();
    }
}

Вам, конечно, нужно будет также изменить функцию mousePressed().


Вы также сказаличто вы чувствуете, что ваш код грязный. Это тип кода запаха ;Когда что-то кажется «неправильным» во время программирования, это часто означает, что есть лучший способ сделать это. Хорошо, что вы это заметили.

  • Во-первых, имена ваших функций немного не описательны: вместо diff() я рекомендую что-то вроде drawDiffMenu(). Основное правило: имена функций почти всегда должны быть глаголами.

  • Во-вторых, вы не должны обрабатывать состояние игры с кучей логических значений;Поскольку вы можете иметь только одно состояние за раз, у вас должна быть только одна переменная. (Если вам когда-либо понадобится состояние внутри состояния, создайте другую переменную.) Лучший способ сделать это с помощью перечислений!

Пример:

enum GameState {
    MENU, GAME, DIFF_MENU, END
}
GameState gameState = GameState.MENU;

//...

void draw() {

    // Google "java switch statement"
    if (gameState == GameState.MENU) {
        drawMenu();
    } else if (gameState == GamesState.DIFF_MENU) {
        drawDiffMenu();
    } else if...
    // Etc...
}

Придирка: колл b.bounce() после restart() немного странный, так как в теории этот отскок должен быть частью вашей игры, начиная с

Удачного кодирования!

...