Hallöle,
ich danke für Deine Antwort und habe das noch einmal überdacht und bearbeitet.
Meine zwei Dateien haben sich noch einmal bedeutend verändert, die Version vor 2 Tagen war nur eine Zwischenversion.
Ich schicke sie gleich anbei ran.
Zu dem Static Problem: Das ist in der Tat so eine Sache. Ich habe durch meine Arbeit in Java, Swift und Python nun schon so einige wichtige Dinge kennengelernt, die ich mir heute aus dem Handgelenk schüttle, womit ich noch vor nem Monat das ganze Forum mit Fragen terrorisiert hätte.
Aber bei so manchen Grundbegriffen hakt es wirklich noch, da hast Du recht. Wirklich Basics, die ich bisher nicht beachtet habe, weil sie einfach nicht relevant für mich waren. Dazu zählen static, final und abstract.
Entschuldige, wenn ich das vorerst so lasse, mich in Static und Nicht-Static einzuarbeiten ist meine nächste Angelegenheit, versprochen.
PS dazu: Ich bin in Sachen Vererbung ein wenig Faul, weil mich das mit Getter und Settern bei so vielen Variablen aufregt, habe ich generell alles protected und vererbe alle Eigenschaften weiter. Blöde Sache, die ich mir abgewöhnen werde. Zumindest letzteres. extends CafeMain
an jeder Klasse hab ich mir nun abgewöhnt.
Aber um weiterhin um Getter und Setter zu kommen, bin ich, auf das hier angewiesen: import static spiel.CafeMain.*;
Wenn die von mir importierten Variablen und der Import selbst nicht static sind, dann funktioniert das ganze nicht, hat mein Informatiklehrer mir gesagt und ich stellte fest, er hat damit Recht.
Wie dem auch sei, nun zum eigentlichen Problem mit den Bildern:
Ich hatte das jetzt so umgesetzt:
Image tischbild = null;
try{
tischbild = ImageIO.read(new File("./src/spiel/demo_"+tische.get(tischnummer).getLand().land+".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
ImageObserver tischweg = null;
Graphics2D g2d = (Graphics2D) spielframe.getGraphics();
g2d.drawImage(tischbild, tische.get(tischnummer).getX(), tische.get(tischnummer).getY(), 200, 200, tischweg);
System.out.println(tische.get(tischnummer).getLand().land);
}```
In dem Beispiel rufe ich dann das Zeichen eines Tisches mit `tischzeichen(nummer_des_tisches);` auf. Die dazugehörige Position ist via `setPosition` und das Pendant, `getX()` und `get()` reregelt, sodass jedes Spielelement von vornherein irgendwo festgetackert ist.
Ich danke Dir für die Idee mit dem Hintergrund, aber das ist es, wie Du herausgefunden hast nicht. Das kann ich sicherlich auch noch irgendwo verbraten, um später das Spiel graphisch knorker gestalten zu können. :)
Aber ich zeichne Einzelne Elemente und nutze die Methode dazu mehrfach.
Deine Variante sieht mir ähnlich aus wie meine, aber nicht komplett gleich. Mir wäre eine Erläuterung, welche Variante man nun aus welchem Grund bevorzugen sollte sehr genehm. :)
Vielen Dank und schönes Wochenende
Lukas
====
Die Dateien nun:
CafeMain:
```package spiel;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class CafeMain {
// System Variablen
protected static String OS = System.getProperty("os.name").toLowerCase();
protected static String dateipfad = new File("").getAbsolutePath();
protected static String programmname = "Café International";
protected static JFrame spielframe = new JFrame(programmname);
// Spieler Variablen
protected static int spieler = 1;
protected static String[] spielername = new String[2];
protected static int[] punktespieler = new int[2];
protected static List<Gastkarte> kartenspieler1 = new ArrayList<Gastkarte>();
protected static List<Gastkarte> kartenspieler2 = new ArrayList<Gastkarte>();
// Spielkarten
protected static List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
protected static List<Laenderkarte> laenderkarten = new ArrayList<Laenderkarte>();
// Spielfeld
protected static List<Tisch> tische = new ArrayList<Tisch>(12);
protected static List<Stuhl> stuehle = new ArrayList<Stuhl>(24);
protected static int[] tischex = new int[12];
protected static int[] tischey = new int[12];
protected static int anzahlbarplaetze = 21;
// Sonstiges
protected static boolean spielernamenkorrekt = false;
public CafeMain() throws IOException {
spielframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
spielframe.setLocationRelativeTo(null);
Spielfeld spielfeld = new Spielfeld();
spielframe.add(spielfeld);
spielframe.setSize(600,600);
spielframe.setResizable(false);
spielframe.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - spielframe.getSize().width) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - spielframe.getSize().height) / 2);
spielframe.setIconImage(Toolkit.getDefaultToolkit().getImage("./src/spiel/demo_DE.jpg"));
spielframe.setVisible(false);
ablauf();
}
public static void ablauf() {
/*if(SysWin()) {
JOptionPane.showMessageDialog(null, "Dein System ist hoffnungslos veraltet!
Windoof ist nicht kompatibel mit diesem Spiel.
Sollte es zu Problemen bei der Ausführung kommen,
dann öffne das Spiel bitte auf einem PC
mit Mac OS oder Linux!", "System veraltet", JOptionPane.WARNING_MESSAGE);
}
do{
Spielstart.namensfrage();
} while(spielernamenkorrekt == false);*/
spielframe.setVisible(true);
Spielfeld.zeichnen();
Spielstart.gastkartenmischen();
Spielstart.laenderkartenmischen();
Spielstart.spielfeldgenerieren();
}
public static void main(String[] args) throws IOException {
new CafeMain();
}
public static boolean SysWin() {
return (OS.indexOf("win") >= 0);
}
}
Spielfeld:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import static spiel.CafeMain.*;
public class Spielfeld extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int height = getHeight();
int width = getWidth();
g.drawLine(0, 0, width, height);
g.drawLine(0, height, width, 0);
}
public static void zeichnen() {
tischex[0] = 100; tischey[0] = 100;
tischex[1] = 100; tischey[1] = 200;
tischex[2] = 100; tischey[2] = 300;
tischex[3] = 100; tischey[3] = 400;
tischex[4] = 200; tischey[4] = 100;
tischex[5] = 200; tischey[5] = 200;
tischex[6] = 200; tischey[6] = 300;
tischex[7] = 200; tischey[7] = 400;
tischex[8] = 300; tischey[8] = 300;
tischex[9] = 400; tischey[9] = 300;
tischex[10] = 500; tischey[10] = 300;
tischex[11] = 550; tischey[11] = 300;
//tische.add(new Tisch()); tische.get(0).setLand(laenderkarten.get(0)); tische.get(0).setKoord(10, 10); tischzeichnen(stift,0);
//tische.add(new Tisch()); tische.get(1).setLand(laenderkarten.get(1)); tische.get(1).setKoord(220, 10); tischzeichnen(stift,1);
//tische.add(new Tisch()); tische.get(2).setLand(laenderkarten.get(2)); tische.get(2).setKoord(430, 10); tischzeichnen(stift,2);
}
public static void tischzeichnen(int tischnummer) {
Image tischbild = null;
try{
tischbild = ImageIO.read(new File("./src/spiel/demo_"+tische.get(tischnummer).getLand().land+".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
ImageObserver tischweg = null;
Graphics2D g2d = (Graphics2D) spielframe.getGraphics();
g2d.drawImage(tischbild, tische.get(tischnummer).getX(), tische.get(tischnummer).getY(), 200, 200, tischweg);
System.out.println(tische.get(tischnummer).getLand().land);
}
}```
Und ein paar kleinere Unbedeutende Klassen. Also Unbedeutend für das von mir hier beleuchtete Problemchen. ;)