# Pacman-Grafik



## Schrubber (25. Jun 2010)

Guten Abend,

Ich bin derweil an einem Pacman-Spiel dran. Habe gerade mein Spielfeld und die Bewegung fertiggestellt, nun bin ich aber an dem eigentlichen Spielfeld.

Und zwar sieht meine Datei, die mir den Pacman zeichnet, so aus:


```
import java.awt.*;
import javax.swing.*;

public class FeldelementUi extends JPanel
{
	private Feldelement fe;
	
	public FeldelementUi(Feldelement fe)
	{
		this.fe = fe;
		setSize(50,50);
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		g.setColor(Color.black);
		if(fe.isHatPac())
		{
			g.drawOval(0,0,25,25);
		}
		}
	}
```

Nun möchte ich aber anstatt des Ovals nen Bild, bsp. name "Test.jpg" mit der Größe 25*25 in das GridLayout einfügen. Größe: 30*20Felder.


Wie? 

Danke im vorraus,
Schrubber


----------



## agentone (25. Jun 2010)

Beim Laden des Spiels einmalig das Bild laden:

```
BufferedImage pacman=ImageIO.read(new File("Test.jpg"));
```
Und später in der paint-Methode zeichnen:

```
g.drawImage(pacman,0,0,null);
```


----------



## Schrubber (25. Jun 2010)

Hey, danke für die schnelle Antwort.



> Unhandled exception type IOException


 :/


----------



## Eldorado (25. Jun 2010)

Musst du halt mit nem try catch abfangen...


----------



## Schrubber (25. Jun 2010)

Ok. Nun läuft er. Aber es hängt derbst... Woran liegt das?


----------



## agentone (25. Jun 2010)

Lädst du das Bild auch wirklich nur ein Mal ?

Übrigens: Du solltest unter Swing nicht 'paint' sondern 'paintComponent' überschreiben...


----------



## Schrubber (25. Jun 2010)

sry stehe heute irgendwie voll aufm schlauch. wie mache ich das denn, dass er es nuer einmal läd? Wenn ichs ja in die public void paint(Graphics g) packe, läd er es ja jedesmal neu


----------



## Eldorado (25. Jun 2010)

poste doch nochmal deinen aktuellen Code


----------



## Schrubber (25. Jun 2010)

```
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;

public class FeldelementUi extends JPanel
{
	public void xy()
	{
		BufferedImage pacman = null;
		try {
			pacman = ImageIO.read(new File("pacman_close.jpg"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private Feldelement fe;
	
	public FeldelementUi(Feldelement fe)
	{
		this.fe = fe;
		setSize(50,50);
	}
	
	public void paintComponent(Graphics g)
	{
		
		super.paint(g);
		g.setColor(Color.black);
		if(fe.isHatPac())
		{
			//g.drawOval(0,0,25,25);
			g.drawImage(xy.pacman,0,0,null);
		}
		}
	}
```

Nur der is ja falsch mit de. xy.pacman, da ers iwie net findet :/


----------



## Eldorado (25. Jun 2010)

pack doch das einlesen der Datei in den Konstruktor und speicher es als Instanzvariable:

```
import javax.swing.*;
 
public class FeldelementUi extends JPanel{
    BufferedImage pacman;
    public FeldelementUi() {
        try {
            pacman = ImageIO.read(new File("pacman_close.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        
    public void paintComponent(Graphics g) {        
        super.paintComponent(g);
        g.drawImage(pacman, 0, 0, null);
    }
}
```


----------



## Schrubber (26. Jun 2010)

Okay.

Nun gibts mucken in meiner 2. Class Feldelement


```
public Feldelement(String name)
	{
		this.name = name;
		hatPac = false;
		ui = new FeldelementUi();
	}
```

Fehler: The constructor FeldelementUi() is undefined


----------



## OliverKroll (26. Jun 2010)

Ist zwar schon etwas älter, aber wenn du Zeit hast, schau auf 
http://www.java-forum.org/spiele-mu...-spiele-applets-anregung-meiner-homepage.html
Da habe ich vor zwei Jahren einen Pac-Man programmiert. :toll:


----------



## Schrubber (27. Jun 2010)

Sieht gut aus, werd ich mir bei Zeit anschauen. Aber mein Prob besteht immernoch ;D


----------



## Landei (27. Jun 2010)

Offenbar findet er den Konstruktor nicht. Übersetze das Projekt nochmal komplett neu, manchmal bekommt die IDE bestimmte Änderungen nicht mit.


----------



## Schrubber (28. Jun 2010)

Ich soll das ganze Projekt nochmal neu schreiben?  Die Zeit hab ich leider nicht mal. Es hat ja alles funktioniert bis auf den Pacman zum laufen zu kriegen. Oder hilft es einfach, euch dne kompletten Quelltext hier rein zu posten? Danke 

Schrubber


----------



## Landei (28. Jun 2010)

LOL! Nicht neu schreiben, nur neu compilieren 

Wenn "The constructor FeldelementUi() is undefined" kommt, wird zwar die Klasse gefunden, aber nicht der entsprechende Konstruktor. Da du ja sicher schon überprüft hat, dass es diesen gibt (und du ja sicher Eldorados Code ausprobiert hast, der so einen Konstruktor hat), kann es nur irgendwo in der IDE haken, z.B. das deine Class-Files nicht auf dem letzten Stand sind oder so...


