# Java-Projektaufgabe: Landkarte



## Qosmio (24. Apr 2007)

Guten Abend

In Partnerarbeiten müssen wir ein kleines Java-Programm in 2er Gruppen entwerfen.
Mein Partner und ich möchten ein kleines Spiel programmieren:
Man sieht eine Europa-Karte und man hat eine Hauptstadt angegeben. Mit der Maus sollte man jetzt schätzen, wo die Stadt liegt.

Das Programm sollte dann den richtigen Standort und den gewählten Standort anzeigen und die Distanz zwischen den beiden Punkten errechnen.

Leider wissen wir nicht, wie genau zu starten.
Ich habe hier mal einen Ansatz:

```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Europa extends Canvas{

   Image img = getToolkit().getImage("europa-karte.jpg");

   public void paint(Graphics g) {
      g.drawImage(img,0,0,this);
   }

   public static void main(String[] args) {
   new Europa().run();
   }
   private void run(){
           JFrame frame = new JFrame();
                frame.setSize(882,834);
                frame.setTitle("Europa-Karte");
                frame.getContentPane().add(this);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            System.exit(0);
         }
        
      });

      Europa karte = new Europa();
      frame.add(karte);
      frame.setVisible(true);
   }
  
 
  
}
```
Benötigte Karte: http://www.schoool.ch/europa-karte.jpg


Erstmals: Wie kann man einen geklickten Punkt anmalen? Oder mit einem Bild (Pfeil?) versehen?


Vielen Dank für eure Antworten


----------



## masta // thomas (24. Apr 2007)

Zunächstmal solltest du Swing und AWT nicht mischen (bzgl. Canvas auf ein JFrame legen).

Hier eine super Anleitung von Wildcart zum Zeichnen in Swing: http://www.java-forum.org/de/viewtopic.php?t=46550 

Euch ist klar, dass ihr eine Datenbank / Liste / Datei braucht, welche alle / alle wichtigsten Städte inkl. Koordinaten enthält, ja?


----------



## SlaterB (24. Apr 2007)

nach
      g.drawImage(img,0,0,this);
muss noch nicht Schluss sein,
du kannst danach auf das Bild beliebiges weiteres malen, und seien es Punkte oder Pfeile,

falls du die Zeichen-Operationen nicht kennst: AWT-Zeichnen lernen?

-----

schwieriger wird es wohl, die Koordinaten zu berechnen..

wenn du/ ihr da übt, dann fangt am besten mit einem einfacheren Hintergrund an,
z.B. ein 5x5 Raster, als so ein unübersichtlich buntes Riesenbild

-----

mit einem MouseListener kannst du herausfinden, wo (x,y) ein User klickt


----------



## Qosmio (24. Apr 2007)

Danke für die schnelle Antwort.
Wird wohl nicht ganz so einfach mit unseren Kenntnisse 

Die Stadt wird dann per Zufallsprinzip ausgewählt. Die Koordinaten (x/y) würden dann den Pixeln des Fensters entsprechen und die Entfernung vielleicht mit einem Vektor (die Entfernung kann man ja herausfinden - Luftlinie).

Nun müssten wir noch den geklickten Punkt bestimmen. In dem Fall mit MouseListener...
Und dann mit drawLine den geklicken Punkt anmalen.

Habt ihr einen Tipp für MouseListener. Ich blick da nicht so ganz durch...

Danke


----------



## masta // thomas (24. Apr 2007)

```
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Point;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MousePosition extends JFrame
{
	final private JPanel panel;
	
	public MousePosition()
	{
		super("Maus Position");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		setSize(640, 480);
		
		
		this.panel = new JPanel();
		panel.addMouseListener(new MouseAdapter()
		{
			public void mouseClicked(MouseEvent e)
			{
				panelMouseClicked(e);
			}
		});
		getContentPane().add(this.panel, BorderLayout.CENTER);
	}
	
	private void panelMouseClicked(MouseEvent e)
	{
		System.out.println(e.getPoint().getX() + ", " + e.getPoint().getY());
	}
	
	
	public static void main(String[] args)
	{
		
		new MousePosition().setVisible(true);
		
	}
}
```


