Pong Projekt mit LWJGL Klassen exportieren

BK117

Aktives Mitglied
Hallo, in Eclipse gibt es ja die Möglichkeit, Programme in einer jar File zu exportieren, und diese sozusagen ohne Eclipse starten zu können.
Hab ich auch schon oft gemacht und ist ja auch eine feine Sache.
Ich habe vor zwei Jahren mit einem Spiel angefangen, mit dem ich vor einigen Monaten schon fertig geworden bin. Allerdings gab es beim exportieren immer einen Fehler. Daher habe ich das immer durch Eclipse gespielt.
Undzwar nutzte ich die LWJGL Klassen, welche ich in den Properties -> Java Build Path -> Libraries auch hinzugefügt habe.
Das Programm funktioniert auch ohne Probleme. Jetzt habe ich in den letzten Jahren einiges dazugelernt, und würde es jetzt wohl mit mehreren Klassen und anders strukturiert machen.
Früher als ich damit angefangen habe, habe ich mich von der Objektorientierung an sich erstmal mehr oder weniger ferngehalten und alles in eine Klasse gepackt. Aber hey. Es funktioniert. Nur der Export funktioniert nicht obwohl ich auch die Option "Extract required libraries into generated JAR" aktiviert habe.

Könnt ihr mal nachschauen, woran das liegt?
Wenn euch das Spiel gefällt, könnt ihr das auch gerne für euch nutzten, nur gebt es bitte nicht so Preis, als ob es von euch wäre, oder ladet es wo anders hoch. Weil das ist mein ersten "größeres" Projekt und das bedeutet mir doch schon einiges.

Ich weiß, dass das für die geübten unter euch schon sehr unschön und unsauber Programmiert aussieht, aber ich wollte das jetzt nicht alles wieder ändern und solange es funktioniert lasse ich es so.

Java:
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.input.Controllers;
import org.lwjgl.input.Controller;
import org.lwjgl.input.Keyboard;
 
public class Pong{

