# Spiele programmieren für ein Fenster?



## Brayn (19. Mrz 2011)

Guten Abend,

erst mal kurz zu mir, denn ich bin neu hier und wollte mich erst mal vorstellen ;-) .An unsrer Uni haben wir nun ein Semester lang Java gelernt, das hat mir so viel Spaß gemacht dass ich mich beschlossen habe noch darüber hinaus zu lernen.
Im Moment haben wir noch Vorlesungsfreiezeit aber bevor es wieder losgeht und ich wieder richtig am lernen bin wollt ich mich damit beschäftigen Spiele in Java zu Programmieren, ich dachte, das kann für mein Informatik Studium nur nützlich sein. 

Jetzt zu meiner Frage:
Ich habe mal etwas gegoogelt und auch einige Seiten gefunden, ABER leider fand ich immer nur Hinweise dass Man 2D oder 3D Spiele nur in Javascript programmieren kann. Also so, dass man es mit einem Browser öffnen muss.
Ich würde aber gerne beim alt beliebten Text und Fenster bleiben, ist es irgendwie möglich ein Spiel wie Tetris oder Pacman für ein Fenster, also ein Frame zu schreiben?
Des weiteren hab ich gelesen dass Spiele dann nur als Applet programmiert werden können und somit keine "public static void main(String[] args)"   Form benötigen. Das wäre wirklich sehr schade wenn das nicht geht. 
Denn mit den Fenstern habe ich vor einem Monat erst begonnen und wollte nun meine Fenster auch mal ausbauen. Hat schon mal jemand Tetris oder Pacman programmiert? Weiß jemand mit wie viel Zeilen ich da ungefähr rechen kann (ja ich weiß dumme Frage, aber bevor ich mich total übernehme...) 


danke schon mal für euer Interesse an meinem Beitrag, liebe Grüße Matthias


----------



## Runtime (19. Mrz 2011)

Natürlich kannst du 2D / 3D Games auch in einem Fenster anzeigen lassen. (btw: Mit JavaScript kann man keine 3D Games machen) Am kannst du Spiele mit Java2D programmieren, wozu es ein gutes Tutorial von Sun gibt. Am besten lernst du aber zuerst richtig AWT und Swing zu benutzen, worüber es auch ein Tutorial von Sun gibt.
Wieviele Zeilen Code das Programm hat, ist sehr unterschiedlich, da kommts va das Design an. Ich hab für Tetris mit Java ME 1288 Zeilen (26.6 Zeichen pro Zeile, 5025 Wörter, 3.9 Wörter pro Zeile) geschrieben.


----------



## Antoras (19. Mrz 2011)

Das was du da gelesen hast ist Bockmist. 

In Java kann man durchaus Spiele programmieren. Applets verwendet dafür aber fast keiner mehr, da sie nichts taugen. Wenn du ein Spiel für den Browser machen willst, dann solltest du dir tatsächlich JavaScript ansehen (was außer dem Namen nichts mit Java zu tun hat) aber das willst du ja nicht.

Pacman oder Tetris halte ich für einen Anfänger noch zu kompliziert. Ich würde mit PingPong oder Snake anfangen. Oder mit diesem Tutorial.

@Runtime
Dank WebGL und so neuen XML-Erweiterungen (ka wie die heißen) ist es mittlerweile durchaus möglich 3D-Spiele für den Browser zu entwickeln, wobei das natürlich noch alles ziemlich beta ist.


----------



## Haave (19. Mrz 2011)

Hallo,

