# Erkennung ob jemand auf ein Areal geklickt hat



## babuschka (20. Jan 2012)

Der user sollte mit der maus die fliege anklicken,danach sollten neue X,Y cordinate generiert werden und das Bild sollte am neuen platz erscheinen. Alles klappt ausser Das verschieben des bildes(denke ich). Und ja, das Score teil ist nochnicht eingebaut

```
package ch.shooter;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.net.URL;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GamePanel extends JPanel implements Runnable{
	JFrame frame;
	long delta= 0;
	long last= 0;
	long fps= 0;
	int randomX=0;
	int randomY=0;
	int randomX1=randomX+26;
	int randomY1=randomY+20;
	int kills=0;
	 Random generator = new Random();
	private final Image background = getImage("http://img210.imageshack.us/img210/1575/hintergrung.jpg");
	private final Image toKill = getImage("http://img824.imageshack.us/img824/2509/fliege.gif");
	public int getX(){
		return randomX;
	}
	public int getY(){
		return randomY;
	}
	public int getX1(){
		return randomX1;
	}
	public int getY1(){
		return randomY1;
	}
	
	public boolean dead= false;

	public static void main(String[]args){
		new GamePanel(600,376);
	}
	private static final long serialVersionUID  = 1L;
	
	private Image getImage(String url) {
        try {
            return ImageIO.read(new URL(url));
        } catch(IOException e) {
            return null;
        }
    }
	public GamePanel(int w, int h){
		this.setPreferredSize(new Dimension(w,h));
		frame = new JFrame("Shooter");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		
		//Cursor
		Cursor hourglassCursor = new Cursor(Cursor.CROSSHAIR_CURSOR);
		setCursor(hourglassCursor);
		
		doInit();
		Thread th = new Thread(this);
		th.start();
		
	}
	private void doInit(){
		last = System.nanoTime();
		
		
	}
	private void computeDelta() {
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		fps = ((long)1e9)/delta;
	}
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.red);
		//g.drawString("FPS:"+ Long.toString(fps),20,10 );
		g.drawImage(background,1,1,null);
		g.drawImage(toKill, randomX, randomY,null);
		g.drawString("Score: "+kills,90,10);
	}
	@Override
	public void run(){
		
		while(frame.isVisible()){
			computeDelta();
			
			
			
			
			try{
				Thread.sleep(10);
			}catch (InterruptedException e) {}
			repaint();
			if(dead==true){
				newCords();
				dead=false;
			}
		}
		
	}
	private void newCords(){
		randomX = generator.nextInt(500) + 1;
		randomY = generator.nextInt(350) + 1;
	}

	public void mouseClicked(MouseEvent e) {
	                  
		if (e.getX()>= randomX || e.getX() <= randomX1){
			if(e.getY()>= randomY || e.getY() <= randomY1){
				dead=true;
			}else{
				
			}
				
		}
	    }
	

}
```


----------



## eddgedd (20. Jan 2012)

Zunächst einmal gibt es einige Probleme mit den Variablen randomX1 und randomY1. Diese werden in deinem Programm nämlich nur einmal gesetzt, d.h veränderts du randomX bleibt randomX1 unverändert. Du müsstest also jedesmal wenn du randomX veränderst auch randomX1 anpassen.Für randomY und randomY1 genauso. Das ist aber umständlich. Am besten erstetzt du randomX1 durch width und randomY1 durch height. Diese stellen dann die Breite und Höhe des Rechteckes dar und müssten in deinem Fall auf  26 bzw. 20 gesetzt werden. Dann solltest du überall randomX1 durch randomX+width und randomY1 durch randomY + height ersetzten. Die Methoden solltest du dem entsprechend anpassen.

Auserdem kannst du folgende Zeile 

```
if(dead==true){
```
durch folgende ersezten :

```
if( dead ) {
```
denn die if-Anweisung wird immer dann ausgeführt, wenn das , was zwischen den Klammern steht true ergibt. 

Ansonsten kannst du die zweite if-Anweisung in mouseClicked() in die erste einfugen :

```
if (e.getX()>= randomX && e.getX() <= randomX + width && e.getY() >= randomY && e.getY() <= randomY + height ) {
```

Du könntest e.getX() und e.getY() vorher in Variablen speichern, damit du die gleiche Methode nicht zweimal aufrufst. Sollte man eigentlich immer machen, wenn möglich.

So das wars. Hoffe ich konnte dir helfen. 

EDIT : Oh mir ist aufgefallen, dass du in Zeile 122 und 123 den Oder-Operator || anstatt des Und-Operators verwendest. In deinem Fall müsste nur eine Bedingung true sein, was keinen Sinn ergibt. Habe meinen Beitrag oben dem entsprechend angepasst.


----------



## babuschka (20. Jan 2012)

eddgedd hat gesagt.:


> Zunächst einmal gibt es einige Probleme mit den Variablen randomX1 und randomY1. Diese werden in deinem Programm nämlich nur einmal gesetzt, d.h veränderts du randomX bleibt randomX1 unverändert. Du müsstest also jedesmal wenn du randomX veränderst auch randomX1 anpassen.Für randomY und randomY1 genauso. Das ist aber umständlich. Am besten erstetzt du randomX1 durch width und randomY1 durch height. Diese stellen dann die Breite und Höhe des Rechteckes dar und müssten in deinem Fall auf  26 bzw. 20 gesetzt werden. Dann solltest du überall randomX1 durch randomX+width und randomY1 durch randomY + height ersetzten. Die Methoden solltest du dem entsprechend anpassen.
> 
> Auserdem kannst du folgende Zeile
> 
> ...



Danke, befor du das edit ned hattest, musste man nur auf den bildschirm klicken um einen "score" zu bekommen, aber jetzt geht es


----------

