# Map wieder Tilemap =(



## Dagobert (2. Jul 2008)

Ich habe heute Nacht angefangen einen kleinen Tilemapeditor zu testzwecken zu schreiben. Jedoch scheitert es bei mir da recht schnell wie ich feststellen musste.
Die Tiles werden richtig dargestellt, jedoch muss da irgendwo noch ein großer Fehler drin stecken.
Ich habe das Problem, dass sich der Bildausschnitt nicht verschiebt wenn ich an den rechten Rand mit der Maus gehe, zumindest nicht Graphisch.
Aber ich komme IMO echt nicht drauf was ich falsch mache.
Ich wäre echt danktbar für eure wiederholte Hilfe.

```
package MapEditor;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MapEditor extends JPanel implements MouseMotionListener,
		ActionListener, KeyListener {
	private HashMap<Integer, BufferedImage> tiles;
	private Vector<Tile> map;
	private boolean mapIsLoad = false;
	private int mapWidth;
	private int mapHeight;
	private Rectangle2D.Double display;
	private final int MAXSIZE = 120;
	private final int TILEWIDTH = 50;

	public static void main(String[] argv) {
		MapEditor me = new MapEditor(800, 600);
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(800, 600));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.add(me);
		frame.pack();
		frame.setVisible(true);

		me.loadLevel("resourcen/maps/grassland.mapi");
	}

	public MapEditor(int width, int height) {
		tiles = new HashMap<Integer, BufferedImage>();
		map = new Vector<Tile>();
		display = new Rectangle2D.Double(0, 0, width, height);
		this.addMouseMotionListener(this);
		loadTiles();
	}

	public void loadTiles() {
		FileReader in = null;
		try {
			in = new FileReader("resourcen/tiles/tiles.tl");
		} catch (FileNotFoundException e) {
			System.out.println("Tiles konnten nicht geladen werden");
			e.printStackTrace();
		}
		BufferedReader bf = new BufferedReader(in);
		boolean next = true;
		MediaTracker mt = new MediaTracker(this);
		while (next) {
			String tileInfo = null;
			try {
				tileInfo = bf.readLine();
				if (tileInfo == null) {
					next = false;
					break;
				}
				String[] tile = tileInfo.split(";");
				BufferedImage tempImg = ImageIO.read(new File(
						"resourcen/tiles/" + tile[2]));
				mt.addImage(tempImg, 0);
				mt.waitForAll();
				tiles.put(Integer.parseInt(tile[0]), tempImg);
			} catch (IOException e) {
				System.out.println("Fehler beim lesen der Datei");
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			bf.close();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		mapIsLoad = true;
	}

	public void loadLevel(String path) {
		FileReader in = null;
		try {
			in = new FileReader(path);
		} catch (FileNotFoundException e) {
			System.out.println("Tiles konnten nicht geladen werden");
			e.printStackTrace();
		}
		BufferedReader bf = new BufferedReader(in);
		boolean next = true;
		mapHeight = 0;
		while (next) {
			String temp = null;
			try {
				temp = bf.readLine();
				if (temp == null) {
					next = false;
					break;
				}
				mapWidth = Math.max(mapWidth, temp.length());
				for (int i = 0; i < temp.length(); i++) {
					int id = Integer.parseInt(temp.substring(i, i + 1));
					Tile tempTile = new Tile(id, tiles.get(id).getWidth() * i,
							tiles.get(id).getHeight() * mapHeight, tiles
									.get(id).getWidth(), tiles.get(id)
									.getHeight());
					map.add(tempTile);
				}
				mapHeight++;

			} catch (IOException e) {
				System.out.println("Fehler beim lesen der Datei");
				e.printStackTrace();
			}
		}
		try {
			bf.close();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		repaint();

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		if (mapIsLoad) {
			if (display.getX() > 0 && e.getX() <= 20) {
				System.out.println("Nach Links verschieben");
				display.x -= 5;
				System.out.println("Screen: " + display.getX());
				repaint();
			} else if (display.getX() + display.getWidth() <= mapWidth*TILEWIDTH && e.getX() >= display.getWidth() - 20) {
				System.out.println("Nach Rechts verschieben");
				display.x += 5;
				System.out.println("Screen: " + display.getX());
				repaint();
			}
		}
	}

	public void paintComponent(Graphics g) {
		Tile temp;
		for (int i = 0; i < map.size(); i++) {
			temp = map.get(i);
			System.out.println("Tile " + i + "(" + temp.getX() + "|"
					+ temp.getY() + "): " + (temp.intersects(display)));
			if (temp.intersects(display)){
				g.drawImage(tiles.get(temp.getImage()), (int) temp.getX(),(int) temp.getY(), (int) temp.getWidth(), (int) temp
							.getHeight(), this);
			}
		}
	}
}
```