ich habe vor ein paar Tagen einen längeren Beitrag zum Thema Spieleprogrammierung mit Java verfasst, du kannst ihn bei Interesse hier nachlesen: Klick (da geht's btw auch um Javascript )




Brayn hat gesagt.:


> Ich würde aber gerne beim alt beliebten Text und Fenster bleiben, ist es irgendwie möglich ein Spiel wie Tetris oder Pacman für ein Fenster, also ein Frame zu schreiben?


Klar geht das, eine normale Desktop-Anwendung mit GUI eben, meinetwegen Swing oder so.




Brayn hat gesagt.:


> Des weiteren hab ich gelesen dass Spiele dann nur als Applet programmiert werden können und somit keine "public static void main(String[] args)"   Form benötigen. Das wäre wirklich sehr schade wenn das nicht geht.


Java-Applets unterliegen einigen Einschränkungen, was u.a. den Zugriff auf das System angeht, auf dem der Browser läuft. Das sind einfach zusätzliche Sicherheitsvorkehrungen. Für ein Browsergame sollte das aber eigentlich ohnehin nicht nötig sein.
Ja, die Quellcodedatei für ein Applet sieht etwas anders aus als für ein "normales" Java-Programm und (soweit ich weiß) gibt es keine reguläre main-Methode - aber das bedeutet ja nicht, dass es nicht ohne main-Methode auch geht. Oder warum findest du das schade? Was hast du dir denn als mögliches Problem dabei gedacht?




Brayn hat gesagt.:


> Denn mit den Fenstern habe ich vor einem Monat erst begonnen und wollte nun meine Fenster auch mal ausbauen. Hat schon mal jemand Tetris oder Pacman programmiert? Weiß jemand mit wie viel Zeilen ich da ungefähr rechen kann (ja ich weiß dumme Frage, aber bevor ich mich total übernehme...)


Benutz einfach mal die Suchfunktion des Forums, ich wette, da gibt's jede Menge Treffer. Bezüglich Tetris ist momentan dieser Thread recht aktuell, da hat jemand ein Tetris programmiert, das als Applet im Browser läuft: Klick


----------



## Brayn (19. Mrz 2011)

Danke schön für die schnellen und reichlichen Antworten, kennt jemand von euch Video2Brain? Davon habe ich die Ausgabe jetzt lerne ich Java, die hat mir bisher sehr viel weitergeholfen.
Leider ist mein Englisch nicht so gut. (Ich weiß Informatik setzt eigentlich gute Englisch Kenntnisse vorraus)

@Runtime dein Tutorial Beispiel von Sun ist ja auch auf Englich aber ich versuche es trotzdem mal, vielleicht verstehe ich ja trotzdem was 

@Antoras ich glaube sowas habe ich gesucht  ein Deutscher Text bei dem es direkt losgeht 

@Haave ich habe mir mal dein Link zu dem Spiel angesehen das ist echt gut gemacht, wenn ich sowas auch mal hinbekäme, wäre dass genial  
Zu deiner Frage was für mich das Problem ist wenn es keine main Methode gibt, nun ich habe diesbezüglich (also Spieleprogrammierung) noch gar keine Erfahrung, doch ich denke mir ohne main Methode, sieht der Aufbau bestimmt ganz anders aus und ob mir dann mein Vorwissen noch was bringt...bezweifele ich eben.

@all ich bin so froh dass ich zumindest mal weiß, dass Spiele Programmierung bei Java in Fenstern möglich ist, jetzt muss ich es nur noch lernen ;-) ich arbeite mich aufjedenfall mal durch die Threads und Tutoriols die ich von euch bekommen habe, und ich hoffe dann bin ich wieder etwas weiter 

Danke schön nochmal, liebe Grüße Matthias


----------



## Gastredner (19. Mrz 2011)

Brayn hat gesagt.:


> Ich habe mal etwas gegoogelt und auch einige Seiten gefunden, ABER leider fand ich immer nur Hinweise dass Man 2D oder 3D Spiele nur in Javascript programmieren kann.


Hast du mal einen oder mehrere Links? Das würde ich ja gerne mal sehen...


----------



## Brayn (19. Mrz 2011)

@Gastredner, leider nicht, hätte ich das gewusst hätte ich sie mir mal gespeichert, aber ich hab mich ja nur so durchgeklickt.