----------



## Evil-Devil (25. Apr 2007)

masta // thomas hat gesagt.:
			
		

> Zunächstmal solltest du Swing und AWT nicht mischen (bzgl. Canvas auf ein JFrame legen).


Wieso nicht? Das bietet sich bei Spielen geradezu an. Kein unnötiger Overhead und mehr als zeichnen will man bei einem Spiel eh nicht. Im Falle das du dein Spiel mit Swing/AWT GUI Elementen ausstatten willst könnte ich es verstehen, aber im Normalfall zeichnet man diese auch selbst.


----------



## Gast (25. Apr 2007)

Evil_Devil: Du weißt schon, dass die vom System gezichneten AWT-Elemente die vom Pogramm gezeichneten Swing Elemente überlagern? Und wenn er ehe ALLES, auch seine Menüs, selbst auf einen Canvas zeichnet, kann er auch nur AWT verwenden. Wo soll also der Nutzen beim Mischen sein?


----------



## Sanix (25. Apr 2007)

Man doch ein XML als "Datenbank": Land, Ortschaft, X und Y Koordinaten.
Danach eine Klasse, welche alle diese Daten kennt.
Dein Canvas hat dann ein Member auf diese Klasse.
Nun klickt der Benutzer, du prüfst mittels dieser Klasse die Distanz und gibst dann etwas aus.


----------



## Qosmio (25. Apr 2007)

Danke masta // thomas für dein Beispiel.
Wie würde man jetzt in dein Beispiel ein Hintergrundbild einfügen mit der Grösse des Fensters?

Und danke für die anderen Antworten.


----------



## Evil-Devil (25. Apr 2007)

Gast hat gesagt.:
			
		

> Evil_Devil: Du weißt schon, dass die vom System gezichneten AWT-Elemente die vom Pogramm gezeichneten Swing Elemente überlagern? Und wenn er ehe ALLES, auch seine Menüs, selbst auf einen Canvas zeichnet, kann er auch nur AWT verwenden. Wo soll also der Nutzen beim Mischen sein?



Du hast meinen Beitrag nicht ganz gelesen -.-
Ich sagte doch, solange man ALLES selbst zeichnet braucht man keinerlei AWT Elemente und man kann ein Swing-Element übrigends auch auf Heavyweight stellen  Was bei einigen Anwendungen sehr praktisch ist. Stichwort JOGL und LWJGL AWT Canvas.


----------



## Gast (25. Apr 2007)

Was ist das für ein Programm sieht verdamt gut aus?
Kann man das irgendwo runterladen?


----------



## Evil-Devil (25. Apr 2007)

Das ist die GUI für meinen OBJ-Modelloader der Teil meines OpenGL Engine Projektes ist. Funktioniert derzeit leider nicht mit der aktuellen LWJGL Version. Muss ich bei Zeiten mal beheben, genauso wie ein paar OBJ File Ladefehler.


----------



## Qosmio (25. Apr 2007)

So ich hab mich mal im Forum registriert, da man hier wirklich geholfen wird. Danke & weiter so. :applaus:


----------



## Qosmio (26. Apr 2007)

Hat jemand ne Idee in den folgenden Code ein Hintergrundbild einzufügen?