```
package MapEditor;

import java.awt.geom.Rectangle2D;


public class Tile extends Rectangle2D.Double {
	String name;
	int image;
	public Tile(int image, int x, int y, int width, int height){
		super(x, y, width, height);
		setImage(image);
	}
	public void setImage(int image){
		this.image = image;
	}
	public int getImage(){
		return this.image;
	}
}
```

und nun noch die txt Datei, die die Landschaft vorgibt


> 121212121212121212
> 11111
> 22222



mfg. Dagobert[/quote]


----------



## Dagobert (2. Jul 2008)

Ok das mit dem Zeichnen klappt jetzt,
aber irgendwo ist noch ein fetter Logikfehler.
Mein Inhalt "bewegt" sich nicht, sondern nur die ersten Tiles werden nicht mehr angezeigt.
(Sieht nicht schön aus)^^


----------



## Quaxli (2. Jul 2008)

Ich würde sagen, das Problem steckt in Zeile 166 - 169:


```
if (temp.intersects(display)){
            g.drawImage(tiles.get(temp.getImage()), (int) temp.getX(),(int) temp.getY(), (int) temp.getWidth(), (int) temp
                     .getHeight(), this);
         }
```

display ist ja der sichtbare Bereich, wenn ich das recht interpretiere. Wenn Du diesen jetzt über den MouseMotionListener um 5 Pixel verschiebst (sagen wir mal 5 Pixel nach RECHTS) dann mußt Du die Tiles, die ganz links gezeichnet werden um 5 Pixel über den linken Rand hinausschieben, da diese ja dann nicht mehr vollständig im sichtbaren Bereich liegen. Gleiches gilt umgekehrt für die Tiles, die dann rechts "herein wandern" müßten.
Wenn ich nichts übersehen habe ist das Problem, daß Du diesen Versatz nicht berücksichtigst.


----------



## Dagobert (4. Jul 2008)

Erstmal danke für eine Antwort und entschuldigung das ich nciht er geschrieben habe, war aber mit testen und rumpr
obieren beschäftigt.
Meine Map scrollt jetzt richtig wie sich das gehört leider ist dort immer noch ein Fehler drin. Undzwar flackert der Rand zu dem ich scrolle immer.
Desweiteren habe ich ein bisschen ringsherum weitergebaut, und bekomme das nicht hin das meine neues Tile was ich setzen will der Maus folgt. Zumindest past es graphisch nicht, aber von den Koordinaten müsste es eigentlich stimmen.
Wäre nett wenn du nochmal drübergucken könntest.

