LWJGL StackOverFlow Problem nach 30sekunden. (Pong)

BK117

Aktives Mitglied
Hey Leute, bin gerade dabei Pong zu programmieren.
Ich weiß nicht ob meine Frage hier richtig ist, oder unter "Allgemeine Java-Themen" aber ich denk mal, das geht so 😉
Ich beschäftige mich seid gestern mit openGL sodass ich da kaum Erfahrung habe.
Aber ich finde den Fehler einfach nicht.
Das Programm läuft ca 30sekunden und stürzt danach ab. Ich weiß nicht warum.
Vlt könnt ihr mir ja helfen 😉
Ich hab keine Ahnung, wo der StackOverFlow Error her kommt.
Tipp:
Steuerung mit W A S D und Pause ist p und weiter ist o.
Wenn ihr nur einseitig spielen wollt, dann drückt h.
Um dann wieder beide Seiten zu steuern, einfach j drücken.
Escape ist genauso wie das rote X für's direkte beenden.
Wenn man verloren hat, kann man mit o eine neue Runde beginnen oder halt normal beenden mit Escape bzw. dem roten X 🙂
Und es funktioniert die ersten 30 Sekunden eigentlich auch super. Aber danach ist schluss :/

Hoffe ihr findet den Fehler in dem Programmchaos 😀, ich bin solangsam nämlich ratlos :rtfm:
Java:
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
 
import static org.lwjgl.opengl.GL11.*;
 
public class PongKeyboard{

    boolean pause = false;
    int richtungv = (Math.random()<0.5)?0:1;        // 0 = runter // 1 = hoch  // 2+ = stop //
    int richtungh = (Math.random()<0.5)?0:1;        // 0 = rechts // 1 = links // 2+ = stop //
    int score = 0;
    int posx = 750;
    int posy = 400;
    double lpos = 400;
    int lposAus = 400;
    double rpos = 400;
    int rposAus = 400;
    int pongLaenge;
    int pongZwischen = 50;                          //PongLänge hier einstellen, NICHT bei pongLaenge!!! Sondern hier bei pongZwischen!!!
    boolean einseitig = false;
    int speed = 3;
    
//////MAIN
    public static void main(String[] args){
        new PongKeyboard();
    }
//////KONSTRUKTOR   
    public PongKeyboard(){
         try {
             Display.setDisplayMode(new DisplayMode(1500, 800));
             Display.setTitle("Pong");
             Display.create();
             Keyboard.create();
         }catch(LWJGLException e) {
             e.printStackTrace();
             Display.destroy();
             System.exit(1);
         }
         glMatrixMode(GL_PROJECTION);
         glOrtho(0, 1500, 800, 0, 1, -1);
         glMatrixMode(GL_MODELVIEW);
         
        durchführung();
    }
//////INIT
    public void init(){
    	pause = false;
        richtungv = (Math.random()<0.5)?0:1;        // 0 = runter // 1 = hoch  // 2+ = stop //
        richtungh = (Math.random()<0.5)?0:1;        // 0 = rechts // 1 = links // 2+ = stop //
    	score = 0;
    	posx = 750;
    	posy = 400;
    	pongZwischen = 50;
    	durchführung();
    }
//////DURCHFÜHRUNG  
    public void durchführung(){
        
        while(!pause){
            if(Display.isCloseRequested()){
            	if(score == 1){
                    System.err.println("Sie haben " + score + " Punkt erreicht!");
                }else{
                    System.err.println("Sie haben " + score + " Punkte erreicht!");
                }
            	Display.destroy();
            	System.exit(0);
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
                beenden();
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_P)){
                pause = true;
                pause();
            }
            pongLaenge = pongZwischen;
            pongLaenge = pongLaenge - score;
            if(pongLaenge < 5){
                pongLaenge = 5;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_W)){
                lpos -= 1 * speed;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_S)){
                lpos += 1 * speed;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_A)){
                rpos -= 1 * speed;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_D)){
                rpos += 1 * speed;
            }
            lposAus = (int) lpos;
            rposAus = (int) rpos;
            
            if(lposAus <= 0){
                lpos = 1;
                lposAus = 1;
            }else if(lposAus >= (795 - pongLaenge)){
                lpos = (794 - pongLaenge);
                lposAus = (794 - pongLaenge);
            }
            if(rposAus <= 0){
                rpos = 1;
                rposAus = 1;
            }else if(rposAus >= (795 - pongLaenge)){
                rpos = (794 - pongLaenge);
                rposAus = (int) rpos;
            }   
            if(richtungv == 0){
                posy = posy + 1 * speed;
            }else if(richtungv == 1){
                posy = posy - 1 * speed;
            }
            if(richtungh == 0){
                posx = posx + 1 * speed;
            }else if(richtungh == 1){
                posx = posx - 1 * speed;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_H)){
                einseitig = true;
            }if(Keyboard.isKeyDown(Keyboard.KEY_J)){
                einseitig = false;
            }if(einseitig){
                rpos = posy - (0.5 * pongLaenge);
            }
            richtungAendern();
            paint();
        }
    }
