# Java 2D Spiel mit LWJGL verbinden



## GentleXD (3. Okt 2016)

Hallo Java Forum Community,

ich programmiere jetzt seit einigen Tagen an einem erst einmal kleinen 2D Jump and Run rum.
Ich habe die Engine soweit fertig, diese basiert auf den Java Graphics Klassen zum zeichnen von Formen laden von Texturen usw.
Da ich davor mich etwas mit LWJGL und der 3D Programmierung (für eine Facharbeit), beschäftigt habe habe ich dort einige Erfahrungen gemacht, und für ein Partikel System reicht es.
Jetzt würde ich gerne LWJGL mit meinem jetzigen 2D Spiel in verbinden bringen um zum Beispiel die Licht Berechnungen zu machen oder meinem Partikel System mit den LWJGL Shadern  einen besseren Look zu verschaffen, nun mein Problem ist ich weiß nicht recht wie ich das anstellen soll, ich kann beide Sachen programmieren aber zum Beispiel bei meiner GamePanel Klasse wo das gesamte Spiel gezeichnet wird ist es ja in LWJGL etwas anders als bei einem reinen Java 2D Spiel und jetzt meine Frage: Muss ich den ganzen Code nochmal neu in LWJGL schreiben oder kann ich das auch anders machen?
Beispiel Klasse (Java 2D Spiel):


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.VolatileImage;

import javax.swing.JPanel;
import javax.swing.Timer;


public class GamePanel extends JPanel implements ComponentListener, ActionListener, KeyListener, MouseListener {

    private static final long serialVersionUID = 1L;
 
    public static int width;
    public static int height;
    public static final int SCALE = 3;
    public static Mouse mouse;
 
    private Timer timer;
    private GameStateManager gsm;
    private VolatileImage image;

    public GamePanel() {
        super();
        setPreferredSize(new Dimension(600, 400));
        addComponentListener(this);
        addMouseListener(this);
        addKeyListener(this);
        setFocusable(true);
        requestFocus();

        mouse = new Mouse(this);
        width = getPreferredSize().width;
        height = getPreferredSize().height;
        gsm = new GameStateManager(GameStateManager.PLAYSTATE);
     
    }
 
    @Override
    public void addNotify() {
        super.addNotify();
        image = createVolatileImage(width / SCALE, height / SCALE);
        timer = new Timer(1000 / 60, this);
        timer.start();
    }
 
 
    private void update() {
        gsm.update();
    }
 
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = image.createGraphics();
        g2.setBackground(new Color(146, 189, 221));
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,        RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        gsm.render(g2);
        g.drawImage(image, 0, 0, width, height, null);
    }
 
    @Override
    public void actionPerformed(ActionEvent arg0) {
        update();
        repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {
        gsm.mousePressed(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        gsm.mouseReleased(e);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        gsm.keyPressed(e, e.getKeyCode());
    }

    @Override
    public void componentResized(ComponentEvent e) {
        if(e.getSource().equals(this)) {
            width = getWidth();
            height = getHeight();
            image = createVolatileImage(width / SCALE, height / SCALE);
        }
    }
}
```


----------



## Major_Sauce (6. Okt 2016)

Moin,

im Grunde wirst du "alles" neu schreiben würfen. 
Mit "alles" meine ich aber nicht unbedingt ALLES, sondern nur den Code der für das Rendern gedacht ist. 
Ich habe nicht all zu viel Ahnung von LWJGL, also verbessert mich bitte falls ich was falsches sage, aber soweit ich weiß hat man dort schon eine komplette Engine, also wird zum Beispiel auch schon Input handling und ähnliches behandelt. Falls du das doch gerne selbst machen würdes, kannst du einfach auf GL-Bindings wie zum Bleistift JOGL zurückgreifen. Dann wirst du zwar immer noch so einiges umschreiben müssen, aber ich denke du kannst trotzdem noch "mehr" vom Code beibehalten, da du JOGL auch auf deinem JPanel aufsetzen lassen kannst.
Ich baue gerade außerdem eine kleine Engine, welche das Rendern mit OpenGL ermöglichen soll (performance-boost usw), aber immernoch "einfach" zu bedienen ist, es wird trotzem die ganze JOGL-Funktionalität unterstützt. Falls du Interesse hast dir die mal anzuschauen kannst du mir gerne ne PM schicken...

Mfg Major


----------