```
package MapEditor;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;

public class MapEditor extends JPanel implements MouseMotionListener, MouseListener, ActionListener, Runnable {
	// Eigenschaften für die Map
	private HashMap<Integer, BufferedImage> tiles;	// Hier werden alle Image der Tiles gespeichert
	private Vector<Tile> map;	// Hier werden die eignetlichen Tiles gespeichert
	private String mapName;		// Name der Map
	private boolean mapIsLoad = false;	// Ob die Grafiken geladen sind
	private final int TILEWIDTH = 50;	// Größe der einzelnen Tiles
	private final int TILEHEIGHT = 50;
	private int mapWidth;				// Länge der Karte
	private int mapHeight;				// Höhe der Karte
	boolean moveright, moveleft, moveup, movedown;	// Variabeln zur steuerung
	private Rectangle2D.Double display;	// Emulation des displays
	private final int SCROLLSPEED = 150;	// Geschwidnigkeit mit der gescrollt wird
	
	private Tile currentTile;	// Aktuelle Tile die ausgesucht wurde
	
	// Graphische Anzeigen
	Container mapContainer;
	JPanel choosetiles;
	JPanel buttons;
	Vector<JButton> tilesButtons;
	
	public static void main(String[] argv) {
		MapEditor me = new MapEditor(800, 600);
		
		JFrame frame = new JFrame();
		frame.setPreferredSize(new Dimension(800, 600));
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.add(me);
		frame.setUndecorated(true);
		frame.pack();
		frame.setVisible(true);
		Thread t = new Thread(me);
		t.start();
	}

	public MapEditor(int width, int height) {
		setPreferredSize(new Dimension(width, height));
		setLayout(new BorderLayout());
		setBackground(Color.black);
		
		tiles = new HashMap<Integer, BufferedImage>();
		map = new Vector<Tile>();
		
		loadTiles();
		
		moveright = false;
		moveleft = false;
		moveup = false;
		movedown = false;
		
		mapContainer = new Container();
		mapContainer.setPreferredSize(new Dimension(750, 580));
		mapContainer.setSize(new Dimension(750, 580));
		mapContainer.addMouseListener(this);
		mapContainer.addMouseMotionListener(this);
		add(mapContainer, BorderLayout.CENTER);
		display = new Rectangle2D.Double(mapContainer.getX(), mapContainer.getY(), mapContainer.getWidth(), mapContainer.getHeight());
		
		choosetiles = new JPanel();
		choosetiles.setLayout(new GridLayout(10,3));
		choosetiles.setBorder(BorderFactory.createLineBorder(Color.black));
		tilesButtons = new Vector<JButton>();
		for(int i = 1; i <= tiles.size(); i++){
			JButton button = new JButton(new ImageIcon(tiles.get(i)));
			button.setSize(new Dimension(50, 50));
			button.setPreferredSize(new Dimension(50, 50));
			button.setName(String.valueOf(i));
			button.addActionListener(this);
			choosetiles.setPreferredSize(new Dimension(choosetiles.getWidth()+button.getHeight(), choosetiles.getHeight()+button.getHeight()));
			tilesButtons.add(button);
			choosetiles.add(button);
		}
		add(choosetiles, BorderLayout.EAST);
		buttons = new JPanel();
		buttons.setSize(new Dimension(getWidth(), 30));
		buttons.setPreferredSize(new Dimension(getWidth(), 30));
		buttons.setLayout(new GridLayout(1,5));
		JButton neu = new JButton("Neue Karte");
		neu.addActionListener(this);
		
		JButton laden = new JButton("Karte laden");
		laden.addActionListener(this);
		
		JButton speichern = new JButton("Karte speichern");
		speichern.addActionListener(this);
		
		JButton zurueck = new JButton("Beenden");
		zurueck.addActionListener(this);
		
		buttons.add(neu);
		buttons.add(laden);
		buttons.add(speichern);
		buttons.add(zurueck);
		add(buttons, BorderLayout.NORTH);
	}

	public void loadTiles() {
		FileReader in = null;
		try {
			in = new FileReader("resourcen/tiles/tiles.tl");
		} catch (FileNotFoundException e) {
			System.out.println("Tiles konnten nicht geladen werden");
			e.printStackTrace();
		}
		BufferedReader bf = new BufferedReader(in);
		boolean next = true;
		MediaTracker mt = new MediaTracker(this);
		while (next) {
			String tileInfo = null;
			try {
				tileInfo = bf.readLine();
				if (tileInfo == null) {
					next = false;
					break;
				}
				String[] tile = tileInfo.split(";");
				BufferedImage tempImg = ImageIO.read(new File("resourcen/tiles/" + tile[2]));
				mt.addImage(tempImg, 0);
				mt.waitForAll();
				tiles.put(Integer.parseInt(tile[0]), tempImg);
			} catch (IOException e) {
				System.out.println("Fehler beim lesen der Datei");
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		try {
			bf.close();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		mapIsLoad = true;
	}

	public void loadMap(String path) {
		FileReader in = null;
		String[] tempName = new File(path).getName().split("\\.");
		mapName = tempName[0];
		try {
			in = new FileReader(path);
		} catch (FileNotFoundException e) {
			System.out.println("Tiles konnten nicht geladen werden");
			e.printStackTrace();
		}
		BufferedReader bf = new BufferedReader(in);
		boolean next = true;
		mapHeight = 0;
		while (next) {
			String temp = null;
			try {
				temp = bf.readLine();
				if (temp == null) {
					next = false;
					break;
				}
				mapWidth = Math.max(mapWidth, temp.length());
				for (int i = 0; i < temp.length(); i++) {
					int id = Integer.parseInt(temp.substring(i, i + 1));
					Tile tempTile = new Tile(id, tiles.get(id).getWidth() * i,
							tiles.get(id).getHeight() * mapHeight, tiles.get(id).getWidth(), tiles.get(id).getHeight());
					map.add(tempTile);
				}
				mapHeight++;

			} catch (IOException e) {
				System.out.println("Fehler beim lesen der Datei");
				e.printStackTrace();
			}
		}
		try {
			bf.close();
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		repaint();

	}

	public void saveMap() {
		File f = new File("resourcen/maps/" + mapName + ".mapi");
		try {
			f.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public void newMap() {
		map.removeAllElements();
		mapName = null;
		String temp = JOptionPane.showInputDialog("Name der Karte:");
		if(temp == null)
			mapName = "";
		else
			mapName = temp;
		temp = JOptionPane.showInputDialog("Größe der Karte (WxH):");
		String[] size = temp.split("x");
		int width = Integer.parseInt(size[0]);
		int hight = Integer.parseInt(size[1]);
	}
	
	public void run(){
		System.out.println("Starte run");
		while(1==1){
			if(moveright){
				System.out.println("Nach Rechts verschieben");
				display.x += 10;
				System.out.println("Screen: " + display.getX());
				repaint();
				try {
					Thread.sleep(SCROLLSPEED);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if(moveleft){
				System.out.println("Nach Links verschieben");
				display.x -= 10;
				System.out.println("Screen: " + display.getX());
				repaint();
				try {
					Thread.sleep(SCROLLSPEED);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if(moveup){
				System.out.println("Nach Oben verschieben");
				display.y -= 10;
				System.out.println("Screen: " + display.getY());
				repaint();
				try {
					Thread.sleep(SCROLLSPEED);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if(movedown){
				System.out.println("Nach Unten verschieben");
				display.y += 10;
				System.out.println("Screen: " + display.getY());
				repaint();
				try {
					Thread.sleep(SCROLLSPEED);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		if (mapIsLoad) {
			System.out.println("Maus: (" + e.getX() + "|" + e.getY() + ")");
			System.out.println("Tile: (" + currentTile.getX() + "|" + currentTile.getY() + ")");
			if(currentTile != null){
				currentTile.setPosition(e.getX(), e.getY());
			}
			if (display.getX() > 0 && e.getX() <= 50) {
				moveleft = true;
			} else {
				moveleft = false;
			}
			if (display.getX() + display.getWidth() <= mapWidth*TILEWIDTH && e.getX() >= display.getWidth() - 50) {
				moveright = true;
			} else{ 
				 moveright = false;
			}
			if(display.getY() > 0 && e.getY() <= 50){
				moveup = true;
			} else{
				moveup = false;
			}
			if(display.getY() + display.getHeight() <= mapHeight*TILEHEIGHT && e.getY() >= display.getHeight() - 50){
				movedown = true;
			} else {
				movedown = false;
			}
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		if(e.getButton() == MouseEvent.BUTTON1){
			System.out.println("Setzte Tile: (" + currentTile.getX() + "|" + currentTile.getY() + ")");
			map.add(currentTile);
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// Do nothing
	}

	@Override
	public void mouseExited(MouseEvent e) {
		System.out.println("exit");
		movedown = false;
		moveleft = false;
		moveright = false;
		moveup = false;
	}

	@Override
	public void mousePressed(MouseEvent e) {
		if(mapIsLoad){
			if(e.getButton() == MouseEvent.BUTTON3){
				System.out.println("rechts");
			}
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals("Karte laden")){
			System.out.println("Karte Laden");
			JFileChooser fc = new JFileChooser("resourcen/maps/");
			fc.setDialogTitle("Karte wählen");
			fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
			fc.setAcceptAllFileFilterUsed(false);
			fc.setFileFilter(new javax.swing.filechooser.FileFilter(){
		         public boolean accept( File f ){
		            return f.isDirectory() || f.getName().toLowerCase().endsWith( ".mapi" );
		         }
		         public String getDescription(){
		           return "map(*.mapi)";
		         }
		      }); 
			int returnvalue = fc.showOpenDialog(null);
			if(returnvalue == JFileChooser.APPROVE_OPTION){
				File selectedFile = fc.getSelectedFile();
				loadMap(selectedFile.getPath());
			}
		}
		if(e.getActionCommand().equals("Neue Karte")){
			System.out.println("Neue Karte");
			newMap();
		}
		if(e.getActionCommand().equals("Karte speichern")){
			System.out.println("Karte speichern");
			saveMap();
		}
		if(e.getActionCommand().equals("Beenden")){
			System.out.println("Beenden");
			System.exit(0);
		}
		if(tilesButtons.indexOf(e.getSource()) > -1){
			int tileNummer =Integer.parseInt(((JButton) e.getSource()).getName());
			currentTile = new Tile(tileNummer, 0, 0, tiles.get(tileNummer).getWidth(), tiles.get(tileNummer).getHeight());
		}
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Tile temp;
		for (int i = 0; i < map.size(); i++) {
			temp = map.get(i);
//			System.out.println("Tile " + i + "(" + temp.getX() + "|"
//					+ temp.getY() + "): " + (temp.intersects(display)));
			if (temp.intersects(display)){
				g.drawImage(tiles.get(temp.getImage()), (int) (temp.getX()-display.getX()),(int) (temp.getY()-display.getY()), (int) temp.getWidth(), (int) temp.getHeight(), this);
			}
		}
		if(currentTile != null){
			g.drawImage(tiles.get(currentTile.getImage()), (int) (currentTile.getX()),(int) (currentTile.getY()), (int) currentTile.getWidth(), (int) currentTile.getHeight(), this);
		}
	}
}
```


```
package MapEditor;

import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


public class Tile extends Rectangle2D.Double {
	String name;
	int image;
	public Tile(int image, int x, int y, int width, int height){
		super(x, y, width, height);
		setImage(image);
	}
	public void setPosition(int x, int y){
		super.x = x;
		super.y = y;
	}
	public void setImage(int image){
		this.image = image;
	}
	public int getImage(){
		return this.image;
	}
}
```

mfg. Dagobert


----------



## Dagobert (5. Jul 2008)

Ok das die Tile der Maus folgt ist erledigt, aber das flackern bleibt weiterhin bestehen  ich glaube es liegt daran das ich immer eine Tile zu wenig laden, aber ich komme gerade nicht drauf, wo ich was ändern muss, damit er eine mehr lädt


----------