	Controller controller;
    boolean pause = false;
    boolean tempPause = true;
    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 //
    byte scoreL = 0;
    byte scoreR = 0;
    byte scoreMax = 5;								//Punkteanzahl, die zum siegen benötigt wird
    int fensterX = 1340;							//Fensterbreite (xWert)
    int fensterY = 680;								//Fensterhöhe   (yWert)
    int pongLaengeL = 100;
    int pongLaengeR = 100;
    int pongVerkleinerung = (int) pongLaengeL / 20;
    boolean einseitig = false;
    int ballDicke = 15;
    int pongDicke = 15;
    int pongSeitenabstand = 35;
    int posx = (int) (fensterX / 2)-(ballDicke/2);
    int posy = (int) (fensterY / 2)-(ballDicke/2);
    double lpos = (fensterY / 2)-(pongLaengeL/2);
    int lposAus = (int) (fensterY / 2)-(pongLaengeL/2);
    double rpos = (fensterY / 2)-(pongLaengeR/2);
    int rposAus = (int) (fensterY / 2)-(pongLaengeR/2);
    long startTime = System.currentTimeMillis();
    long tempTime = System.currentTimeMillis() + 3000;
    double speedVerhältnisL = 0.6;	/*! <1.0 !*/	//Verhältnis Ball-Pong also [Ball*speedVerhältnis = pongSpeed]
    double speedVerhältnisR = 0.6;	/*! <1.0 !*/	//Verhältnis Ball-Pong also [Ball*speedVerhältnis = pongSpeed]
    byte speed = 10;
    boolean gegenComputer = true;
    boolean activeController = false;
    
//////KONSTRUKTOR   
    public Pong(){
         try {
             Display.setDisplayMode(new DisplayMode(fensterX, fensterY));
             Display.setTitle("Pong v3.2_2");
             Display.setVSyncEnabled(true);
             Display.setLocation(10, 10);
             Display.create();
             Keyboard.create();
         }catch(LWJGLException e) {
             e.printStackTrace();
             Display.destroy();
             Controllers.destroy();
             Keyboard.destroy();
             System.exit(-1);
         }
         if(activeController){
        	try {
            	Controllers.create();
           	 	controller = Controllers.getController(0);
         	}catch(Exception e) {
         		activeController = false;
            	System.out.println("Controller wurde nicht gefunden!");
         	}
			if(activeController){
				speedVerhältnisL = 0.7;
				speedVerhältnisR = 0.7;
			}
         }
         GL11.glMatrixMode(GL11.GL_PROJECTION);
         GL11.glLoadIdentity();
         GL11.glOrtho(0, fensterX, 0, fensterY, 1, -1);
         GL11.glMatrixMode(GL11.GL_MODELVIEW);
        
         durchführung();
    }
//////INIT
    public void init(){
    	startTime = System.currentTimeMillis();
        tempTime = System.currentTimeMillis() + 3000;
    	tempPause = true;
    	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 //
    	scoreR = 0;
    	scoreL = 0;
    	posx = (int) (fensterX / 2)-(ballDicke/2);
    	posy = (int) (fensterY / 2)-(ballDicke/2);
    	durchführung();
    }
//////DURCHFÜHRUNG  
    public void durchführung(){
    	startTime = System.currentTimeMillis();
        tempTime = System.currentTimeMillis() + 3000;
        
        while(!pause){
        	startsequenz();
        	input();
            wandBerechnung();
            ballBewegung();
            einseitig();
            richtungAendern();
            paint();
        }
    }
//////STARTSEQUENZ
    public void startsequenz(){
    	if(((startTime + 1000) <= System.currentTimeMillis()) && ((startTime + 2000) >= System.currentTimeMillis())) {
    		scoreR = 3;
    		scoreL = 3;
    		tempPause = true;
    		einseitig = false;
    	}if(((startTime + 2000) <= System.currentTimeMillis()) && ((startTime + 3000) >= System.currentTimeMillis())) {
    		scoreR = 2;
    		scoreL = 2;
    		tempPause = true;
    	}if(((startTime + 3000) <= System.currentTimeMillis()) && ((startTime + 4000) >= System.currentTimeMillis())) {
    		scoreR = 1;
    		scoreL = 1;
    		tempPause = true;
    	}if(((startTime + 4000) <= System.currentTimeMillis()) && ((startTime + 5000) >= System.currentTimeMillis())) {
    		scoreR = 0;
    		scoreL = 0;
    		tempPause = false;
			if(gegenComputer == true){
				speedVerhältnisR = 0.9;
				einseitig = true;
			}else{
				einseitig = false;
			}
    	}
    	if((tempTime + 1000) >= System.currentTimeMillis()){
    		tempPause = true;
    	}else{
    		tempPause = false;
    	}
    }
//////INPUT
    public void input(){
    	if(Display.isCloseRequested()){
    		Display.destroy();
            Controllers.destroy();
            Keyboard.destroy();
        	System.exit(0);
        }
    	if(activeController){
    		if(controller.isButtonPressed(0)){
        		Display.destroy();
            	Controllers.destroy();
            	Keyboard.destroy();
	        	System.exit(0);
        	}
        	while(Controllers.next()){
        		if(Controllers.getEventButtonState()){
        			if(Controllers.getEventButtonState() == controller.isButtonPressed(1)){
        				pause = true;
        				pause();
        			}
        		}
        	}
        	controller.poll();
        	lpos -= controller.getAxisValue(0) * speed * speedVerhältnisL;
        	lposAus = (int) lpos;
			if(!einseitig){
				rpos -= controller.getAxisValue(1) * speed * speedVerhältnisR;
				rposAus = (int) rpos;
			}
    	}else{
    		if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
    	        Display.destroy();
    	        Keyboard.destroy();
    	        Controllers.destroy();
    	        System.exit(0);
            }
            while (Keyboard.next()) {
    				if (Keyboard.getEventKeyState()) {
    					if (Keyboard.getEventKey() == Keyboard.KEY_P) {
    						pause = true;
    						pause();
    					}
    				}
            }
            
            if(Keyboard.isKeyDown(Keyboard.KEY_W) || Keyboard.isKeyDown(Keyboard.KEY_LEFT)){
                lpos += 1 * speed*speedVerhältnisL;
            }
            if(Keyboard.isKeyDown(Keyboard.KEY_S) || Keyboard.isKeyDown(Keyboard.KEY_RIGHT)){
                lpos -= 1 * speed*speedVerhältnisL;
            }
            if(!einseitig){
            	if(Keyboard.isKeyDown(Keyboard.KEY_A) || Keyboard.isKeyDown(Keyboard.KEY_UP)){
            		rpos += 1 * speed*speedVerhältnisR;
            	}
            	if(Keyboard.isKeyDown(Keyboard.KEY_D) || Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
            		rpos -= 1 * speed*speedVerhältnisR;
            	}
            }
    	}
        lposAus = (int) lpos;
        rposAus = (int) rpos;
    }
