处理:mousePressed()/ mouseClicked()经常打勾

时间:2016-07-18 02:00:42

标签: java eclipse mouseevent

我做了一个鼹鼠风格的游戏,我正在使用mousePressed()方法来敲击鼹鼠。代码工作正常,唯一的问题是有一种破坏游戏的漏洞利用,只需按住鼠标即可完成。基本上不是每次点击鼠标而只是按住它来获得每个痣。为了尝试解决这个问题,我使用了mouseClicked() - 相同的问题。这可能是由于我在mousePressed()中的布尔值,但我不知道,因为我在另一个游戏中有类似的问题,我编码的地方没有布尔变量。我希望游戏能让你每次想要敲击鼹鼠,任何解决方案都要点击吗?我考虑使用计时器而不是故障排除,我刚刚来到这里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;
        }
    }
    }
}

2 个答案:

答案 0 :(得分:1)

MouseReleased具有longPress的优势。由于发布事件将是鼠标单击的最后一个事件(按住,释放)。你必须使用

 mouseReleased(MouseEvent e)

代替。这适合您的情况。

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

答案 1 :(得分:1)

mousePressed每次按下后调用一次,mouseRelease在每次发布后调用一次。如果在mousePressed上设置布尔值为true而在mouseReleased上设置为false当然,操作取决于您的mouseP变量将触发多次,直到您释放按钮为止。

如果您希望每次按下调用一次操作,为什么不使用:

mousePressed() {
    if(someKeyIsPressed) {
        // fire hit or whatever you want
    }
}
像这样的事情。 mousePressed中的操作每次按下只会执行一次。压缩释放后调用mouseClicked。它也可以工作,所以Gaurava Agarwal所提到的产品也是如此,但是当你释放按钮时做游戏的游戏很奇怪并不常见。想象一下fps游戏,你可以在按钮释放时进行拍摄。