//////RICHTUNG  
    public void richtungAendern(){      
        if(posy >= 795){
            richtungv = 1;
        }else if(posy <= 0){
            richtungv = 0;
        }
        else if(posx <= 10 && ((posy-lposAus) < pongLaenge && (posy-lposAus) > 0)){
            richtungh = 0;
            score++;
        }else if(posx <= 10 && !((posy-lposAus) < pongLaenge && (posy-lposAus) > 0)){
            richtungh = 2;
            richtungv = 2;
            beenden();
        }
        else if(posx >= 1490 && ((posy-rposAus) < pongLaenge && (posy-rposAus) > 0)){
            richtungh = 1;
            if(!einseitig){
                score++;
            }
        }else if(posx >= 1490 && !((posy-rposAus) < pongLaenge && (posy-rposAus) > 0)){
            richtungh = 2;
            richtungv = 2;
            beenden();
        }
    }
//////PAUSE
    public void pause(){
        richtungv += 2;
        richtungh += 2;
        while(pause){
            Display.update();
            pause = !Keyboard.isKeyDown(Keyboard.KEY_O);
            if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) || Display.isCloseRequested()){
                beenden();
            }
        }
        richtungv -= 2;
        richtungh -= 2;
        pause = false;
        return;
    }
//////BEENDEN
    public void beenden(){
        if(score == 1){
            System.err.println("Sie haben " + score + " Punkt erreicht!");
        }else{
            System.err.println("Sie haben " + score + " Punkte erreicht!");
        }
        pause = true;
		while(pause){
			Display.update();
			if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) || Display.isCloseRequested()){
		        Display.destroy();
		        System.exit(0);
			}
			if(Keyboard.isKeyDown(Keyboard.KEY_O)){
				pause = false;
				init();
			}
		}
    }
//////PAINT
    public void paint(){
         glClear(GL_COLOR_BUFFER_BIT);
         
         glBegin(GL_QUADS); //LINKER PONG
            glColor3d(255, 255, 0);
            glVertex2i(5, lposAus);
            glVertex2i(10, lposAus);
            glVertex2i(10, lposAus+pongLaenge);
            glVertex2i(5, lposAus+pongLaenge);
         glEnd();
         glBegin(GL_QUADS); //RECHTER PONG
            glColor3d(255, 255, 0);
            glVertex2i(1490, rposAus);
            glVertex2i(1495, rposAus);
            glVertex2i(1495, rposAus+pongLaenge);
            glVertex2i(1490, rposAus+pongLaenge);
         glEnd();
         glBegin(GL_QUADS); //BALL
            glColor3d(255, 255, 255);
            glVertex2i(posx, posy);
            glVertex2i(posx+5, posy);
            glVertex2i(posx+5, posy+5);
            glVertex2i(posx, posy+5);
         glEnd();
         // TODO: SCORE ANZEIGE NOCH NICHT HIER EINGEFÜGT!!!
        Display.update();
        Display.sync(60);
        durchführung();
    }
}

Gruß BK
PS: Die score Anzeige fehlt noch, aber das mache ich noch 🙂
Irgendwie ist das Display durch Display.update(); überlastet glaube ich, aber in anderen Programmen funktioniert es ja eigentlich auch ohne Probleme :/
 
Zuletzt bearbeitet:
... Irgendwie ist das Display durch Display.update(); überlastet glaube ich, aber in anderen Programmen funktioniert es ja eigentlich auch ohne Probleme :/ ...
Java:
while ( true ) { // Game-Loop
	
	try   { Thread.sleep( 10 ); } // Delay
	catch ( Exception e ) { } // Try'n'Catch -Block
	
	doLogic(); // Spiel-Logik abarbeiten
	
	repaint(); // Screen neu zeichnen
	
}
 
Jepp, danke so ähnlich hab ichs jetzt auch behoben ^^
Also ich habe einfach aber simpel folgendes gemacht:
In Zeile 223 also:
[JAVA=223]durchführung();[/code]
bin ich ja zur durchführung gegangen, aber von der gehe ich ja wieder in paint();
Und von da wieder durchführung();
Dadurch überlagert sich das, weil ich dass dann doppelt erstellt habe, und in jedem Durchgang wieder und wieder.
Ich habe das jetzt einfach durch ein
[JAVA=223]return;[/code] ersetzt und alles geht 😀

Trotzdem danke.
Das einzige was jetzt noch fehlt ist die Score anzeige, aber ich weiß nicht, wie ich das am besten machen soll bei mir. Naja...
Trotzdem danke.
Wer dazu was weiß, kann gerne antworten. Aber die Hauptfrage wär dann ja geklärt 😉
Danke
 

Zurück
Oben