Problema MouseEvent

di il
1 risposte

Problema MouseEvent

Sto cercando di far partire un animazione su delle immagini ogni immagine ha un hitbox ovvero un oggetto Rectangle che lo definisce. il problema sta nel fatto che quando verifico se il cursore si trova all'interno dell'hitbox mi ritorna sempre false.

ecco il codice:

questa è la mia classe MouseInput e il metodo dove parte l'evento

@Override
	public void mouseEntered(MouseEvent e) {
		switch (Gamestate.state) {
		case CARICAMENTO:
			break;
		case PLAYING:
			this.panel.getGame().getGioco().mouseEntered(e);
			break;
		case VINCITA:
			break;
		case PERDITA:
			break;
		default:
			System.exit(0);
			break;
		}
		
	}

questo evento va a chiamare mouseEntered dall'oggetto gioco 

questo è il metodo chiamato:

public void mouseEntered(MouseEvent e) {
		for(int i : this.allFish.keySet()) {
			if(isIn(e, this.allFish.get(i))) {
				this.allFish.get(i).mouseEntered(e);
			}
		}
	}

e inoltre questo è il metodo isIn

public boolean isIn(MouseEvent e, TypeBet c) {
		return c.getBounds().contains(e.getX(), e.getY());
	}
	public boolean isIn(MouseEvent e, Fish c) {
		return c.getBounds().contains(e.getX(), e.getY());
	}

pero mentre per Typebet funziona alla perfezione per Fish non funziona, ho controllato l'hitbox di Fish e si trova con le coordinate esatte e dimensioni dell'immagine ma isIn ritorna sempre false. 

come mai per Typebet funziona alla perfezione e per Fish no? perche per TypeBet il metodo è uguale solo che viene ciclata un'altra HashMap di TypeBet.

se vi servono altre informazioni per aiutarmi a capire ditemelo che ve le mando.

1 Risposte

  • Re: Problema MouseEvent

    Non so perchè tu ti stia incasinando la vita in questo modo, ma non entro nel merito.

    Il suggerimento che ti posso dare è questo.

    Modifica il metodo mouseEntered() dell'oggetto gioco in questo modo:

    public void mouseEntered(MouseEvent e) {
       System.out.println("Mouse - X=" + e.getX() + "; Y=" + e.getY());
       for(int i : this.allFish.keySet()) {
          if(isIn(e, this.allFish.get(i))) {
             this.allFish.get(i).mouseEntered(e);
          }
       }
    }

    Poi modifica il metodo isIn() di Fish in questo modo:

    public boolean isIn(MouseEvent e, Fish c) {
       Rectangle rec = c.getBounds();
       System.out.println("Fish - X=" + rec.x + "; Y=" + rec.y + "; WIDTH=" + rec.width + "; HEIGHT=" + rec.height);
       return c.getBounds().contains(e.getX(), e.getY());
    }

    Se hai modo di identificare bene l'oggetto Fish in qualche modo (io non posso saperlo) fatti stampare anche quell'identificatore in modo da capire bene di quale oggetto si tratta.

    Avvia l'applicazione da una console e vedi cosa ti viene stampato a video. Dovresti vedere stampate le coordinate del mouse e tutte le informazioni su coordinata e dimensione di tutti gli oggetti Fish.

    In questo modo puoi capire perchè quel metodo ritorna false.

    Secondo me il problema sta nel fatto che l'oggetto Fish è contenuto all'interno di un contenitore e, di conseguenza, i bounds sono relativi al contenitore e non alla finestra.

Devi accedere o registrarti per scrivere nel forum
1 risposte