java - 处理: mousePressed ()/mouseClicked() ticks too often

标签 java eclipse mouseevent

我制作了一个打地鼠风格的游戏,我正在使用 mousePressed() 方法来打地鼠。该代码工作正常,唯一的问题是有一种破坏游戏的漏洞,您只需按住鼠标即可完成。基本上,您不必每次都单击鼠标,只需按住鼠标即可获得每个痣。为了尝试解决这个问题,我使用了 mouseClicked() - 同样的问题。这可能是由于我在 mousePressed() 中使用了 boolean 值,但我不知道,因为我在另一个游戏中遇到了类似的问题,我正在编码,但没有 boolean 变量。我希望游戏让你每次想打地鼠时都必须点击,有什么解决办法吗?我刚来到这里的时候就考虑过使用计时器而不是用计时器来进行故障排除大约 3 个小时。谢谢 - 这是代码:

package whackmole;

import processing.core.PApplet;
import processing.core.PFont;
import processing.core.PImage;
import java.util.Random;


public class WHACKMOLE extends PApplet {

PImage mole;
PImage mallet1;
PImage mallet2;

PFont f;
public int timer;
public int startTime;
public int gameTime;
public int startGameTime;


int score = 0;
Random rnd = new Random();
boolean mouseP = false;
int life = 3;


Mole mole1;
Mole mole2;
Mole mole3;
Mallet mallet;
 enum GameState {
        MENU,
        RUNNING,
        RUNNING2
   }
 static GameState currentState;

public void setup() {
    size(1000, 800);

    currentState = GameState.MENU;
    mole = loadImage("mole.png");
    mole1 = new Mole(mole);
    mole2 = new Mole(mole);
    mole3 = new Mole(mole);
    f = createFont("comic.tff",16,true);
    textFont(f,36);
}

 public void draw() {

        switch(currentState){
        case MENU:
            drawMenu();
            startTime = millis();
            timer = 0;
            life = 3;
            gameTime = millis();
            cursor(CROSS);
            score = 0;
            break;
        case RUNNING:
            drawRunning();
            break;
        case RUNNING2:
            drawRunning2();
            gameTime = millis() - startGameTime;

            break;

        }


    }

public void drawRunning() {
    clear();

    background(50,255,50);

    if(timer < 60000){
    mallet2 = loadImage("mallet2.png");
    timer = millis();



    mole1.drawMole();
    mole1.collision(mallet);
    timer = millis() - startTime;
    mallet1 = loadImage("mallet1.png");
    mallet = new Mallet(mallet1, mouseX, mouseY);

    fill(255,255,255);
    text("Time: " + ((60 - timer / 1000)), 850, 50);

    if (mouseP){
        mallet.drawMallet(mallet2, mouseX, mouseY);
    }
    else {
        mallet.drawMallet(mallet1, mouseX, mouseY);
    }
    if(timer > 60000){
        fill(255,255,255);
        text("Game over!" , 400, 400);
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {

        }   
        currentState = GameState.MENU;

    }
    noCursor();
    text("Score: " + score ,25,50);
    }

}

public void drawRunning2() {
clear();
mallet1 = loadImage("mallet1.png");
mallet = new Mallet(mallet1, mouseX, mouseY);


mallet2 = loadImage("mallet2.png");


background(50,255,50);

timer = millis() - startTime;

text("Life: " + life ,25,50);

noCursor();

text("Time: " + (gameTime / 1000), 825, 50);
if(life <= 0){
    mole1.dead = true;
    mole2.dead = true;
    mole3.dead = true;
    text("Game over!" , 400, 400);
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {

    }


    currentState = GameState.MENU;
        timer = 0;
        gameTime = 0;
        startGameTime = millis();



}

if (timer < 1800){
    if (!mole1.dead){
        mole1.drawMole();
        mole1.collision(mallet);
    }
    if (!mole3.dead){
        mole3.drawMole();
        mole3.collision(mallet);
    }
    if (!mole2.dead){
        mole2.drawMole();
        mole2.collision(mallet);
    }
    if (mouseP){
        mallet.drawMallet(mallet2, mouseX, mouseY);
    }
    else {
        mallet.drawMallet(mallet1, mouseX, mouseY);
    }
}
else {
    startTime = millis();
    if (!mole1.dead || !mole2.dead || !mole3.dead) {
        life --;
    }
    if (life > 0){
        mole1.dead = false;
        mole2.dead = false;
        mole3.dead = false;

        mole1.xPos = rnd.nextInt(950);
        mole1.yPos = rnd.nextInt(600);
        mole3.xPos = rnd.nextInt(950);
        mole3.yPos = rnd.nextInt(600);
        mole2.xPos = rnd.nextInt(950);
        mole2.yPos = rnd.nextInt(600);



        }




    }
}





public void drawMenu(){
    clear();
    background(142,22,178);

    fill(165, 119, 249);
    rect(250, 150, 500, 200 );
    fill(255,255,255);
    text("Time Mode", 375, 270);
    fill(165, 119, 249);
    rect(250, 450, 500, 200 );
    fill(255,255,255);
    text("Survival Mode", 375, 570);


}

