因此,对于一个学校项目,我必须使用名为“处理”的程序来创建游戏。我正在使用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
}
查看mousePressed事件的工作方式。您可以使用此信息有用。
为了实现通过单击按钮来更改Page
变量的目标,有多个选项。首先,我将介绍一种更简单的方法,即不需要导入而只需检查坐标的方法。然后,我将执行相同的操作,但要使用controlP5。
我将采用最基本的方法:检测“单击”并检查其坐标是否在按钮内。
首先,我们将添加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
}
}
}
如您所见,我只是使用按钮的坐标和大小来检查单击是否位于按钮内部。这有点阻碍了我解决这个问题。我不知道您在编程上有多深入,否则我会建议您建立一个类来处理用户输入,但是这种方式对于家庭作业之类的小练习很容易管理。
我不是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());
}
您应该可以在此示例中进行扩展以完成您的项目,但是如果您有困难,请在此处进行评论并提出其他问题。玩得开心!