# Mouseover Area genau wie Image



## Clover (18. Apr 2012)

Hallo liebe Leute 

Ich bin dabei ein kleines Spiel zu programmieren. Ich benutze slick2d und lwjgl.

Mein Problem:
Eine Image mit einer MouseOverArea die genauso groß ist wie das Image. 


```
public void init(GameContainer container, StateBasedGame game)
			throws SlickException {
....
		moa = new MouseOverArea(container, newGameOn, 10, 10);
}
public void render(GameContainer container, StateBasedGame game, Graphics g)
			throws SlickException {
....
		moa.render(container, g);
	}
```

Bei meinem Quellcode ist "moa.isMouseOver()" true, schon bevor der Zeiger das Image überhaupt berührt hat.
Ist das überhaupt möglich beides möglichst gleich groß zu machen in Java?

lg Clover


----------



## Evil-Devil (18. Apr 2012)

Dazu steht doch bestimmt was in der Slick Doku. Das letzte Mal als ich die Slick UI Demos ausprobiert hatte, reagierten die Mouse Over nur beim wirklichen Überfahren der Schaltfläche. Vielleicht ist deine Schaltfläche größer definiert als dein Bild groß ist.


----------



## Clover (18. Apr 2012)

Nein, die MouseOverArea ist von x-width und y-width genauso groß wie mein Image. Aber eben
ein Rechteck.

Hab jetzt mehrere (umständliche) Lösungsansätze:
1. Ich erstelle die MOA mit einem Polygon-Shape. Dann brauch ich aber viele Punkte um eine
gescheite Area zu bekommen.

2. Ich lege hinter das Image mehrere Shapes mit Kreise, Dreiecken und versuche so das Image
komplett abzudecken.

3. Lege über den kompletten Screen ein Raster mit kleinen MOA und muss dann Grenzen für mein
Image definieren.

Aber alles nicht so schön


----------



## irgendjemand (18. Apr 2012)

kenne mich mit der verwendeten engine nicht aus ... aber ist es nicht möglich der gewünschten component dierekt eine art listener zu adden ? würde zumindest das ganze vereinfachen *ob es dann allerdings bei polygon-shapes zum gewünschten ergnis führt ist fraglich ...*


----------



## Marco13 (18. Apr 2012)

Clover hat gesagt.:


> Nein, die MouseOverArea ist von x-width und y-width genauso groß wie mein Image. Aber eben
> ein Rechteck.




Und... dein Image ist KEIN Rechteck? (Irgendwas mit Transparenz?)


----------



## Clover (19. Apr 2012)

Mein Image ist ein PNG-Bild und leider kein Rechteck. Würde es denn in JAVA andere Möglichkeiten
geben das Bild mit einem Listener zu kombinieren? 
@irgendjemand: 
	
	
	
	





```
MouseOverArea moa = new MouseOverArea(container, image, x, y, new ComponentListener() {
			
			@Override
			public void componentActivated(AbstractComponent source) {
				
			}
		});
```
aber auch das funktioniert nicht  Und anders weiß ich nicht wie ich einem Image einen ComponentListener hinzufügen kann.


----------



## Marco13 (19. Apr 2012)

Meine Frage zielte darauf ab, dass das Bild IMMER (IMMER) ein Rechteck ist. Es hat vielleicht durchsichtige Bereiche (d.h. Bereiche mit Alpha-Wert 0), aber das Bild ist immer rechteckig. Du kannst dir aber von dem Image mit
Color c = image.getColor(mouseEvent.getX(), mouseEvent.getY());
int alpha = c.getAlpha();
den Alpha-Wert abholen, und dann sowas machen wie

```
if (alpha > 0) imageWasClicked();
else imageWasClickedButIdontCareBecauseItWasInATransparentArea();
```


----------



## Evil-Devil (19. Apr 2012)

Naja, SLICK bietet eben "nur" GUI Komponenten die rechteckig sind an. Alles andere musst du dir selbst entwickeln.
Mit Transparenz kann SLICK umgehen. Es sollte also nicht so schwierig sein in einem neuen GUI Element auf Transparenz zu testen.


----------



## Clover (19. Apr 2012)

Marco13, danke!  So wie du es gesagt hast funktioniert es wie ich möchte.

Code für Interessierte:

```
...
moa = new MouseOverArea(container, meinImage, 9, 202);
...
public void mouseMoved(int oldx, int oldy, int newx, int newy) {
		if (moa.isMouseOver()) {
			Color c = meinImage.getColor(newx - moa.getX(), newy - moa.getY());
			int alpha = c.getAlpha();
			if (alpha > 0 && !isNewGameOn) {
				...
			}
		}
	}
```


----------

