我做了一个鼹鼠风格的游戏,我正在使用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;
}
}
}
}
答案 0 :(得分:1)
MouseReleased具有longPress的优势。由于发布事件将是鼠标单击的最后一个事件(按住,释放)。你必须使用
mouseReleased(MouseEvent e)
代替。这适合您的情况。
答案 1 :(得分:1)
mousePressed
每次按下后调用一次,mouseRelease
在每次发布后调用一次。如果在mousePressed
上设置布尔值为true而在mouseReleased
上设置为false当然,操作取决于您的mouseP变量将触发多次,直到您释放按钮为止。
如果您希望每次按下调用一次操作,为什么不使用:
mousePressed() {
if(someKeyIsPressed) {
// fire hit or whatever you want
}
}
像这样的事情。 mousePressed
中的操作每次按下只会执行一次。压缩释放后调用mouseClicked
。它也可以工作,所以Gaurava Agarwal所提到的产品也是如此,但是当你释放按钮时做游戏的游戏很奇怪并不常见。想象一下fps游戏,你可以在按钮释放时进行拍摄。