2D-Grafik Flackerndes Hintergrund

19Beat99

Mitglied
Hallo

Ich habe begonnen ein Jump and Run zu programmieren. Das Ziel von dem was ich bis jetzt programmiert habe ist, dass sich der Hintergrund beim drücken der Pfeiltasten nach rechts und nach links bewegt. Das funktioniert auch soweit. Jedoch flackert das Bild und ich finde nicht heraus an was es liegt.
Vielen Dank für eure Hilfe schon mal im voraus.



PS: Ich bin mir nicht ganz sicher ob ich das mit dem Code hochladen so richtig gemacht habe. Falls nicht wäre ich froh wenn mir jemand erklären kann wie man es richtig macht. Ich habe das noch nie gemacht.

Java:
/**
*
* @author Beat
*
*/
public class Start {




public static void main(String[] args) {





GUI G = new GUI();




}

}








import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Label;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GUI_Jump_and_Run extends JFrame implements ActionListener{

Image img1;
Image img2;
int bewegung;
BufferedImage buffered;

public GUI_Jump_and_Run() {

setVisible(true);
setSize(1300, 780);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Jump and Run");
setLayout(null);
setLocationRelativeTo(null);
setFocusable(true);

ImageIcon u = new ImageIcon(getClass().getResource("Bild.jpg"));
img1 = u.getImage();


ImageIcon f = new ImageIcon(getClass().getResource("figur.png"));
img2 = f.getImage();


addKeyListener(new Steuerung());

var.time = new Timer(6, this);
var.time.start();


}


public void paint (Graphics g) {

super.paint(g);


Graphics2D f2 = (Graphics2D)g;

if(var.lauf*-1==var.nx2) { //Rückwerts gehen

System.out.println(var.lauf);
var.nx-=var.längebild;
var.nx2-=var.längebild;
System.out.println(var.nx2);
}
if(var.lauf*-1==var.nx) { //Vorwerts gehen
var.nx+=var.längebild;
var.nx2+=var.längebild;
var.nx3+=var.längebild;
}

f2.drawImage(img1,var.lauf+var.nx-1300,0,null);
f2.drawImage(img1,var.lauf+var.nx,0,null);
f2.drawImage(img1,var.lauf+var.nx2-var.längebild,0,null);
//f2.drawImage(img1, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer)
//f2.drawImage(img2, 20, 20, null);


}


@Override
public void actionPerformed(ActionEvent e) {
lauf();
repaint();

}

public static void lauf() {


if (var.lauf <0){
var.lauf += var.bewegenBild;



}
else {
var.lauf = -1;

}

}

}






import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Steuerung extends KeyAdapter{


int x_bewegung;


public void keyPressed(KeyEvent e) {


if(e.getKeyCode()==KeyEvent.VK_LEFT) {

var.bewegenBild = 1;



}

if(e.getKeyCode()==KeyEvent.VK_RIGHT) {

var.bewegenBild = -1;

}




}
public void keyReleased(KeyEvent e) {

if (e.getKeyCode()!=KeyEvent.VK_LEFT || e.getKeyCode()!=KeyEvent.VK_RIGHT){
var.bewegenBild = 0;

}






}}









import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.Timer;

public class var {
static int bewegenBild;
static javax.swing.JPanel JPanel;
static int lauf=-1;
static Timer time;
static int längebild = 1300;
static int rechnen;
static int nx=1300;
static int nx2=0;
static int nx3=-1300;
public var() {


}}
 

Anhänge

  • Bild.jpg
    Bild.jpg
    55,2 KB · Aufrufe: 5
  • figur.png
    figur.png
    16,9 KB · Aufrufe: 5
Erstmal ein paar Anmerkungen:
  1. das Wichtigste vorab: vergiss das Tutorial, aus dem Du den Code hast
  2. halte Dich an die Benennungskonventionen von Java: Namen von Variablen, Methoden und Parametern in lowerCamelCase, Typbezeichner in UpperCamelCase
  3. verwende aussagekräftige Bezeichner: img1, u, f, img2 -> Tonne
Die bevorzugte Variante, hier Code zu posten: auf die drei Punkte neben dem Smiley -> Code -> Java -> Quelltext inkl. Einrückungen ins Textfeld kopieren. Vorgang für jede Datei wiederholen.

Wenn es viel Code ist, kannst Du ein Zip hochladen oder natürlich auch woanders online stellen und darauf verlinken.

Zur Frage: wenn Du nicht direkt im JFrame sondern in einer Komponente zeichnest und dort paintComponent statt paint überschreibst, erhältst Du automatisch double buffering. Willst Du weiterhin im JFrame zeichnen, musst Du Dich selbst darum kümmern, damit es nicht flackert.
 

Zurück
Oben