Java/Tutorials/Karteneditor Kapitel 13
Aus Scientia
Version vom 21. Februar 2009, 20:08 Uhr von DrachenKaiser (Diskussion | Beiträge)
Inhaltsverzeichnis
Karte
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import javax.imageio.ImageIO; public class Karte { int[][] karte; String kartenName; String tilesetDateiname; ArrayList<BufferedImage> tileset=new ArrayList<BufferedImage>(); public Karte(int[][] karte, String dateiname, String name) { this.kartenName=name; this.karte=karte; this.tilesetDateiname=dateiname; try { BufferedImage bildTileset=ImageIO.read(new File(dateiname)); int breite=bildTileset.getWidth()/32; int höhe=bildTileset.getHeight()/32; for(int x=0;x<breite;x++) { for(int y=0;y<höhe;y++) { BufferedImage tile=bildTileset.getSubimage(x*32, y*32, 32, 32); this.tileset.add(tile); } } } catch (IOException fehler) { fehler.printStackTrace(); } } public BufferedImage getTileImage(int x, int y) { int tile=karte[x][y]; return tileset.get(tile); } public void setTile(int x, int y, int tileID) { karte[x][y]=tileID; } }
KartenAnsicht
import java.awt.Dimension; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.RepaintManager; public class KartenAnsicht extends JPanel{ KartenFenster fenster; JScrollPane scroll=new JScrollPane(); RepaintManager m; public KartenAnsicht(KartenFenster kfenster) { scroll.setViewportView(this); fenster=kfenster; //verhindert Flackern setDoubleBuffered(true); changeKarte(); m=RepaintManager.currentManager(fenster); addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { zeichneTile(e.getX(), e.getY()); } }); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { zeichneTile(e.getX(), e.getY()); } }); /*AdjustmentListener adjust=new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { e.getAdjustable().setUnitIncrement(32); repaint(); } }; scroll.getVerticalScrollBar().addAdjustmentListener(adjust); scroll.getHorizontalScrollBar().addAdjustmentListener(adjust);*/ } public void paintComponent(Graphics g) { Rectangle r=g.getClipBounds(); int startx=r.x; int starty=r.y; int endx=startx+r.width; int endy=starty+r.height; startx=startx/32; starty=starty/32; endx=endx/32; endy=endy/32; if(endx < fenster.aktuelleKarte.karte.length) { endx++; } if(endy < fenster.aktuelleKarte.karte[0].length) { endy++; } for(int x=startx;x < endx;x++) { for(int y=starty;y < endy;y++){ BufferedImage tile=fenster.aktuelleKarte.getTileImage(x, y); g.drawImage(tile, x*32, y*32, this); } } } public void changeKarte() { //Hier wird nun eine Feste größe des JPanel gesetzt. int dx=fenster.aktuelleKarte.karte.length; int dy=fenster.aktuelleKarte.karte[0].length; setPreferredSize(new Dimension(dx*32,dy*32)); scroll.setViewportView(this); } public void zeichneTile(int x, int y) { x=x/32; y=y/32; fenster.aktuelleKarte.karte[x][y]=fenster.palette.aktuelleTile; Rectangle r=scroll.getViewport().getViewRect(); int dx=this.scroll.getLocation().x+fenster.getInsets().left-r.x; int dy=this.scroll.getLocation().y+fenster.getInsets().top-r.y; m.addDirtyRegion(fenster , dx+x*32, dy+y*32, 32, 32); } }
KartenDialog
import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JTextField; public class KartenDialog extends JDialog{ KartenFenster fenster; JTextField kartenName=new JTextField(); JTextField kartenBreite=new JTextField(); JTextField kartenHöhe=new JTextField(); JTextField tilesetDateiname=new JTextField(); JLabel name=new JLabel("Name:"); JLabel dateiname=new JLabel("Tileset:"); JLabel breite=new JLabel("Karten Breite:"); JLabel höhe=new JLabel("Karten Höhe:"); JButton okay=new JButton("okay"); public KartenDialog(KartenFenster kfenster) { super(kfenster, "Karte erstellen"); fenster=kfenster; Dimension dim=new Dimension(100, 20); kartenBreite.setPreferredSize(dim); kartenHöhe.setPreferredSize(dim); kartenName.setPreferredSize(dim); tilesetDateiname.setPreferredSize(dim); höhe.setPreferredSize(dim); breite.setPreferredSize(dim); name.setPreferredSize(dim); dateiname.setPreferredSize(dim); okay.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { erstelleKarte(); } }); setSize(250,200); setLayout(new FlowLayout()); add(name); add(kartenName); add(breite); add(kartenBreite); add(höhe); add(kartenHöhe); add(dateiname); add(tilesetDateiname); add(okay); setVisible(true); } public void erstelleKarte() { int breite=Integer.parseInt(kartenBreite.getText()); int höhe=Integer.parseInt(kartenHöhe.getText()); int[][] karte= new int[breite][höhe]; String name=kartenName.getText(); String tileset=tilesetDateiname.getText(); fenster.aktuelleKarte=new Karte(karte, tileset, name); fenster.ansicht.changeKarte(); fenster.palette.repaint(); fenster.ansicht.repaint(); fenster.ansicht.scroll.repaint(); fenster.repaint(); dispose(); } }
KartenFenster
import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; public class KartenFenster extends JFrame{ Karte aktuelleKarte; TilePalette palette; KartenAnsicht ansicht; KartenMenü kartenMenü; public KartenFenster() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.requestFocus(); int karte[][]=new int[100][100]; String name="Unser erste Karte"; String tilesetDateiname="Tileset.png"; aktuelleKarte=new Karte(karte, tilesetDateiname, name); palette=new TilePalette(this); //Initialisere KartenAnsicht ansicht=new KartenAnsicht(this); //Initialisere KartenMenü kartenMenü=new KartenMenü(this); setLayout(new BorderLayout()); add(kartenMenü, BorderLayout.NORTH); add(palette, BorderLayout.WEST); add(ansicht.scroll , BorderLayout.CENTER); //größe des Fensters setzen setSize(1024, 768); //Setzen eines Fenstertitels setTitle("Karteneditor"); } }
KartenMenü
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.swing.JFileChooser; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class KartenMenü extends JMenuBar{ KartenFenster fenster; JMenu datei=new JMenu("Datei"); JMenuItem neu=new JMenuItem("Neue Karte"); JMenuItem speichern=new JMenuItem("Karte Speichern"); JMenuItem laden=new JMenuItem("Karte Laden"); public KartenMenü(KartenFenster kfenster) { fenster=kfenster; neu.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { neu(); } }); laden.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { laden(); } }); speichern.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { speichern(); } }); datei.add(neu); datei.add(speichern); datei.add(laden); add(datei); } public void neu() { new KartenDialog(fenster); } public void laden() { try { JFileChooser speicherDialog=new JFileChooser(); speicherDialog.showOpenDialog(fenster); FileInputStream datei=new FileInputStream(speicherDialog.getSelectedFile()); BufferedInputStream buf=new BufferedInputStream(datei); ObjectInputStream lese = new ObjectInputStream(buf); int[][]karte=(int[][]) lese.readObject(); String name=(String) lese.readObject(); String dateiname=(String) lese.readObject(); fenster.aktuelleKarte=new Karte(karte,dateiname, name); lese.close(); fenster.ansicht.changeKarte(); fenster.palette.repaint(); fenster.ansicht.repaint(); fenster.ansicht.scroll.repaint(); fenster.repaint(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void speichern() { try { JFileChooser speicherDialog=new JFileChooser(); speicherDialog.showSaveDialog(fenster); FileOutputStream datei=new FileOutputStream(speicherDialog.getSelectedFile()); BufferedOutputStream buf=new BufferedOutputStream(datei); ObjectOutputStream schreibe = new ObjectOutputStream(buf); schreibe.writeObject(fenster.aktuelleKarte.karte); schreibe.writeObject(fenster.aktuelleKarte.kartenName); schreibe.writeObject(fenster.aktuelleKarte.tilesetDateiname); schreibe.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Main
public class Main { public static void main(String[] args) { //Starten des Karteneditors KartenFenster karteneditor=new KartenFenster(); //Den Karteneditor sichtbar machen karteneditor.setVisible(true); } }
TilePalette
import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.JPanel; public class TilePalette extends JPanel { KartenFenster fenster; int aktuelleTile=0; public TilePalette(KartenFenster kartenfenster) { fenster=kartenfenster; setPreferredSize(new Dimension(4*32, (fenster.aktuelleKarte.tileset.size()/4)*32)); setDoubleBuffered(true); this.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { setTileID(e.getX(), e.getY()); } }); } public void paintComponent(Graphics g) { int tileAnzahl=fenster.aktuelleKarte.tileset.size(); int zeile=0; int spalte=0; for(int i=0;i<tileAnzahl;i++) { BufferedImage tile=fenster.aktuelleKarte.tileset.get(i); g.drawImage(tile,spalte*32, zeile*32, this); if(i%4 == 3) { zeile++; spalte=0; } else spalte++; } } public void setTileID(int x, int y) { int spalte=x/32; int zeile=y/32; int tileID=zeile*4+spalte; if(tileID < fenster.aktuelleKarte.tileset.size()) { aktuelleTile=tileID; } } }