Jetzt habe ich aber ein neues Problem, ich habe mal mit dem Tutorial von "Antoras" begonnen, aber leider bin ich noch nicht sehr weit gekommen, da ich jetzt schon eine weile an dem gleichen Fehler hänge. Wie ihr am Code  sehen könnt kam ich gerade mal bis zur "fps - Anzeige" und die will nun nicht auf meinem Frame erscheinen. :-(

Ich dachte erst es liegt daran dass die Anzeige keinen Panel als Untergrund hat, dann habe ich mal einen JPanel erzeugt und die Anzeige als Label umgeschrieben, hat auch nicht funktioniert. Dann dachte ich es geht nicht weil kein Ort festgelegt wurde wo die fps angezeigt werden sollen, dann habe ich zu Testzwecken mal das JPanel mit dem BorderLayout als NORTH ausgeben lassen, das hat auch nicht funktioniert. Als letztes wollte ich es dann ganz primitiv Versuchen und mir die fps einfach in der Konsole ausgeben lassen "System.out.println("FPS: "+ fps)" doch selbst dass ging nicht :-( leider fällt mir jetzt nichts mehr ein, weiß einer von euch vielleicht was daran falsch ist.

Ich habe mir mal die Datei von dem Erzeuger des Tutorials angesehen aber der hat es genau so und die läuft bei mir auch nicht.
Bevor es vielleicht an dem ausführen liegt erkläre ich da meine Vorgehensweise vielleicht auch mal. Ich compiliere die *.java Datei mit: javac GamePanel.java
und lasse sie mit GamePanel.java dann ausführen.

Ich muss zugeben das Fenster habe ich auf "meine" Art erstellt aber das hat ja eigentlich nichts mit der Ausgabe zu tun, außerdem habe ich es auch schon mit dem Original Code versucht und dass ging auch schon nicht :-(

Hier mal mein Code:


```
import javax.swing.*;
import java.awt.*;


public class GamePanel extends JFrame implements Runnable{

    private static final long serialVersionUID = 1L;
    boolean game_running = true;
    
    

   
    long delta = 0;
    long last = 0;
    long fps = 0;

    

    public GamePanel(){

        super("GameDemo");
        setSize(800,600);
        setLocation(400,150);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        doInitialisierung();
       

        
    }

private void doInitialisierung(){

    last = System.nanoTime();

    Thread t = new Thread(this);
    t.start();
}

public void run() {

    while (game_running){

        computeDelta();

        repaint();

     try {
         Thread.sleep(10);
     }   catch (InterruptedException e) {}
    }

}

private void computeDelta(){

    delta = System.nanoTime() - last;
    last = System.nanoTime();

    fps = ((long) 1e9)/delta;

}


public void paintComponent (Graphics g) {

    super.paintComponents(g);


    g.setColor(Color.red);
    g.drawString("FPS: " + Long.toString(fps), 20, 10);
    System.out.println("FPS: " + fps);

}


    public static void main(String[] args){

        GamePanel game = new GamePanel();

        

        
    }



}
```


kann mir jemand sagen was daran falsch ist?

Dankeschön schon mal, liebe Grüße Matthias


----------



## Brayn (19. Mrz 2011)

ohhh sry. sry. sry. ich habs fast geschafft...

Jetzt gibts nur noch ein Problem: die Zahlen werden immer übereinander geschrieben und werden nicht gelöscht. Ich habe mir jetzt doch mal wieder die Methode von dem Programmierer vorgenommen, ich hatte das erste mal wohl etwas falsch gemacht, sry hoffentlich hab ich keinem Mühe gemacht ...

Hier nochmal der verbesserte Code, aber leider noch mit dem Problem dass die fps immer überschrieben werden.



```
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;

public class GamePanel extends JPanel implements Runnable {

    private static final long serialVersionUID = 1L;
    boolean game_running = true;
    long delta = 0;
    long last = 0;
    long fps = 0;

    public static void main(String[] args) {
        new GamePanel(800, 600);
    }

    public GamePanel(int w, int h) {
        this.setPreferredSize(new Dimension(w, h));
        this.setBackground(Color.cyan);
        JFrame frame = new JFrame("GameDemo");
        frame.setLocation(100, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
        doInitialisierung();
    }

    private void doInitialisierung() {

        last = System.nanoTime();

        Thread t = new Thread(this);
        t.start();
    }

    public void run() {

        while (game_running) {

            computeDelta();

            repaint();

            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
            }
        }

    }

    private void computeDelta() {

        delta = System.nanoTime() - last;
        last = System.nanoTime();

        fps = ((long) 1e9) / delta;

    }

    public void paintComponent(Graphics g) {

        super.paintComponents(g);

        g.setFont(new Font("Times New Roman", Font.BOLD, 60));
        g.setColor(Color.red);
        g.drawString("FPS: " + Long.toString(fps), 50, 50);

        //System.out.println("FPS: " + fps);

    }
}
```


kann mir dabei noch jemand weiterhelfen?

liebe Grüße Matthias


----------



## Eldorado (19. Mrz 2011)

Versuch mal statt 
	
	
	
	





```
super.paintComponents(g);
```


```
super.paintComponent(g);
```
 aufzurufen (Zeile 69)


----------



## Brayn (19. Mrz 2011)

Ja genau, dass wars  super danke schön.
(ohh jee sowas darf ja eigentlich nicht mehr passieren :-( )

liebe Grüße Matthias


----------



## Brayn (21. Mrz 2011)

Ok, da ich nun weiß dass man Spiele auch in Fenster Programmieren kann, so würde jede weitere Frage, was an meinem Code falsch ist usw. nicht mehr in diesen Thread gehören, somit beende ich den Thread und bedanke mich nochmal bei allen die mir geantwortet haben.

liebe Grüße Matthias


----------



## spyboot (21. Mrz 2011)

Runtime hat gesagt.:


> btw: Mit JavaScript kann man keine 3D Games machen



Da bist du nicht ganz auf der Höhe der Zeit.
Mit der neuen Browsergenerationen wird seit einiger Zeit eine Technologie eingeführt die sich WebGL nennt. Es existieren sogar bereits einige Javascript-3D-Engienes die sich WebGL zunutze machen. 
Sieh dir am besten mal folgenden Link an: Google Body


----------



## spyboot (21. Mrz 2011)

Irgendwie kann ich meinen Beitrag nicht mehr Editieren aber hier ist noch ein Link:
Chrome Experiments - WebGL Experiments


----------



## Brayn (22. Mrz 2011)

Ich wollte mir gerade deine Links ansehen, da hat mich dein erster Link darauf hingewiesen dass ich einen Browser mit WebGL unterstüzung brauche und mir den Firefox 4 Beta angeboten, den habe ich mir dann installiert, aber nach erneuten klickens zeigt er mir das gleiche Fenster und sagt ich hätte es immer noch nicht.
Kann es sein dass ich das WebGL erst aktivieren muss, ich hab mal sowas bei Google gelesen aber das gilt nur für die alten versionen von Mozilla. Wie ist es nun mit dem neuen? Wenn du keinen ausweg kennst, welchen Browser nutzt denn du?

lg Matthias


----------



## Gastredner (23. Mrz 2011)

Zumindest in der FF4 Beta und den RCs musste man webgl in about:config noch per Hand aktivieren. Der entsprechende Schlüssel heißt webgl.force_enabled.


----------