----------



## Schrubber (28. Jun 2010)

Ok werd ich heute Nachmittag mal machen. Bin gerade am Praktikum und hab des nicht hier :/


----------



## Schrubber (28. Jun 2010)

Soo...

Hab nochmal alles richtig compiled. Fehler weiterhin.
meine 2 Dateien:


```
public class Feldelement
{
	private FeldelementUI ui;
	private Feldelement nord;
	private Feldelement sued;
	private Feldelement west;
	private Feldelement ost;
	private boolean hatPac;
	String name;
	
	
	public Feldelement(String name)
	{
		this.name = name;
		hatPac = false;
		ui = new FeldelementUI(this);
		
	}

	
	public boolean isHatPac()
	{
		return hatPac;
	}


	public void setHatPac(boolean hatPac)
	{
		this.hatPac = hatPac;
	}


	public FeldelementUI getUi()
	{
		return ui;
	}


	public Feldelement getNord()
	{
		return nord;
	}


	public void setNord(Feldelement nord)
	{
		this.nord = nord;
	}


	public Feldelement getSued()
	{
		return sued;
	}


	public void setSued(Feldelement sued)
	{
		this.sued = sued;
	}


	public Feldelement getWest()
	{
		return west;
	}


	public void setWest(Feldelement west)
	{
		this.west = west;
	}


	public Feldelement getOst()
	{
		return ost;
	}


	public void setOst(Feldelement ost)
	{
		this.ost = ost;
	}
	
	
	public String toString()
	{
		return name;
	}

	
}
```


```
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;
 
public class FeldelementUI extends JPanel{
    BufferedImage pacman;
    public FeldelementUI() 
    {
        try {
            pacman = ImageIO.read(new File("pacman_close.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
        
    public void paintComponent(Graphics g) {        
        super.paintComponent(g);
        g.drawImage(pacman, 0, 0, null);
    }
}
```


Fehler:
ui = new FeldelementUI(this);

Konstruktor :/


----------



## Eldorado (28. Jun 2010)

na ist doch kein Wunder: du rufst einen Konstruktor mit dem Parameter 'this'(in diesem Fall die Klasse Feldelement) auf, der Konstruktor der existiert ist aber parameterlos.
	
	
	
	





```
ui = new FeldelementUI();
```
mfg
Eldorado


----------



## Schrubber (28. Jun 2010)

Wie kann ich nochmal in bestimmte Felder meines GridLayouts Hintergrundbilder einfügen?


----------



## Eldorado (28. Jun 2010)

Du kannst der Methode natürlich verschiedene Strings mit Dateinamen übergeben.


----------



## Schrubber (28. Jun 2010)

Ok.

Letzte (hoffentlich) Frage: Wie kann ich nochmal in bestimmte Felder meines GridLayouts Hintergrundbilder einfügen? ^^


----------



## magna (28. Jun 2010)

Kombiniere doch einfach was du vorher schon hattest mit dem was man dir zeigte:


```
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

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

public class Pacman {
}

class Feldelement {
    private final FeldelementUI ui;
    private Feldelement nord;
    private Feldelement sued;
    private Feldelement west;
    private Feldelement ost;
    private boolean hatPac;
    String name;

    public Feldelement(final String name) {
	this.name = name;
	hatPac = false;
	ui = new FeldelementUI(this);
    }

    public boolean isHatPac() {
	return hatPac;
    }

    public void setHatPac(final boolean hatPac) {
	this.hatPac = hatPac;
    }

    public FeldelementUI getUi() {
	return ui;
    }

    public Feldelement getNord() {
	return nord;
    }

    public void setNord(final Feldelement nord) {
	this.nord = nord;
    }

    public Feldelement getSued() {
	return sued;
    }

    public void setSued(final Feldelement sued) {
	this.sued = sued;
    }

    public Feldelement getWest() {
	return west;
    }

    public void setWest(final Feldelement west) {
	this.west = west;
    }

    public Feldelement getOst() {
	return ost;
    }

    public void setOst(final Feldelement ost) {
	this.ost = ost;
    }

    public String toString() {
	return name;
    }
}

class FeldelementUI extends JPanel {
    private final Feldelement feldelement;
    BufferedImage pacman;

    public FeldelementUI(final Feldelement feldelement) {
	this.feldelement = feldelement;
	setSize(50, 50);
	try {
	    pacman = ImageIO.read(new File("pacman_close.jpg"));
	} catch (final IOException e) {
	    e.printStackTrace();
	}
    }

    public void paintComponent(final Graphics g) {
	super.paintComponent(g);
	g.drawImage(pacman, 0, 0, null);
    }
}
```


----------



## Schrubber (28. Jun 2010)

Das Problem ist ja, dass die Hintergrundfarbe variiert. Ich hab 1ne Farbe für Wände, 1ne für Gehwege und 1ne für Sperrzonen. Und nach den Möglichkeiten, die ich bisher hatte (oder ich habs falsch verstanden), ändert er alle Hintergrundfarben :/ oder nicht?


----------

