Double Buffering implementiert, Image weg :-(

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo zusammen,

ich bin gerade dabei, das Tutorial SpaceInvaders zu verstehen und nachzubauen. Das es SWT und Canvas benutzt, habe ich gedacht, ich baue es mal auf JComponent und Double Buffering um.

Das hätte ich wohl besser bleiben lassen. Nun erscheint beim Aufruf leider die Image des Players gar nicht mehr :oops:

Was habe ich falsch gemacht?

Danke für einen kleinen Tipp.

Mit Canvas und BufferStrategy (so funktioniert es):

Code:
	public void paintWorld() {
		Graphics2D g = (Graphics2D)strategy.getDrawGraphics(); 
		g.setColor(getBackground());
		g.fillRect(0, 0, this.getSize().width, this.getSize().height);
		g.setColor(getForeground());
		paint(g);

		playGround.paint(g);
		player.paint(g);
		
		strategy.show();
	}

So funktioniert es leider nicht !

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

import project.Player;
import project.SpriteCache;
import project.Stage;

public class MainCloneInvaders extends JComponent implements Stage, KeyListener  {

	private static final long serialVersionUID = 3258131375281680691L;

	public int posX,posY,vX;
	public BufferedImage buffer;
	public long usedTime;
	
	private Image img;
	private Graphics g;
	
	private SpriteCache spriteCache;
	private ArrayList actors;
	
	private Player player;
	
	public MainCloneInvaders() {
		super();

		spriteCache = new SpriteCache();
		
		JFrame frame = new JFrame("CloneInvaders");
		JPanel panel = (JPanel)frame.getContentPane(); 
		setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
		panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT));		
		panel.setLayout(null); 
		panel.setBackground(Color.black);
		panel.add(this);

        frame.setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
		frame.setVisible(true);
		frame.addWindowListener( new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
			});
		
		 addKeyListener(this);
	}

	public SpriteCache getSpriteCache() {
		return spriteCache;
	}
		
	public Player getPlayer() {
		return player;
	}

	public void keyPressed(KeyEvent e) { 
		player.keyPressed(e); 
	} 
	
	public void keyReleased(KeyEvent e) { 
		player.keyReleased(e);
	}
	
	public void keyTyped(KeyEvent e) {
		
	}

	public void initWorld(){
		
	    player = new Player(this);
	    player.setX(Stage.WIDTH/2);
	    player.setY(Stage.PLAY_HEIGHT - 2*player.getHeight());
	}
	
	public void updateWorld(){

		player.act();

	}
	
	public void paintWorld() {
		img = createImage(this.getSize().width, this.getSize().height);
		g = img.getGraphics();
		g.setColor(getBackground());
		g.fillRect(0, 0, this.getSize().width, this.getSize().height);
	        paint(g);
		
		player.paint(g);
	}
	
	public void game() {
		initWorld();
		updateWorld();
		paintWorld();
	}
	
	public static void main(String[] args) {

		MainCloneInvaders inv = new MainCloneInvaders();
		inv.game();

	}

}

Code:
package project;

import java.awt.event.KeyEvent;

public class Player extends Actor {
	protected static final int PLAYER_SPEED = 4;
	private boolean up,down,left,right;
	
	protected int vx;
	protected int vy;
	      
	public Player(Stage stage) {
		super(stage);
		setSpriteName("spaceShipPlayer.gif");
	}
	      
	public void act() {
		super.act();
	    x+=vx;
	    y+=vy;
	    if (x < 0 || x > Stage.WIDTH)
			vx = -vx;
			if (y < 0 || y > Stage.HEIGHT)
				vy = -vy;
			}
	    
		public int getVx() { return vx; }
	    public void setVx(int i) {vx = i; }
	    public int getVy() { return vy; }
	    public void setVy(int i) {vy = i; }
		