//////WAND BERECHNUNG
    public void wandBerechnung(){
    	if(lposAus <= -1){
            lpos = 0;
            lposAus = 0;
        }else if(lposAus >= ((fensterY+1) - pongLaengeL + (scoreL*pongVerkleinerung))){
            lpos = (fensterY - pongLaengeL + (scoreL*pongVerkleinerung));
            lposAus = (int) lpos;
        }
        if(rposAus <= -1){
            rpos = 0;
            rposAus = 0;
        }else if(rposAus >= ((fensterY+1) - pongLaengeR + (scoreR*pongVerkleinerung))){
            rpos = (fensterY - pongLaengeR + (scoreR*pongVerkleinerung));
            rposAus = (int) rpos;
        }
    }
//////BALL BEWEGUNG
    public void ballBewegung(){
    	if(!tempPause){
			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;
			}
		}
    }
//////EINSEITIG
    public void einseitig(){
    	if(einseitig){
        	//rpos = posy - (0.5 * pongLaenge);
        	if((rpos + (0.5 * (pongLaengeR - (scoreR*pongVerkleinerung)))) - (posy + (0.5 * ballDicke)) > speed){
        		rpos -= 1 * speed*speedVerhältnisR;
        	}else if((rpos + (0.5 * pongLaengeR - (scoreR*pongVerkleinerung))) - (posy + (0.5 * ballDicke)) < -speed){
        		rpos += 1 * speed*speedVerhältnisR;
        	}
			rposAus = (int) rpos;
        }
    }
//////RICHTUNG  
    public void richtungAendern(){      
        if(posy >= (fensterY -ballDicke)){
            richtungv = 1;
        }else if(posy <= 0){
            richtungv = 0;
        }
        else if(posx <= (pongSeitenabstand+pongDicke) && ((posy-lposAus) < (pongLaengeL-(scoreL*pongVerkleinerung)) && (posy-lposAus) > -ballDicke)){
            richtungh = 0;
        }else if(posx <= (pongSeitenabstand+pongDicke) && !((posy-lposAus) < (pongLaengeL-(scoreL*pongVerkleinerung)) && (posy-lposAus) > -ballDicke)){
            richtungh = 0;
            scoreR++;
            tempPause = true;
            tempTime = System.currentTimeMillis();
        	posx = (int) (fensterX / 2)-(ballDicke/2);
        	if((scoreL >= scoreMax) || (scoreR >= scoreMax)){
        		paint();
        		beenden();
        	}
        }
        else if(posx >= (fensterX - (pongSeitenabstand+pongDicke+ballDicke)) && ((posy-rposAus) < (pongLaengeR-(scoreR*pongVerkleinerung)) && (posy-rposAus) > -ballDicke)){
            richtungh = 1;
        }else if(posx >= (fensterX - (pongSeitenabstand+pongDicke+ballDicke)) && !((posy-rposAus) < (pongLaengeR-(scoreR*pongVerkleinerung)) && (posy-rposAus) > -ballDicke)){
            richtungh = 1;
            scoreL++;
            tempPause = true;
            tempTime = System.currentTimeMillis();
        	posx = (int) (fensterX / 2)-(ballDicke/2);
        	if((scoreL >= scoreMax) || (scoreR >= scoreMax)){
        		paint();
        		beenden();
        	}
        }
    }
