2016-07-18 6 views
2

私はWhack a Moleスタイルのゲームを作成しました。私は、このモル数を打つためにmousePressed()メソッドを使用しています。コードは正常に動作しますが、マウスを押したままにするだけで簡単にやり遂げることができる、ゲームを破壊するような攻撃があります。基本的に毎回マウスをクリックするのではなく、それを押さえて各モルを得ることができます。この問題を解決するには、mouseClicked()を代わりに使用しました。同じ問題です。これはおそらく、私がmousePressed()で持っているブーリアンに起因するものですが、別のゲームで同様の問題があり、ブーリアン変数がないところでコーディングしているので、わかりません。私はあなたがモル、任意の解決策を叩きたいときに毎回クリックしなければならないようにゲームをしたいですか?私はちょうどここに来たような3時間のためのそれでトラブルシューティングの代わりにタイマーを使用することについて考えた。ありがとう - ここにコードです:処理:mousePressed()/ mouseClicked()ticks too too often

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) 

を使用する必要があります。これはあなたの状況に適しています。各リリースの後に一度呼ば

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

1

各プレスの後に一度呼ばmousePressedmouseRelease。ブール値をmousePressedに設定し、mouseReleasedにfalseを設定すると、ボタンを放すまでmouseP変数に依存するアクションが何度もトリガーされます。

したい場合は、プレスごとに一度と呼ばれるアクションは、なぜあなただ​​けを使用いけない:

mousePressed() { 
    if(someKeyIsPressed) { 
     // fire hit or whatever you want 
    } 
} 

このような何かを。 mousePressedのアクションは、1回のプレスで1回だけ実行されます。 mouseClickedは、プレスリリースの後に呼び出されます。それはGaurava Agarwalによって言及された精神もそうすることができますが、あなたがボタンを放すときにアサーションをするゲームでは、奇妙なことは珍しいです。ボタンが離されたときに撮影するfpsゲームを想像してみてください。