		protected void updateSpeed() {
			vx=0;vy=0;
			if (down) vy = PLAYER_SPEED;
			if (up) vy = -PLAYER_SPEED;
			if (left) vx = -PLAYER_SPEED;
			if (right) vx = PLAYER_SPEED;
		}
			      
		public void keyReleased(KeyEvent e) {
			switch (e.getKeyCode()) {
			case KeyEvent.VK_DOWN : down = false;break;
			case KeyEvent.VK_UP : up = false; break;
			case KeyEvent.VK_LEFT : left = false; break; 
			case KeyEvent.VK_RIGHT : right = false;break;
			}
			updateSpeed();
		}
			      
		public void keyPressed(KeyEvent e) {
			switch (e.getKeyCode()) {
			case KeyEvent.VK_UP : up = true; break;
			case KeyEvent.VK_LEFT : left = true; break;
			case KeyEvent.VK_RIGHT : right = true; break;
			case KeyEvent.VK_DOWN : down = true;break;
			}
			updateSpeed();
		}
	 }

Code:
package project;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class Actor {
	protected int x,y;
	protected int width, height;
	protected String spriteName;
	protected Stage stage;
	protected SpriteCache spriteCache;
	
	public Actor(Stage stage) {
		this.stage = stage;
		spriteCache = stage.getSpriteCache();
	}
    
	public void paint(Graphics g){
		g.drawImage( spriteCache.getSprite(spriteName), x,y, stage );
	}
      
	public int getX()  { return x; }
	public void setX(int i) { x = i; }
  
	public int getY() { return y; }
	public void setY(int i) { y = i; }
    
    public String getSpriteName() { return spriteName; }

	public void setSpriteName(String string) { 
      spriteName = string;
      BufferedImage image = spriteCache.getSprite(spriteName);
      height = image.getHeight();
      width = image.getWidth();
    }     
      
    public int getHeight() { return height; }
    public int getWidth() { return width; }
    public void setHeight(int i) {height = i; }
    public void setWidth(int i) { width = i;  }
   
    public void act() { }
}
[/code]
 
S

stev.glasow

Gast
In der Klasse MainCloneInvaders zeichest du zwar alles schön in 'img' aber musst du nicht die paint der Klasse MainCloneInvaders überschreiben und dort 'img' zeichnen? So hast du's ja bisher nur aufs Bild gezeichnet aber noch nicht auf die Komponente.
 

spidermobile

Bekanntes Mitglied
ja, irgendwie kommt mir das auch spanisch vor. Ich gebe zu, mit dem überschreiben von paint hab ich es noch nicht so.
Im ersten Beispiel wird das überschreiben wohl mit:

Code:
Graphics2D g = (Graphics2D)strategy.getDrawGraphics();

aufgerufen. Aber was muss ich bei meinem Ansatz noch hinzufügen?
 
S

stev.glasow

Gast
Überschreibt mal paint oder paintComponent und zeichne dort das Bild und ich weiß nicht wie das in Swing läuft aber ich würde nicht von JComponent erben sondern von JLabel.
Und notfalls gib mal noch die Stage, die SpriteCache und was man sonst noch benötigt (Bilder und so) dann hau ich das mal in mein Eclipse.
 

spidermobile

Bekanntes Mitglied
Danke für das Angebot, aber ich denke die Mühe ist es nicht wert, da es ja mit der BufferStrategy und Canvas funktioniert. Dann lass ich es eben so.
Ist ja nur zum Lernen gedacht.

Trotzdem vielen Dank!!
 
S

stev.glasow

Gast
Hm, nagut. Aber wenn du's so läßt lernst du erst recht nix. Und wieso nur lernen ?
 

spidermobile

