Na gut......
also im groben angerissen sollte das ganze ungefähr so aussehen :
[code=Java]
public class Game{
public static void main(String[] args){
JFrame f = new JFrame("Game");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(new Game().new GamePanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
@SuppressWarnings("serial")
class GamePanel extends JPanel implements Runnable, KeyListener{
final static int WIDTH = 400;
final static int HEIGHT = 400;
BufferedImage screen;
Thread loop;
boolean running;
public GamePanel(){
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
private void init(){
screen = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
running = true;
}
private void update(){}
private void render(){}
private void draw(){
Graphics g = getGraphics();
if(g != null){
g.drawImage(screen, 0, 0, null);
}
else{
System.exit(0);
}
}
@Override
public void addNotify(){
super.addNotify();
if(loop == null) {
addKeyListener(this);
loop = new Thread(this);
loop.start();
}
}
@Override
public void run(){
init();
while(running){
update();
render();
draw();
try {
Thread.sleep(100);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent e){}
@Override
public void keyReleased(KeyEvent e){}
@Override
public void keyTyped(KeyEvent e){}
}
}
[/code]
sicher könnte man hier noch wesentlich OO herangehen, aber im grossen und ganzen sollte es in solch eine Richtung gehen,
Alles was du nun zeichnen möchtest , kannst du in der render Methode machen , dafür holst du dir den Graphics kontext des images (screen)
und übergibst ihn einer beliebigen methode, hier wird dann unter anwendung von double buffering erst auf das image gemalt , und dann das ganze image auf den JPanel, sprich es wird gepuffert, da du nicht direkt auf den Panel malst, um z.B flackern beim neuzeichnen zu unterbinden.
nehmen wir an wir implementieren eine Klasse Player und wollen diesen dann zeichnen, dann sieht das ganze z.B rudimentär so aus
[code=Java]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game{
public static void main(String[] args){
JFrame f = new JFrame("Game");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(new Game().new GamePanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
@SuppressWarnings("serial")
class GamePanel extends JPanel implements Runnable, KeyListener{
final static int WIDTH = 400;
final static int HEIGHT = 400;
BufferedImage screen;
Thread loop;
boolean running;
Player player;
public GamePanel(){
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
private void init(){
screen = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
player = new Player("Spieler 1");
player.setPosition(50, 50);
running = true;
}
private void update(){}
private void render(){
Graphics g = screen.getGraphics();
player.draw(g);
}
private void draw(){
Graphics g = getGraphics();
if(g != null){
g.drawImage(screen, 0, 0, null);
}
else{
System.exit(0);
}
}
@Override
public void addNotify(){
super.addNotify();
if(loop == null) {
addKeyListener(this);
loop = new Thread(this);
loop.start();
}
}
@Override
public void run(){
init();
while(running){
update();
render();
draw();
try {
Thread.sleep(100);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent e){}
@Override
public void keyReleased(KeyEvent e){}
@Override
public void keyTyped(KeyEvent e){}
}
class Player{
int x;
int y;
String name;
public Player(String s){
name = s;
}
public void draw(Graphics g){
g.setColor(Color.RED);
g.drawString(name, x, y - 15);
g.fillRect(x, y, 20, 20);
}
public void setPosition(int x, int y){
this.x = x;
this.y = y;
}
}
}
[/code]
