Hintergrund-Bild für einfache Spiel?
Habe ich nach der Java Spiel Programmieren für Anfänger tutorial-Reihe, und wünschte sich, zu Experimentieren, indem ein hintergrund-Bild. Leider, wenn ich es Rendern durch die paintComponent
Methode, es bewegt sich mit meinem sprite (wenn auch auf einem Gerät kontinuierlich im Gegensatz zu fünf), und wenn ich das Rendern über die paint-Methode, bekomme ich eine seltsame, flackernde Feld, das entspricht der Farbe bezeichnet in der setBackground (color)
Eigenschaft des JFrame
und es bewegt sich mit der sprite identisch zu der vorherigen Instanz (innerhalb paintComponent
).
Wie könnte ich den code so auf das Bild zu statisch bleiben, als hintergrund sein soll?
Code:
public class JavaGame extends JFrame{
int x, y;
private Image dbImage;
private Graphics dbg;
Image ghost;
Image bg;
public class AL extends KeyAdapter{
public void keyPressed(KeyEvent e){
int keyCode = e.getKeyCode();
if(keyCode == e.VK_LEFT){
if(x <= 8)
x = 8;
else
x += -5;
}
if(keyCode == e.VK_RIGHT){
if(x >= 235)
x = 235;
else
x += +5;
}
if(keyCode == e.VK_UP){
if(y <= 18)
y = 18;
else
y += -5;
}
if(keyCode == e.VK_DOWN){
if(y >= 235)
y = 235;
else
y += +5;
}
}
public void keyReleased(KeyEvent e){
}
}
public JavaGame(){
//Load images
ImageIcon i = new ImageIcon("C:/Users/Taylor/workspace/Java game/src/ghost.png");
ghost = i.getImage();
ImageIcon j = new ImageIcon("C:/Users/Taylor/workspace/Java game/src/bg.png");
bg = j.getImage();
//Game properties
addKeyListener(new AL());
setTitle("Java Game");
setSize(500, 500);
setResizable(false);
setVisible(true);
setBackground(Color.GRAY);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x = 150;
y = 150;
}
public void paint(Graphics g){
g.drawImage(bg, 0, 0, null);
dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
paintComponent(dbg);
g.drawImage(dbImage, x, y, this);
}
public void paintComponent(Graphics g){
g.setColor(Color.WHITE);
g.drawImage(ghost, x, y, this);
repaint();
}
public static void main(String[] args) {
new JavaGame();
}
Bilder:
- Im Allgemeinen, wenn Sie einen Screenshot, sollten Sie diese Bearbeiten, um nur den relevanten Teil (ALSO, das Spiel-Fenster).
- Rufen Sie nicht
repaint
auspaintComponent
.repaint
(irgendwann) fordertpaint
fordertpaintComponent
fordertrepaint
, es ist eine unendliche Schleife. - Wie bereits in Wie erstelle ich screenshots?, combo. alt+printscreen wird auf Windows-capture - nur das aktive Fenster Bereich.
- Mögliche Duplikate von Zeigen eine animierte BG in Swing (ja, Virginia, es funktioniert auch für statische Hintergründe).
- Abbrechen, der Gedanke ich war zu vorschnell in meiner Beurteilung. Diese Frage ist nicht ein Duplikat der verlinkten Frage. Tut mir Leid, dass. 😛
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wurden Sie kopieren/einfügen von code zufällig? Das ist, was es sah aus wie. Es gab so viele seltsame Aspekte, die code, die ich nicht dokumentieren Sie alle (gut für code-review, vielleicht). Das Beispiel verwendet eine asynchrone Methode zum laden der Bilder (in der Reihenfolge zu erhalten das animierte Bild, Animation). Verwenden
ImageIO.read(URL)
für eine synchrone Methode zum laden von statischen Bildern.Hier sind ein paar kurze Tipps:
File
Objekt. Fügen Sie Sie zu den run-time class-path und auf Sie zugreifen, indem Sie URL.main()
).super.paint(g);
(oderpaintComponent(g)
) am Anfang der Methode.paintComponent()
. Fügen Sie das panel auf das frame.Code
g.drawImage(dbImage, ...)
.null
in meiner version des Codes. Hätte ich kommentiert, aber ich war verwirrt, warum war es immer dort! Aber du hast mich daran erinnern zu erwähnen, dass..g.drawImage(bg, 0, 0, null);
sollteg.drawImage(bg, 0, 0, this);
- War es etwas anderes? Es ist einfach zu verlieren, in code, der schlecht ist.