Bekanntes Mitglied
Bin eigentlich kein Programmierer, hab nur mit vielen von diesen (lieben) Kollegen zu tun :wink: , und ich lasse mir halt nicht gerne ein x für ein u vormachen.
Deshalb lerne ich jetzt mal ein wenig Java. Ist dann auch leichter, mal im Code der Entwickler rumzuschnüffeln und ein paar gute Tipps zu geben :lol:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Double Buffering blinken Java Basics - Anfänger-Themen 8
T laagen trotz Double-Buffering Java Basics - Anfänger-Themen 5
M Komische Syntax bei Double-Buffering-Beispiel Java Basics - Anfänger-Themen 2
P Problem mit double buffering Java Basics - Anfänger-Themen 9
W Double or Float zusammenrechnen Java Basics - Anfänger-Themen 15
I Review von euch erwünscht, double Rechnung falsch Java Basics - Anfänger-Themen 34
X wie bekomme ich durch Eingabeaufforderung definierte double in einen Befehl, welcher 3 erwartete double braucht? Java Basics - Anfänger-Themen 3
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
MoxMorris Integer.MAX_VALUE und Double.MAX_VALUE Unterschied Java Basics - Anfänger-Themen 3
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
Lion.King Fehler in double und int Java Basics - Anfänger-Themen 7
F java: incompatible types: possible lossy conversion from double to int Java Basics - Anfänger-Themen 1
J Double Variable und Addition Java Basics - Anfänger-Themen 2
F Double Ausgabe nicht wissenschaftlich Java Basics - Anfänger-Themen 16
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
Kotelettklopfer Variablen Double zwingen Ganzzahlen mit 2 Nachkommastellen auszugeben Java Basics - Anfänger-Themen 10
A possible lossy conversion from double to int Java Basics - Anfänger-Themen 5
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
L ArrayList<String> --> double[] array Java Basics - Anfänger-Themen 18
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
J Transformation zweier Integer in ein Double Java Basics - Anfänger-Themen 26
N The method setSaldo(double) in the type Konto is not applicable for the arguments (int, int) Java Basics - Anfänger-Themen 2
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
V Erste Schritte Die Nuller bei double NICHT abschneiden Java Basics - Anfänger-Themen 4
Y Datentypen Double Division ungenau Java Basics - Anfänger-Themen 45
L Datentypen Rechnen und abrunden mit double Java Basics - Anfänger-Themen 7
M Writer für unterschiedliche Obj/inbt/double erstellen? Java Basics - Anfänger-Themen 1
F Character umwandeln als Double Werte Java Basics - Anfänger-Themen 8
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
D Methode mit Übergabe double und Rückgabe String Java Basics - Anfänger-Themen 2
P Hilfe bei Double Java Basics - Anfänger-Themen 1
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
B HQL / Hibernate, GroupBy und Ausgabe als Double Java Basics - Anfänger-Themen 1
M Konvertierung String -> double Java Basics - Anfänger-Themen 8
A Double Scan eingrenzen Java Basics - Anfänger-Themen 2
O Erste Schritte Potenzmethode per double Java Basics - Anfänger-Themen 11
A Random Double mit Math.round() runden? Java Basics - Anfänger-Themen 1
H Double oder nicht? Java Basics - Anfänger-Themen 7
J int array als double array ausgeben Java Basics - Anfänger-Themen 9
M Int und Double in Array speichern Java Basics - Anfänger-Themen 1
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
B Hashing (verkettet/double) Java Basics - Anfänger-Themen 0
L Konvertieren von String zu double?! Java Basics - Anfänger-Themen 6
V Operatoren Warum kommt bei double bei den Nachkommastellen irgendwann eine 2?! (1.20000000000002) Java Basics - Anfänger-Themen 5
geekex Double zu String umwandeln in einer Methode Java Basics - Anfänger-Themen 28
E Bruch erstellen - Von Int zu Double Ergebnis Java Basics - Anfänger-Themen 24
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
I Double.ParseDouble 2 Textfelder Java Basics - Anfänger-Themen 1
M JComboBox feste double Werte zu ordnen Java Basics - Anfänger-Themen 8
P Datentypen Kann ich bei double Komma statt Punkt eingeben? Java Basics - Anfänger-Themen 14
E Von Double zu Long umwandeln Java Basics - Anfänger-Themen 9
L Bei falscher Eingabe soll NaN zurückgegeben werden, Rückgabetyp jedoch double Java Basics - Anfänger-Themen 3
V Variablen Double später deklarieren Java Basics - Anfänger-Themen 7
V double = 1.34823e-300 Java Basics - Anfänger-Themen 5
W double*double error Java Basics - Anfänger-Themen 4
kilopack15 Mehr Nachkommastellen mit double Java Basics - Anfänger-Themen 14
T Input/Output Double und String als Eingabe einlesen Java Basics - Anfänger-Themen 9
J [Rundungsfehler bei Double] Grundkurs Java: Checke Lösungsweg nicht Java Basics - Anfänger-Themen 1
W In einer Function<Double, Double> undefinierte Rechenoperationen abfangen? Java Basics - Anfänger-Themen 3
T set Metode für Double Java Basics - Anfänger-Themen 6
Hijo2006 String to Double Java Basics - Anfänger-Themen 4
K Double Wert runden und in Int umwandeln Java Basics - Anfänger-Themen 7
A Kommafehler beim double einleseen korrigieren Java Basics - Anfänger-Themen 2
K Operatoren The Operator * is undefined for the argument type(s) double, String Java Basics - Anfänger-Themen 4
das_leon String zu double konventieren Java Basics - Anfänger-Themen 1
K Genauer als Double? Java Basics - Anfänger-Themen 4
T Double.parseDouble(args[0]) Java Basics - Anfänger-Themen 13
A Java Ungenauigkeit double Java Basics - Anfänger-Themen 6
B Methoden The method mirror(double[]) in the type Convolution is not applicable for the arguments (double) Java Basics - Anfänger-Themen 8
C Typumwandlung von int<-->double Java Basics - Anfänger-Themen 6
M Double Wert auf 2 Kommastellen runden Java Basics - Anfänger-Themen 2
S Regelabfragen aus Double-Array Java Basics - Anfänger-Themen 2
A Erste Schritte Double Wert aus String zu int Java Basics - Anfänger-Themen 2
P Rückgabe erflogt nicht als Double Java Basics - Anfänger-Themen 2
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
P scanner ein Double einlesen Java Basics - Anfänger-Themen 10
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
S double[x] , double[y] zu Point[] points kopieren? Java Basics - Anfänger-Themen 15
G double in float umwandeln Java Basics - Anfänger-Themen 2
F double[] an andere Methode übergeben Java Basics - Anfänger-Themen 1
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
S Datentypen double - kommastellen abschneiden Java Basics - Anfänger-Themen 6
M int double int double Graph Java Basics - Anfänger-Themen 3
K ArrayList<Double> --> double[] array Java Basics - Anfänger-Themen 5
Z Double in komma und Punkt akzeptieren -> Robusteeingabe Java Basics - Anfänger-Themen 7
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
B Datentypen Multiplzieren mit double wird ungenau Java Basics - Anfänger-Themen 4
K Von einem Double wert nur die Zahl vor dem Komma verwenden Java Basics - Anfänger-Themen 9
F Double neu formatieren mit NumberFormat Java Basics - Anfänger-Themen 2
M Double-Ausgabe in JTextField fehlerhaft Java Basics - Anfänger-Themen 2
T Problem mit double-Formatierung Java Basics - Anfänger-Themen 3
M Double Zahl in Grad Zahl Java Basics - Anfänger-Themen 7
M Datentypen Ergebniss- Double to String- wird nicht angezeigt Java Basics - Anfänger-Themen 13
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
M Die Double-Variable rundet? Java Basics - Anfänger-Themen 1
llabusch Methoden Methoden überlagern - entweder int || double Java Basics - Anfänger-Themen 10
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
K Datentypen Wertebereich float/double - Warum nicht hoch -1 Java Basics - Anfänger-Themen 6
A Double[] Array zahlen per Argument übergeben Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben