Eine strategische Landkarte

VBKenner

Mitglied
Hallo,
wie kann ich eine Landkarte erstellen, sodass ich wenn ich über ein Land mit der Maus fahre die Grenze hervorgehoben und die Hintergrundfarbe des Landes verändert wird?

Außerdem sollten die Länder nicht so aussehen wie Fünfecke oder Dreiecke sondern halt real.

edit: Ach ja, natürlich muss dann irgendwas aufgerufen werden mit dem LandObjekt damit ich auf den MouseOver oder Click auch reagieren kann.
 
Ob's einfacher geht, weiß ich nicht.

Du könntest eine Karte einscannen, das Bild auf ein Panel zeichnen, unter Verwendung eines MouseMotionListeners die Pixel-Koordinaten z.B. in eine externe Datei schreiben lassen und somit die Landesgrenzen abfahren. Nun, da Du die Grenzpixel weißt, weißt Du auch, ob Du innerhalb eines Landes bist. Die Hälfte ist geschafft. Nun nimmst Du alle Pixel-Koordinaten und malst damit Deine Landes-Polygone in der entsprechenden Farbe, die den Pixel-Koordinaten entsprechen, die Du mit dem MouseListener beim Anklicken Deiner Landkarte erhälst.;-)
 
Hi,
bin mir nicht ganz so sicher wie du das meinst. Ein Bild laden, dann mit der Maus die Grenzen abfahren, gleichzeitig die Grenze in einem Format in eine Datei speichern. Dann im "Spielmodus" bei jedem MouseMove die Coordinaten anfragen und mit denen im Array vergleichen (Array besteht aus dem Datensatz der datei?

Ist schon ein wenig kompliziert. Vor allem wüsst ich jetzt nicht wie ich da prüfen könnte ob man noch in dem land ist (ist ja nicht nur ein Rechteck).

Am besten einfachsten wäre es wohl wenn man eine Karte laden würde und das Programm dann selber die Grenzen definieren könnte anhand von Farben (hab' z.B. ne bestimmte Farbe bei Grenzen in meinem Atlas)
 
Hi,

grundsätzlich würde ich das, glaub ich auch machen wie schnuffie,
Je genauer die Karte sein soll, desto mehr Infos musst du ja dann auch irgendwie verarbeiten. Wenn die Grenzen real sein sollten, dann musst du ja zwangsweise alle Koordinaten der Grenzen irgendwo gespeichert haben.
Eine einfachere Variante, aber viel unsauberer, ist, leg innerhalb deines Landes ein gedachtes Rechteck soweit an die Grenzen wie möglich. Da brauchst du als Koordinaten nur die Eckpunkte zu wissen, denn alles was zwischendrin ist, gehört dann zum Land.

greetingz
goodogd
 
Hallo!

Habe sowas ähnliches mal für einen anderen Beitrag gebaut (bzw. damit angefangen, wie man sehen kann)...
Lade doch einfach mal den angehängten Hüttenplan und klicke ein wenig auf der Karte herum.
Java:
/**
 * 
 */
package de.tutorials;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;

/**
 * @author Thomas
 * 
 */
public class FacePlanExample extends JFrame {

    LayoutPanel layoutPanel;

    final static String LAYOUT_DATA_EXTENSION = ".layout";

    public FacePlanExample() {
        super("FacePlanExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        createJMenuBar();

        layoutPanel = new LayoutPanel();
        JScrollPane scrollPane = new JScrollPane(layoutPanel);
        scrollPane.setPreferredSize(new Dimension(400, 300));

        add(scrollPane);

        pack();
        setVisible(true);
    }

    /**
     * 
     */
    private void createJMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");

        JMenuItem loadMenuItem = new JMenuItem("load");
        loadMenuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                loadLayout();
            }
        });
        JMenuItem saveMenuItem = new JMenuItem("save");
        JMenuItem quitMenuItem = new JMenuItem("quit");

        fileMenu.add(loadMenuItem);
        fileMenu.add(saveMenuItem);
        fileMenu.add(new JSeparator());
        fileMenu.add(quitMenuItem);

        menuBar.add(fileMenu);

        setJMenuBar(menuBar);
    }

    protected void loadLayoutImage(File file) {
        try {
            BufferedImage image = ImageIO.read(file);
            layoutPanel.setLayoutImage(image);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected void loadLayoutDataFile(File file) {
        File layoutDataFile = new File(file.getParentFile(), file.getName()
                .concat(LAYOUT_DATA_EXTENSION));
        System.out.println(layoutDataFile);
        if (layoutDataFile.exists()) {

        }

    }

    protected void loadLayout() {
        System.out.println("load item");
        JFileChooser fileChooser = new JFileChooser("c:/");
        int optionValue = fileChooser.showOpenDialog(this);
        if (optionValue == JFileChooser.APPROVE_OPTION) {
            File file = fileChooser.getSelectedFile();
            loadLayoutImage(file);
            loadLayoutDataFile(file);
            layoutPanel.updateUI();
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new FacePlanExample();

    }

    static class LayoutPanel extends JPanel {
        BufferedImage layoutImage;

        File layoutDataFile;

        List<LayoutData> layoutDataList = new ArrayList<LayoutData>();

        Polygon currentPolygon;

        Composite composite = AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, 0.3F);

        public LayoutPanel() {
            setDoubleBuffered(true);
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    System.out.println("foo");
                    if (SwingUtilities.isRightMouseButton(e)) {
                        currentPolygon = null;
                    }

                    if (SwingUtilities.isLeftMouseButton(e)) {
                        if (currentPolygon == null) {
                            currentPolygon = new Polygon();
                        }

                        Point p = e.getPoint();
                        currentPolygon.addPoint(p.x, p.y);

                        if (currentPolygon.npoints == 4) {

                            String id = JOptionPane
                                    .showInputDialog("Please enter an ID for the current area.");
                            LayoutData layoutData = new LayoutData(
                                    currentPolygon, id);
                            layoutDataList.add(layoutData);
                            currentPolygon = null;
                            repaint();
                        }
                    }
                }
            });

            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    Point p = e.getPoint();
                    if (currentPolygon != null) {
                        GeneralPath path = new GeneralPath();
                        path.moveTo(currentPolygon.xpoints[0],
                                currentPolygon.ypoints[0]);
                        for (int i = 0; i < currentPolygon.npoints; i++) {
                            path.lineTo(currentPolygon.xpoints[i],
                                    currentPolygon.ypoints[i]);
                            path.moveTo(currentPolygon.xpoints[i],
                                    currentPolygon.ypoints[i]);
                        }
                        Graphics2D g = (Graphics2D) getGraphics();
                        g.draw(path);
                        g
                                .drawLine(
                                        currentPolygon.xpoints[currentPolygon.npoints - 1],
                                        currentPolygon.ypoints[currentPolygon.npoints - 1],
                                        p.x, p.y);
                        repaint();
                    }

                    LayoutData layoutData = isMouseOverLayoutElement(p);
                    if (layoutData != null) {
                        setToolTipText(layoutData.getId());
                    } else {
                        setToolTipText("");
                    }
                }
            });
        }

        private LayoutData isMouseOverLayoutElement(Point p) {
            for (LayoutData layoutData : layoutDataList) {
                if (layoutData.getPolygon().contains(p)) {
                    return layoutData;
                }
            }
            return null;
        }

        public BufferedImage getLayoutImage() {
            return layoutImage;
        }

        public void setLayoutImage(BufferedImage layoutImage) {
            this.layoutImage = layoutImage;
            Dimension dimension = new Dimension(layoutImage.getWidth(),
                    layoutImage.getHeight());
            setPreferredSize(dimension);
        }

        public File getLayoutDataFile() {
            return layoutDataFile;
        }

        public void setLayoutDataFile(File layoutDataFile) {
            this.layoutDataFile = layoutDataFile;
        }

        protected void paintComponent(Graphics gra) {
            Graphics2D g = (Graphics2D) gra;
            super.paintComponent(g);
            g.drawImage(layoutImage, 0, 0, null);

            g.setColor(Color.RED);
            g.setComposite(composite);
            for (LayoutData layoutData : layoutDataList) {
                g.fillPolygon(layoutData.getPolygon());
            }
        }
    }

    static class LayoutData {
        Polygon polygon;

        String id;

        public LayoutData(Polygon polygon, String id) {
            super();
            // TODO Auto-generated constructor stub
            this.polygon = polygon;
            this.id = id;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public Polygon getPolygon() {
            return polygon;
        }

        public void setPolygon(Polygon polygon) {
            this.polygon = polygon;
        }

    }
}

Gruss Tom
 

Anhänge

  • Huettenplan.jpg
    Huettenplan.jpg
    105,4 KB · Aufrufe: 90
Hi,
also dein Programm ist interessant Thomas, nur fehlt die Speicher- und Einlesemethode :-)

goodogd: Also so wie ich das verstanden habe? Ja, an die Methode einfach mehrere Rechtecke zu nehmen habe ich auch gedacht allerdings, naja...

Wie ich das jetzt konkret löse weiß ich noch nicht, wahrscheinlich werde ich mir Thomas' Programm nochmal angucken und neuschreiben.

Übrigens, den Code musste ich erstmal aufbereiten nach dem Copy n' Paste, entweder werden Zahlen oder "#" mitkopiert mit FF oder IE. Wäre gut wenn das noch gelöst wird bevor das Board "V1" erreicht :D
 
Zurück