//////PAINT
    public void paint(){
    	GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    	GL11.glLoadIdentity();
    	//LINKER PONG
    	GL11.glBegin(GL11.GL_QUADS); 
			if(scoreL==5){
			GL11.glColor3f(0.0f, 1.0f, 0.0f);
			}else if(scoreR==5){
			GL11.glColor3f(1.0f, 0.0f, 0.0f);
			}else{
			GL11.glColor3f(1.0f, 1.0f, 1.0f);
			}
			GL11.glVertex2i(pongSeitenabstand, lposAus);
			GL11.glVertex2i(pongSeitenabstand+pongDicke, lposAus);
			GL11.glVertex2i(pongSeitenabstand+pongDicke, lposAus+pongLaengeL-(scoreL*pongVerkleinerung));
			GL11.glVertex2i(pongSeitenabstand, lposAus+pongLaengeL-(scoreL*pongVerkleinerung));
		GL11.glEnd();
		//RECHTER PONG
		GL11.glBegin(GL11.GL_QUADS); 
			if(scoreR==5){
			GL11.glColor3f(0.0f, 1.0f, 0.0f);
			}else if(scoreL==5){
			GL11.glColor3f(1.0f, 0.0f, 0.0f);
			}else{
			GL11.glColor3f(1.0f, 1.0f, 1.0f);
			}
			GL11.glVertex2i((fensterX - (pongSeitenabstand+pongDicke)), rposAus);
			GL11.glVertex2i((fensterX - pongSeitenabstand), rposAus);
			GL11.glVertex2i((fensterX - pongSeitenabstand), rposAus+pongLaengeR-(scoreR*pongVerkleinerung));
			GL11.glVertex2i((fensterX - (pongSeitenabstand+pongDicke)), rposAus+pongLaengeR-(scoreR*pongVerkleinerung));
		GL11.glEnd();
		//BALL
		GL11.glBegin(GL11.GL_QUADS); 
			GL11.glColor3f(1.0f, 1.0f, 1.0f);
			GL11.glVertex2i(posx, posy);
			GL11.glVertex2i(posx+ballDicke, posy);
			GL11.glVertex2i(posx+ballDicke, posy+ballDicke);
			GL11.glVertex2i(posx, posy+ballDicke);
		GL11.glEnd();
		//MITTELLINIE
		GL11.glBegin(GL11.GL_QUADS); 
    		GL11.glColor3f(1.0f,1.0f,1.0f);
    		GL11.glVertex2i((fensterX/2)-1, fensterY);
    		GL11.glVertex2i((fensterX/2)+1, fensterY);
    		GL11.glVertex2i((fensterX/2)+1, 0);
    		GL11.glVertex2i((fensterX/2)-1, 0);
    	GL11.glEnd();
    	//HINTERGRUNDFARBE
        GL11.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        //TEXT ANZEIGE
		GL11.glColor3d(255, 255, 255); 
        drawString(scoreL+"", 50, fensterY - 50);
        drawString(scoreR+"", fensterX - 50, fensterY - 50);
        Display.update();
        Display.sync(60);
        return;
    }
//////TEXT
	public static void drawString(String s, int x, int y){
		int startX = x;
		GL11.glBegin(GL11.GL_POINTS);
		for(char c : s.toLowerCase().toCharArray()){
			if(c == '0'){
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+1, y+i);
					GL11.glVertex2f(x+7, y+i);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y+8);
					GL11.glVertex2f(x+i, y+0);
				}
				x+=8;
			}else if(c == '1'){
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y);
				}
				for(int i=1;i<=8;i++){
					GL11.glVertex2f(x+4, y+i);
				}
				GL11.glVertex2f(x+3, y+7);
				x += 8;
			}else if(c == '2'){
				for(int i=1;i<=6;i++){
					GL11.glVertex2f(x+i, y);
				}
				for(int i=2;i<=5;i++){
					GL11.glVertex2f(x+i, y+8);
				}
				GL11.glVertex2f(x+1, y+7);
				GL11.glVertex2f(x+1, y+6);
				
				GL11.glVertex2f(x+6, y+7);
				GL11.glVertex2f(x+6, y+6);
				GL11.glVertex2f(x+6, y+5);
				GL11.glVertex2f(x+5, y+4);
				GL11.glVertex2f(x+4, y+3);
				GL11.glVertex2f(x+3, y+2);
				GL11.glVertex2f(x+2, y+1);
				x += 8;
			}else if(c == '3'){
				for(int i=1;i<=5;i++){
					GL11.glVertex2f(x+i, y+8);
					GL11.glVertex2f(x+i, y);
				}
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+6, y+i);
				}
				for(int i=2;i<=5;i++){
					GL11.glVertex2f(x+i, y+4);
				}
				x += 8;
			}else if(c == '4'){
				for(int i=2;i<=8;i++){
					GL11.glVertex2f(x+1, y+i);
				}
				for(int i=2;i<=7;i++){
					GL11.glVertex2f(x+i, y+1);
				}
				for(int i=0;i<=4;i++){
					GL11.glVertex2f(x+4, y+i);
				}
				x+=8;
			}else if(c == '5'){
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+i, y+8);
				}
				for(int i=4;i<=7;i++){
					GL11.glVertex2f(x+1, y+i);
				}
				GL11.glVertex2f(x+1, y+1);
				GL11.glVertex2f(x+2, y);
				GL11.glVertex2f(x+3, y);
				GL11.glVertex2f(x+4, y);
				GL11.glVertex2f(x+5, y);
				GL11.glVertex2f(x+6, y);
				
				GL11.glVertex2f(x+7, y+1);
				GL11.glVertex2f(x+7, y+2);
				GL11.glVertex2f(x+7, y+3);
				
				GL11.glVertex2f(x+6, y+4);
				GL11.glVertex2f(x+5, y+4);
				GL11.glVertex2f(x+4, y+4);
				GL11.glVertex2f(x+3, y+4);
				GL11.glVertex2f(x+2, y+4);
				x += 8;
			}else if(c == '6'){
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+1, y+i);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y);
				}
				for(int i=2;i<=5;i++){
					GL11.glVertex2f(x+i, y+4);
					GL11.glVertex2f(x+i, y+8);
				}
				GL11.glVertex2f(x+7, y+1);
				GL11.glVertex2f(x+7, y+2);
				GL11.glVertex2f(x+7, y+3);
				GL11.glVertex2f(x+6, y+4);
				x+=8;
			}else if(c == '7'){
				for(int i=0;i<=7;i++)
					GL11.glVertex2f(x+i, y+8);
				GL11.glVertex2f(x+7, y+7);
				GL11.glVertex2f(x+7, y+6);
				
				GL11.glVertex2f(x+6, y+5);
				GL11.glVertex2f(x+5, y+4);
				GL11.glVertex2f(x+4, y+3);
				GL11.glVertex2f(x+3, y+2);
				GL11.glVertex2f(x+2, y+1);
				GL11.glVertex2f(x+1, y);
				x+=8;
			}else if(c == '8'){
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+1, y+i);
					GL11.glVertex2f(x+7, y+i);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y+8);
					GL11.glVertex2f(x+i, y+0);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y+4);
				}
				x += 8;
			}else if(c == '9'){
				for(int i=1;i<=7;i++){
					GL11.glVertex2f(x+7, y+i);
				}
				for(int i=5;i<=7;i++){
					GL11.glVertex2f(x+1, y+i);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y+8);
					GL11.glVertex2f(x+i, y+0);
				}
				for(int i=2;i<=6;i++){
					GL11.glVertex2f(x+i, y+4);
				}
				GL11.glVertex2f(x+1, y+0);
				x += 8;
			}else if(c == '.'){
				GL11.glVertex2f(x+1, y);
				x+=2;
			}else if(c == ','){
				GL11.glVertex2f(x+1, y);
				GL11.glVertex2f(x+1, y+1);
				x+=2;
			}else if(c == '\n'){
				y-=10;
				x = startX;
			}else if(c == ' '){
				x += 8;
			}
		}
		GL11.glEnd();
	}
//////PAUSE
    public void pause(){
        richtungv += 2;
        richtungh += 2;
        while(pause){
            Display.update();
            if(activeController){
            	while(Controllers.next()){
            		if(Controllers.getEventButtonState()){
            			if(Controllers.getEventButtonState() == controller.isButtonPressed(1)){
            				pause = false;
            			}
            		}
            	}
            	if(controller.isButtonPressed(0)){
            	 	Display.destroy();
                 	Controllers.destroy();
                 	Keyboard.destroy();
                 	System.exit(0);
            	}
            	if(Display.isCloseRequested()){
            	 	Display.destroy();
                 	Controllers.destroy();
                 	Keyboard.destroy();
                 	System.exit(0);
            	}
            }else{
            	 while (Keyboard.next()) {
     				if (Keyboard.getEventKeyState()) {
     					if (Keyboard.getEventKey() == Keyboard.KEY_P) {
     						pause = false;
     					}
     				}
               }
               if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){
     		        Display.destroy();
                     Controllers.destroy();
     		        Keyboard.destroy();
     		        System.exit(0);
               }
               if(Display.isCloseRequested()){
     		        Display.destroy();
                     Controllers.destroy();
     		        Keyboard.destroy();
     		        System.exit(0);
               }	
            }
            paint();
        }
        richtungv -= 2;
        richtungh -= 2;
        pause = false;
        return;
    }
//////BEENDEN
    public void beenden(){
    	if(scoreL > scoreR)System.err.println("Spieler 1 hat gewonnen!");
    	if(scoreL < scoreR)System.err.println("Spieler 2 hat gewonnen!");
    	if(scoreL == scoreR)System.err.println("Unentschieden!");
        pause = true;
		while(pause){
			Display.update();
			if(activeController){
				if(controller.isButtonPressed(0) || Display.isCloseRequested()){
				 	Display.destroy();
	             	Controllers.destroy();
	             	Keyboard.destroy();
	             	System.exit(0);
				}
            	while(Controllers.next()){
            		if(Controllers.getEventButtonState()){
            			if(Controllers.getEventButtonState() == controller.isButtonPressed(1)){
            				pause = false;
            				init();
            			}
            		}
            	}
			}else{
				if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE) || Display.isCloseRequested()){
					Display.destroy();
		            Controllers.destroy();
				    Keyboard.destroy();
				    System.exit(0);
				}
			    while (Keyboard.next()) {
			    	if (Keyboard.getEventKeyState()) {
			    		if (Keyboard.getEventKey() == Keyboard.KEY_P) {
			        		pause = false;
							init();
						}
					}
			    }
			}
		}
    }
//////MAIN
    public static void main(String[] args){
        new Pong();
    }
}
Die beiden unteren Variablen "activeController" und "gegenComputer" sind halt dafür da, ob ihr nen Joystick nutzen wollt, oder die Tastatur (WASD oder Pfeiltasten(aber Seitenvertausch zu WASD)) und ob ihr gegen den Computer spielen wollt, oder ob eine zweite Person den rechten Pong mit den Pfeiltasten hoch/runter steuert und die erste Person mit W/S.
Ein Spiel hat 5 Runden und P = Pause und Restart(wenn Spiel vorbei), ESC zum Beenden.

Wenn ihr das so testet, dann seht ihr das alles klappt, BIS AUF DAS EXPORTIEREN in ein jar-File. Ich hoffe ihr findet den Fehler. Wie gesagt, die LWJGL Klassen werden benötigt.
d1bcdbb014.png

Es kommt ja auch kein Fehler. Er erstellt die Datei, aber beim draufklicken passiert NICHTS.

Danke,
Gruß BK
 

BRoll

Bekanntes Mitglied
Ich denke das Problem sind die natives die man bei lwjgl mit einbinden muss.
Habe dafür dann immer eine Bat Datei oder ähnliches genommen um die Jar zu starten,
und die Natives zu verlinken. Zum Beispiel so:

java -Djava.library.path=%~dp0/natives -jar Game.jar
 

BK117

Aktives Mitglied
Danke erstmal,
Heißt das dann also, dass man die natives nicht so in das Projekt implementieren kann, dass das von Eclipse mit in die JAR-Datei exportiert wird, und somit ein Klick auf die exportierte Datei zum Starten genügt?
 

BRoll

Bekanntes Mitglied
Hmm bin mir da ehrlich gesagt nicht sicher. Ich weiß nicht mehr ob es nicht ging oder ich es nur nicht hinbekommen hab. Letzendlich hab ich mich auf die Struktur geeinigt, dass ich für libs und natives jeweils einen ordner im projekt mach, die dann später im deploy
auch neben der Jar liegen. Dann mit den Parametern über den launcher gesetzt und fertig. (Dadurch reichts auch wenn man nur die eigentliche spiel logik in der jar exportiert, und nicht immer alle libs mitpacken muss wenn man was ändert).
Hauptsächlich habe ich das aber auch wegen Winrun4j gemacht, damit kann man sich ganz einfach über eine konfig (in der man die jar und die natives/lib folder angibt) einen Exe launcher erstellen. Kann ich nur empfehlen, ansonsten kannst du ja einfach ein bisschen rumprobieren was dir besser gefällt : )
 

BK117

Aktives Mitglied
Ok, weil ich glaube ich habe die Natives Korrekt eingefügt:
ea7661bdff.png

Oder muss da noch was anderes hin?

@BRoll: Danke, ich schau mir das mal an.
 

BRoll

Bekanntes Mitglied
Also wenn du bei native library location auf edit klickst, kannst du anstatt einen pfad auch relativ angeben
(wenn die natives im projektpfad drin sind) dann musst du bei der auswahl auf "workspace" klicken und den ordner auswählen.
 

BK117

Aktives Mitglied
Ok, das versuche ich auch mal.
Habe übrigens dieses Video hier gefunden. Aber auch das geht nicht. ^^
[video=youtube;K6K2d6LGvu8]https://www.youtube.com/watch?v=K6K2d6LGvu8[/video]
Keine Ahnung warum.
 

BRoll

Bekanntes Mitglied
Hmm ich find mit Winrun4j gehts viel einfacher.
Musste einfach runterladen, die exe in dein deploy-projekt reinkopieren und eine config erstellen.
Zb. siehts bei mir jetzt so aus in meinem Ordner:
> Libs-Ordner
> Natives-Ordner
> Game.ini
> Game.exe
> Game.jar

Die jar ist ganz normal exportiert aus Eclipse.
Die exe kopiert man aus dem Winrun4j Ordner raus und benennt sie einfach um.
Meine config Einstellung (Game.ini) sieht so aus:

main.class=com.projekt.Game
classpath.1=*.jar
classpath.2=libs/*.jar
vmarg.1=-Djava.library.path=%INI_DIR%/natives
log.overwrite=true
log=errorLog.txt
service.name=Game Test
service.description=Game Test


Funktioniert auch einwandfrei, und für die Exe kann man noch ein eigenes Icon setzen : )
 
Zuletzt bearbeitet:

BK117

Aktives Mitglied
Ok, danke. Probiere es gerade aus.
Welche dieser exe Dateien meinst du denn?
87fdfa3f85.png


EDIT: Habs mit der WinRun4J64.exe versucht und tatsächlich.... ES KLAPPT!!!

DANKE.
Und jetzt die letztendlich Frage:
Das kann man jetzt nicht in EINE Datei packen, oder?
 
Zuletzt bearbeitet:

BRoll

Bekanntes Mitglied
Doch: Einfach deinen gesamten Ordner zippen xD
Also das ganze Verfahren soll ja eben verhindern dass alles in eine Datei reingestopft wird.
Dazu müsstest du dann andere Verfahren verwenden, Winrun4j ist nur ein Launcher.
Es gibt Programme die können dein ganzes jar in eine exe packen, aber das ist auf jeden fall
komplizierter als das hier.
 

BK117

Aktives Mitglied
Ok, danke. Kannst du mir erklären, wofür die anderen EXE-Dateien in dem Ordner sind? Also wann ich die bräuchte?

Gruß BK
 

BK117

Aktives Mitglied
Und noch was. :D Braucht man zum Ausführen dann noch Java? Also ich habe es so oder so installiert, aber wenn ich das Programm zum Beispiel an andere weitergeben möchte, die KEIN Java installiert haben, können die das trotzdem ausführen? Also übernimmt Winrun4J das auch, oder muss Java (zumindest die JRE) installiert sein.

Danke schonmal.
 

BRoll

Bekanntes Mitglied
Java muss installiert sein ! Es gibt andere Wrapper die Java mit in das Projekt packen können,
das braucht dann aber viel mehr Speicherplatz und ist wieder komplizierter.
Die Winrun4j.exe sind die Starter (einmal 32 und 64 bit) und die RCEDIT sind zum ändern
von Attributen der Starter-exe, zb. um das Icon auszutauschen mit einem eigenen Bild.
Ansonsten schau doch einfach auf der offiziellen Seite, da ist alles erklärt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Ping Pong Ball abprallen lassen AWT, Swing, JavaFX & SWT 1
S AWT Pong - Probleme mit übergreifenden Objekten && Graphics2D AWT, Swing, JavaFX & SWT 3
J AWT Pong AWT, Swing, JavaFX & SWT 6
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
L FX-Projekt: fast leere Fensterausgabe ohne Fehlermeldung AWT, Swing, JavaFX & SWT 6
N JavaFX Projekt nachträglich zu JavaFX Application machen? AWT, Swing, JavaFX & SWT 1
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
VPChief Eclipse: Projekt mit src ordner exportieren. AWT, Swing, JavaFX & SWT 76
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
ZH1896ZH MineSweeper Projekt: Testen nicht möglich AWT, Swing, JavaFX & SWT 6
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4
M Java Gui Projekt, Würfelspiel AWT, Swing, JavaFX & SWT 2
Sam96 JavaFX mit Sqlite Projekt mit jar zu groß AWT, Swing, JavaFX & SWT 10
A Wie baue ich das Bus-System in ein Java Projekt ein? AWT, Swing, JavaFX & SWT 5
C Hilfe beim programmieren mit studiumgebundenes Projekt AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Projekt-Struktur AWT, Swing, JavaFX & SWT 2
S Projekt: Meisterschaft - Abspeichern bereits gemachter Schritte AWT, Swing, JavaFX & SWT 2
M JavaFX MSI oder EXE aus JavaFX Projekt erstellen? AWT, Swing, JavaFX & SWT 2
Birke Swing Neue Swing LayoutManager: TOnion Projekt AWT, Swing, JavaFX & SWT 10
R JavaFX Mein SceneBuilder Projekt AWT, Swing, JavaFX & SWT 3
D Ambitioniertes Projekt - Brauche Stichworte AWT, Swing, JavaFX & SWT 4
M GUI-Projekt realisieren AWT, Swing, JavaFX & SWT 9
J Swing Window-Builder-Projekt richtig übertragen AWT, Swing, JavaFX & SWT 2
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
D Java Projekt als Jar AWT, Swing, JavaFX & SWT 3
J jme neues projekt öffnen AWT, Swing, JavaFX & SWT 4
J Projekt Olympische Spiele AWT, Swing, JavaFX & SWT 12
F Netbeans Gui in BlueJ Projekt AWT, Swing, JavaFX & SWT 9
X Resourcen in Projekt einbinden AWT, Swing, JavaFX & SWT 7
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D Swing MVC in Projekt umsetzen AWT, Swing, JavaFX & SWT 71
D Swing Projekt Herangehensweise Swing AWT, Swing, JavaFX & SWT 6
N Swing Projekt - jar ausführen AWT, Swing, JavaFX & SWT 11
C Problem mit Swing Application Framework - Projekt beim AWT, Swing, JavaFX & SWT 2
W netbeans projekt in Eclipse importieren -gui teil geht nicht AWT, Swing, JavaFX & SWT 5
C Mein erstes kleines Swing-Projekt - Probleme AWT, Swing, JavaFX & SWT 8
M Einstellung des Projekt-Verzeichnis in NetBeans AWT, Swing, JavaFX & SWT 4
T Projekt - ChatClient - JEditorPane - Smilies, Vektor AWT, Swing, JavaFX & SWT 2
D Events, Listener, GUI . Größeres Projekt AWT, Swing, JavaFX & SWT 4
M java projekt als exe kompilieren. AWT, Swing, JavaFX & SWT 2
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
R 2D-Grafik Buttons mit Slick2D und LWJGL AWT, Swing, JavaFX & SWT 2
X AWT Graphics2D zum LWJGL Display hinzufügen aber wie? AWT, Swing, JavaFX & SWT 4
E 3D-Grafik LWJGl OpenGL Version vor Erstellung des Displays abfragen AWT, Swing, JavaFX & SWT 2
B OpenGl lwjgl Verständnisproblem AWT, Swing, JavaFX & SWT 5
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
Luk10 [LWJGL] VBOs und deprecated GL15 AWT, Swing, JavaFX & SWT 11
T [LWJGL] Depth-Test? AWT, Swing, JavaFX & SWT 2
T [LWJGL] mehrere Displays? AWT, Swing, JavaFX & SWT 19
Luk10 (LWJGL) Problem mit dem .frag Shader AWT, Swing, JavaFX & SWT 5
Luk10 (LWJGL) Fragen zu VBOs AWT, Swing, JavaFX & SWT 21

Ähnliche Java Themen

Neue Themen


Oben