Seite 1 von 1

JAVA Hilfe

Verfasst: 4. Mai 2006, 14:23
von mephi
hi hab n prob mit java und awt
kennt sich damit einer aus?

hab eine methode die etwas zeichnet, aber nie aufgerufen wird. zumindest net in dem code den ich vorliegen habe. also nehm ich mal an die wird in einem package oder so aufgerufen. aber müsste verstehn wie damit ich mit der arbeiten kann

Code: Alles auswählen

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class GamePanel extends Panel implements KeyListener {
..
.
.

public void update(Graphics g) {
    paint(g);
  }
..
.
.

hier mal der komplette code

Code: Alles auswählen

mport java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

public class GamePanel extends Panel implements KeyListener {
  
	// Die müsst ihr programmieren ;)
	boolean run=true;
	Spieler s1 = new Spieler();
  
  
  // Double Buffering
  BufferedImage buf;
  Graphics2D g2d;
  
  // fürs merken der Tasteneingaben
  boolean p1up = false, p1down = false;
  boolean p2up = false, p2down = false;

  public GamePanel() {
    this.setBackground(Color.black);
    this.addKeyListener(this);
  }
  
  public void update(Graphics g)
  {
    paint(g);
  }
  
  public void paint(Graphics g)
  {
    if (buf == null)
    {
      buf = new BufferedImage(this.getSize().width,this.getSize().height,BufferedImage.TYPE_INT_ARGB);
      g2d = (Graphics2D) buf.getGraphics();
    }
    s1.paint(g);
    
    
    
    // diese Zeile kopiert euer fertiges Bild auf den Bildschirm -> kein Flackern
    g.drawImage(buf,0,0,buf.getWidth(),buf.getHeight(),this);
  }
  
  public void gameLoop() throws InterruptedException{
	  while(run){
		  s1.coordX++; // nur zum testen
		  Thread.sleep(100);
		  
	  }
  }

  public void keyPressed(KeyEvent e) {
    // flags auf true setzen
  }

  public void keyReleased(KeyEvent e) {
    // flags auf false setzen
  }

  public void keyTyped(KeyEvent e) {
    // ignorieren ;P
  }
}

Code: Alles auswählen

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MainFrame extends Frame {
  
  GamePanel p = new GamePanel();
  
  public MainFrame()
  {
    this.setSize(840,640);
    this.setTitle("Wer das liest ist doof");
    this.setResizable(false);
    this.setAlwaysOnTop(true);
    this.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      }
    });
    this.add(p);
    this.setVisible(true);
  }

  public static void main(String[] args) {
    MainFrame f = new MainFrame();
  }

}

Verfasst: 5. Mai 2006, 22:46
von Prinegon
Um deine Frage mal zu beantworten, überschreibt die update-Methode deines Programmes jene, die das Objekt durch Component ererben würde. Wann die Methode aufgerufen wird, wird für dich nicht sonderlich wichtig sein, geh einfach davon aus, der Aufruf erfolgt immer automatisch, wenn sich an deinem Panel etwas ändern würde (denn dafür ist die Methode da, es wird das Panel neu gezeichnet, wann auch immer es not tut).
update soll dafür sorgen, daß ein Bildschirmelement relativ flackerfrei neugezeichnet werden kann, indem es, anstatt den ganzen Bildschirm zu löschen, nur den Bereich löscht, der von diesem Element belegt wird und dann das Element dort neu hinzeichnet.
Die Standardmethode wurde überschrieben. In deinem Panel wird es wahrscheinlich nicht nötig sein, vor dem Neuzeichnen erst den Bereich zu löschen, somit wurde das löschen eingespart und update läuft, wie im Kommentar geschrieben, flackerfrei. Das funktioniert natürlich nur dann, wenn es nicht passieren kann, daß Teile deines Panels nicht neugezeichnet werden, die hinterher zu sehen wären.

Wenn du mehr wissen willst, schau mal hier:http://www.addisonwesley.de/Service/Kru ... tm#E14E128

Verfasst: 26. Mai 2006, 18:58
von Miro
ruf in der gameLoop() repaint() auf.

Verfasst: 13. Jun 2006, 09:01
von mephi
Ich danke euch für die hilfe.. hab das ganze nun geschmissen und mit openGL und der lwjgl angefangen.. klappt wunderbar nur hab ich nun ein problem mit openAL.. kennt sich damit jemand aus?