```
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class Maustest extends JPanel 
                            implements MouseListener {
	
	 public static void main(String[] args) {
	        JFrame frame = new JFrame("Test");
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        JComponent newContentPane = new Maustest();
	        frame.setContentPane(newContentPane);
	        frame.setSize(640, 480);
	        frame.setVisible(true);
	        }
   

    public Maustest() {
       
        addMouseListener(this);//MouseListener zum Panel hinzufügen

    }

    public void mousePressed(MouseEvent e) {
     //nichts machen wenn maus gedrückt
    }

    public void mouseReleased(MouseEvent e) {
    	  //nichts machen wenn maus losgelassen
    }

    public void mouseEntered(MouseEvent e) {
    	  //nichts machen wenn maus in Panel kommt
    }

    public void mouseExited(MouseEvent e) {
    	  //nichts machen wenn maus aus Panel geht
    }

    public void mouseClicked(MouseEvent e) {
    	  int x=e.getX();//x+y Koordinaten holen und in Var speichern
          int y=e.getY();
          
          System.out.print(x+" / "+y);//Koordinaten ausgeben
    }
   }
```

Danke


----------



## Qosmio (28. Apr 2007)

Guten Abend zusammen.

Ich habe mich heute wieder mal mit dem Spiel befasst.
Mit dem Zeichnen habe ich noch Probleme. Und zwar kann ich keine Variablen, die ich unten berechnet habe, oben zu benutzen.

Das Problem habe ich ganz unten im Quelltext in den Kommentaren:


```
/**
 * 
 **/

//Packet-Import
import java.awt.Font;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class JavaSpiel extends JPanel implements MouseListener {

	private static final long serialVersionUID = 1L;

	// Bild für Hintergrund (Karte)
	Image img = getToolkit().getImage("europa-karte-neu.jpg");

	// Bild für Pin
	Image imgpin = getToolkit().getImage("pin.png");

	// Zeichnen
	public void paint(Graphics g) {

		// Schwarzer Rand
		g.setColor(Color.black);
		g.fillRect(0, 0, 876, 802);

		// Weisser Hintergrund
		g.setColor(Color.white);
		g.fillRect(1, 1, 874, 800);

		// Schriftart, -grösse und -farbe für "Loading...-Text"
		Font font1 = new Font("Arial", Font.PLAIN, 20);
		g.setFont(font1);
		g.setColor(Color.black);
		g.drawString("Loading...", 350, 400);

		// Hintergrund zeichnen
		g.drawImage(img, 1, 1, this);

		// Schriftart, -grösse und -farbe für "Info-Box"
		Font font2 = new Font("Arial", Font.PLAIN, 16);
		g.setFont(font2);
		g.setColor(Color.black);

		// Aufgabenstellung
		g.drawString("Aufgabe:", 681, 30);
		g.drawString("Finden Sie die Stadt ", 681, 60);
		g.drawString(stadt + ". ", 681, 80);
		g.drawString("Distanz zu", 681, 150);
		g.drawString(stadt + " beträgt: ", 681, 170);

	}

	// Zufallszahl zwischen 1 und 49 erzeugen
	long start = Math.round(Math.random() * 48 + 1);

	// Variablen
	double stadty = 0, stadtx = 0;

	String stadt = "xy";
	{

		// Start Städte-Zuordnung mit Koordinaten und Beschreibung
		// Reykjavik
		if (start == 1) {
			stadtx = 188;
			stadty = 329;
			stadt = "Reykjavik";
		}

		// Athen
		if (start == 2) {
			stadtx = 188;
			stadty = 329;
			stadt = "Athen";
		}
		// Andorra
		if (start == 3) {
			stadtx = 188;
			stadty = 329;
			stadt = "Andorra";
		}
		// Rom
		if (start == 4) {
			stadtx = 188;
			stadty = 329;
			stadt = "Rom";
		}
		// San Marino
		if (start == 5) {
			stadtx = 188;
			stadty = 329;
			stadt = "San Marino";
		}
		// Paris
		if (start == 6) {
			stadtx = 188;
			stadty = 329;
			stadt = "Paris";
		}
		// Valletta
		if (start == 7) {
			stadtx = 188;
			stadty = 329;
			stadt = "Valletta";
		}
		// Monaco
		if (start == 8) {
			stadtx = 188;
			stadty = 329;
			stadt = "Monaco";
		}
		// Vatikan Stadt
		if (start == 9) {
			stadtx = 188;
			stadty = 329;
			stadt = "Vatikan Stadt";
		}
		// Wilna
		if (start == 10) {
			stadtx = 188;
			stadty = 329;
			stadt = "Wilna";
		}
		// Madrid
		if (start == 11) {
			stadtx = 188;
			stadty = 329;
			stadt = "Madrid";
		}
		// Budapest
		if (start == 12) {
			stadtx = 188;
			stadty = 329;
			stadt = "Budapest";
		}
		// Bukarest
		if (start == 13) {
			stadtx = 188;
			stadty = 329;
			stadt = "Bukarest";
		}
		// Sofia
		if (start == 14) {
			stadtx = 188;
			stadty = 329;
			stadt = "Sofia";
		}
		// Helsinki
		if (start == 15) {
			stadtx = 188;
			stadty = 329;
			stadt = "Helsinki";
		}
		// Kiew
		if (start == 16) {
			stadtx = 188;
			stadty = 329;
			stadt = "Kiew";
		}
		// Riga
		if (start == 17) {
			stadtx = 188;
			stadty = 329;
			stadt = "Riga";
		}
		// Tiflis
		if (start == 18) {
			stadtx = 188;
			stadty = 329;
			stadt = "Tiflis";
		}
		// Minsk
		if (start == 19) {
			stadtx = 188;
			stadty = 329;
			stadt = "Minsk";
		}
		// Bern
		if (start == 20) {
			stadtx = 188;
			stadty = 329;
			stadt = "Bern";
		}
		// Kischinew
		if (start == 21) {
			stadtx = 188;
			stadty = 329;
			stadt = "Kischinew";
		}
		// Tirana
		if (start == 22) {
			stadtx = 188;
			stadty = 329;
			stadt = "Tirana";
		}
		// Moskau
		if (start == 23) {
			stadtx = 188;
			stadty = 329;
			stadt = "Moskau";
		}
		// Berlin
		if (start == 24) {
			stadtx = 188;
			stadty = 329;
			stadt = "Berlin";
		}
		// Edinburgh
		if (start == 25) {
			stadtx = 188;
			stadty = 329;
			stadt = "Edinburgh";
		}
		// Dublin
		if (start == 26) {
			stadtx = 188;
			stadty = 329;
			stadt = "Dublin";
		}
		// Wien
		if (start == 27) {
			stadtx = 188;
			stadty = 329;
			stadt = "Wien";
		}
		// Pressburg
		if (start == 28) {
			stadtx = 188;
			stadty = 329;
			stadt = "Pressburg";
		}
		// Prag
		if (start == 29) {
			stadtx = 188;
			stadty = 329;
			stadt = "Prag";
		}
		// Ankara
		if (start == 30) {
			stadtx = 188;
			stadty = 329;
			stadt = "Ankara";
		}
		// Warschau
		if (start == 31) {
			stadtx = 188;
			stadty = 329;
			stadt = "Warschau";
		}
		// Luxemburg
		if (start == 32) {
			stadtx = 188;
			stadty = 329;
			stadt = "Luxemburg";
		}
		// Tallinn
		if (start == 33) {
			stadtx = 188;
			stadty = 329;
			stadt = "Tallinn";
		}
		// Stockholm
		if (start == 34) {
			stadtx = 188;
			stadty = 329;
			stadt = "Stockholm";
		}
		// Vaduz
		if (start == 35) {
			stadtx = 188;
			stadty = 329;
			stadt = "Vaduz";
		}
		// Koppenhagen
		if (start == 36) {
			stadtx = 188;
			stadty = 329;
			stadt = "Koppenhagen";
		}
		// Amserdamm
		if (start == 37) {
			stadtx = 188;
			stadty = 329;
			stadt = "Amserdamm";
		}
		// Zagreb
		if (start == 38) {
			stadtx = 188;
			stadty = 329;
			stadt = "Zagreb";
		}
		// Oslo
		if (start == 39) {
			stadtx = 188;
			stadty = 329;
			stadt = "Oslo";
		}
		// Cardiff
		if (start == 40) {
			stadtx = 188;
			stadty = 329;
			stadt = "Cardiff";
		}
		// Belfast
		if (start == 41) {
			stadtx = 188;
			stadty = 329;
			stadt = "Belfast";
		}
		// Brüssel
		if (start == 42) {
			stadtx = 188;
			stadty = 329;
			stadt = "Brüssel";
		}

		// Lissabon
		if (start == 43) {
			stadtx = 188;
			stadty = 329;
			stadt = "Lissabon";
		}
		// Ljubljana
		if (start == 44) {
			stadtx = 188;
			stadty = 329;
			stadt = "Ljubljana";
		}
		// Skopje
		if (start == 45) {
			stadtx = 188;
			stadty = 329;
			stadt = "Skopje";
		}
		// London
		if (start == 46) {
			stadtx = 188;
			stadty = 329;
			stadt = "London";
		}
		// Sarajevo
		if (start == 47) {
			stadtx = 188;
			stadty = 329;
			stadt = "Sarajevo";
		}
		// Belgrad
		if (start == 48) {
			stadtx = 188;
			stadty = 329;
			stadt = "Belgrad";
		}
		// Gibraltar
		if (start == 50) {
			stadtx = 188;
			stadty = 329;
			stadt = "Gibraltar";
		}

	}

	// Ende Städte-Zuordnung

	// Fenster erzeugen
	public static void main(String[] args) {
		JFrame frame = new JFrame(
				"Java-Spiel von Luca Schneider und Dominik Meyer");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JComponent newContentPane = new JavaSpiel();
		frame.setContentPane(newContentPane);
		frame.setSize(884, 836);
		frame.setVisible(true);
	}

	public JavaSpiel() {

		addMouseListener(this);// MouseListener zum Panel hinzufügen

	}

	public void mousePressed(MouseEvent e) {
		// Was machen, wenn Maus gedrückt?

	}

	public void mouseReleased(MouseEvent e) {
		// Was machen, wenn Maus losgelassen?
	}

	public void mouseEntered(MouseEvent e) {
		// Was machen, wenn Maus in Panel kommt?
	}

	public void mouseExited(MouseEvent e) {
		// Was machen, wenn Maus aus Panel geht?
	}

	public void mouseClicked(MouseEvent e) {

		// Variablen
		double y, x, ux, uy, v, d;

		// Geklickte X und Y Koordianten
		x = e.getPoint().getX();
		y = e.getPoint().getY();

		// Unterschied der verschiedenen X und Y Koordinaten
		if (x > stadtx) {
			ux = x - stadtx;

			if (y > stadty) {
				uy = y - stadty;
			} else {
				uy = stadty - y;
			}
		} else {
			ux = stadtx - x;

			if (y > stadty) {
				uy = y - stadty;
			} else {
				uy = stadty - y;
			}
		}

		// Satz des Pythagoras für Vektorberechnung der 2 Punkte (in Pixel)
		v = Math.sqrt((ux * ux) + (uy * uy));

		// Pixel in Kilometer
		d = v * 5.5075;
		long distanz = Math.round(d);

	}

	/**
	 * 
	 * // Hintergrund zeichnen
	 * g.drawImage(imgpin, x-5, y-31, this);
	 * 
	 * // Schriftart, -grösse und -farbe für "Info-Box" Distanzausgabe
	 * Font font3 = new Font("Arial", Font.PLAIN, 16);
	 * g.setFont(font3);
	 * g.setColor(Color.black);¨
	 * 
	 * // Distanzanzeige
	 * g.drawString(distanz+" Kilometer", 681, 200);
	 * 
	 */

}
```

PS. Wenn der Code zu simpel bzw. billig oder so scheint, liegt das daran, dass ich es nur einfach programmieren kann.


----------

