Hi ich bin neu hier und habe eine Frage zu einem Projekt von mir:
Ich möchte ein Spiel erstellen, dass in etwa 2D-Minecraft ohne spieler wird. Die Blöcke sind 5x5 große Quadrate, die natürlich regelmäßig aktualisiert werden sollen. Per Mausklick soll man Blöcke löschen oder Hinzufügen können (,was hier aber noch nicht implementiert ist).
Ich hatte das ganze shon ein Mal programmiert mit einem ImageIcon Array in das ich die Bilder der Blöcke gepackt habe und diese dann gezeichnet. Das war allerdings sehr langsam, das es umd die 22000 Blöcke sind.
Jetzt möchte ich, dass die Blöcke direkt als Bild auf ein JPanel gemalt werden. Das geht soweit auch, aber durch den Override der paintComponent()-Funktion baut sich das Bild jede Sekunde neu von links nach rechts auf. Das sieht kacke aus und ist zu langsam!
Hier der Quelltext:
-Hauptklasse:
-Panelklasse:
-Klasse des Grundblocks:
Hoffe sehr dass mir jemand sagen kann, wie ich das Bild in "einem Stück" aktualisiere...
Eine andere Lösung die das selbe visuelle Ergebnis liefert wäre auch OK.
Schon mal danke, Gemini22
P.S.: Ja, ich habe schon gegoogelt, aber nix brauchbares gefunden/es nicht kapiert.
Ich möchte ein Spiel erstellen, dass in etwa 2D-Minecraft ohne spieler wird. Die Blöcke sind 5x5 große Quadrate, die natürlich regelmäßig aktualisiert werden sollen. Per Mausklick soll man Blöcke löschen oder Hinzufügen können (,was hier aber noch nicht implementiert ist).
Ich hatte das ganze shon ein Mal programmiert mit einem ImageIcon Array in das ich die Bilder der Blöcke gepackt habe und diese dann gezeichnet. Das war allerdings sehr langsam, das es umd die 22000 Blöcke sind.
Jetzt möchte ich, dass die Blöcke direkt als Bild auf ein JPanel gemalt werden. Das geht soweit auch, aber durch den Override der paintComponent()-Funktion baut sich das Bild jede Sekunde neu von links nach rechts auf. Das sieht kacke aus und ist zu langsam!
Hier der Quelltext:
-Hauptklasse:
Java:
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class Anwendung extends JFrame
{
/**
* @author Gemini22
* @version 2.0
*/
public static void main(String[] args)
{
new Anwendung();
}
JFrame fStart;
MeinPanel mPanel;
JMenuBar bMenu;
JMenu mMats;
JMenuItem iLuft;
JMenuItem iStein;
public Anwendung()
{
fStart = new JFrame();
setLayout(new GridLayout(1,1));
setTitle("Pixel Universum | Welt");
setDefaultCloseOperation(EXIT_ON_CLOSE);
final Dimension d = this.getToolkit().getScreenSize();
setLocation((int) ((d.getWidth() - 1000) / 2), (int) ((d.getHeight() - 600) / 2));
setSize(1000, 600);
setResizable(false);
bMenu = new JMenuBar();
bMenu.add(mMats = new JMenu("Materialien"));
mMats.add(iLuft = new JMenuItem("Luft"));
mMats.add(iStein = new JMenuItem("Stein"));
setJMenuBar(bMenu);
mPanel = new MeinPanel(fStart);
add(mPanel);
setVisible(true);
while(true)
{
repaint();
}
}
}
-Panelklasse:
Java:
[code=Java]import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MeinPanel extends JPanel
{
JFrame kFStart;
Luft luft;
public MeinPanel(JFrame observer)
{
kFStart = observer;
luft = new Luft();
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
for(int i = 0; (i*5)<1000; i++)
{
for(int j = 0; (j*5)<600; j++)
{
luft.zeichne(i*5, j*5, getGraphics(), kFStart);
}
}
}
}
-Klasse des Grundblocks:
Java:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Luft
{
private Image img;
public Luft()
{
try
{
img = ImageIO.read(new File("Luft.png"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void zeichne(int x, int y, Graphics g, ImageObserver observer)
{
g.drawImage(img, x, y, observer);
}
}
Eine andere Lösung die das selbe visuelle Ergebnis liefert wäre auch OK.
Schon mal danke, Gemini22
P.S.: Ja, ich habe schon gegoogelt, aber nix brauchbares gefunden/es nicht kapiert.