        public void mousePressed()
        {
            mouseP = true;

            if( currentState == GameState.MENU && mouseX > 250 && mouseX < 750 && mouseY > 150 && mouseY < 350){
                currentState = GameState.RUNNING;
            }
            if( currentState == GameState.MENU && mouseX > 250 && mouseX < 750 && mouseY > 450 && mouseY < 650){
                currentState = GameState.RUNNING2;
        }

        }
            public void mouseReleased()
            {
            mouseP = false;
            }



public class Mallet{
    PImage mallet1;
    PImage mallet2;
    float xPos1;
    float yPos1;

    public Mallet(PImage mallet1, float xPos1, float yPos1){

        this.mallet1 = mallet1;
        this.xPos1 = xPos1;
        this.yPos1 = yPos1;
    }

    public void drawMallet(PImage mallet1, float xPos1, float yPos1){
        image(mallet1, xPos1 - 40, yPos1 - 60);
    }
}
public class Mole{
    PImage Mole;
    float xPos;
    float yPos;
    boolean dead = false;

    public Mole(PImage mole){       
        this.Mole = mole;
        this.xPos = rnd.nextInt(950);
        this.yPos = rnd.nextInt(750);
    }


    public void drawMole(){
        if (dead == true) {
            this.xPos = rnd.nextInt(1000 - mole.width / 2);
            this.yPos = rnd.nextInt(800 - mole.height);
            dead = false;
        }
        image(Mole, xPos, yPos);    
    }   

    public void collision(Mallet m){
        if(
                mouseP == true &&
        mouseX > xPos && mouseX < xPos + mole.width && mouseY > yPos && mouseY < yPos + mole.height){
            score ++;
            dead = true;
        }
    }
    }
}

最佳答案

MouseReleased 具有长按的优势。由于释放事件将是鼠标单击(按下、按住、释放)中的最后一个事件。您必须使用

 mouseReleased(MouseEvent e)

相反。这适合您的情况。

https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseListener.html#mouseReleased(java.awt.event.MouseEvent)

关于java - 处理: mousePressed ()/mouseClicked() ticks too often,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38427643/

相关文章:

java - Visual Studio 2013 企业版 : Oracle Java SDK A more recent version of this software is required

java - 我在我的解密方法中得到 BadPaddingException

php - 在 Aptana Studio 3 中恢复已删除的文件?

eclipse - 即使 Hamcrest 是依赖项,Mockito bundle 也找不到 org.hamcrest 包

javascript - 如何仅在鼠标移动时触发mousemove事件

java - 验证文本是否是使用 java 模拟的

java - Future 中的代码是否有机会在之后的主线程中的代码之前运行?

eclipse - Tizen Studio 未开放

javascript - 如何确定 onmousemove 事件的方向?

java - 将一个 jPanel 上的单击事件传递到另一个 JPanel