Hi
Einleitung
Nach dem ich nun bereits seit ca. einem Jahr lerne Java Spiele zu programmiere (Snake, Tetris und die Anfänge eines popeligen RPG's laufen bereits), hab ich mich entschieden das ganze ein wenig profesioneller anzugehen und mich einmal an der LWJGL 2 zu versuchen.
Dazu habe ich auch einige super Youtube Tutorials gefunden:
z.B.
Oskar Veerhoek macht englische Tutorials für die LWJGL, vielleicht hilft das anderen Einsteigern.
Idee
Um das erlernte anzuwenden und zu verstehen wollte ich mich vorerst an ein einfacheres Projekt machen. Da ich mich vor allem für die 2D Programmierung interssiere (vorerst
) , habe ich mir zum Ziel gesetzt eine Art Space Invaders zu programmieren (also eins dieser von-links-nach-rechts-flieg-Raumschiff-abballer-Spiele - die nennt man doch so oder
?)
Problem
Vorerst scheitere ich leider noch ein wenig an der Anzeige meiner Sprites (also der animationbilder) meiner Raumschiffe (das Game steckt also noch mehr als in der Anfangsphase).
Um die einzelnen Sprites auf dem Bildschirm anzuzeigen benutze ich Texturen.
Ich würde nun gerne mein Raumschiff vor einem Hintergrund rendern (siehe Beispiel)
Das Resultat sieht jedoch eher so aus:
Die Transparenz des Raumschiffes wird also nicht erkannt und durch die schwarze Hintergrundgrafik ersetzt.
Ich hab jetzt schon ne ganze Weile rumgesucht und find die Lösung nicht... Da ich was die LWJGL angeht noch ein absoluter Neuling bin, such ich jedoch vielleicht nach den falschen Begriffen...
Der Code mit dem das Ganze programmiert wurde:
Computer: Windows 7, 64bit
Java: jdk 1.8.060, jre 1.8.0_65
LWJGL: 2.9.3
Die Klasse Launcher
(hier befindet sich die Main methode)
Startet die Anwendung, hier kann ich bestimmen wie gross das Fenster werden soll:
Die Klasse GameMainLoop
Hier wird das Fenster erstellt und die anzeige ausprogrammiert (wird später in weitere Klassen ausgelagert).
So da seht ihr mein Problem
.
Gibt es unter euch LWJGL - Heros die gewillt sind mir zu helfen, das wäre super.
Fehlende Informationen gebe ich euch gerne noch in weiteren Nachrichten!
Vielen Dank im Voraus
lg Saturn91/Manuel
Einleitung
Nach dem ich nun bereits seit ca. einem Jahr lerne Java Spiele zu programmiere (Snake, Tetris und die Anfänge eines popeligen RPG's laufen bereits), hab ich mich entschieden das ganze ein wenig profesioneller anzugehen und mich einmal an der LWJGL 2 zu versuchen.
Dazu habe ich auch einige super Youtube Tutorials gefunden:
z.B.
Idee
Um das erlernte anzuwenden und zu verstehen wollte ich mich vorerst an ein einfacheres Projekt machen. Da ich mich vor allem für die 2D Programmierung interssiere (vorerst
Problem
Vorerst scheitere ich leider noch ein wenig an der Anzeige meiner Sprites (also der animationbilder) meiner Raumschiffe (das Game steckt also noch mehr als in der Anfangsphase).
Um die einzelnen Sprites auf dem Bildschirm anzuzeigen benutze ich Texturen.
Ich würde nun gerne mein Raumschiff vor einem Hintergrund rendern (siehe Beispiel)

Das Resultat sieht jedoch eher so aus:
Die Transparenz des Raumschiffes wird also nicht erkannt und durch die schwarze Hintergrundgrafik ersetzt.

Ich hab jetzt schon ne ganze Weile rumgesucht und find die Lösung nicht... Da ich was die LWJGL angeht noch ein absoluter Neuling bin, such ich jedoch vielleicht nach den falschen Begriffen...
Der Code mit dem das Ganze programmiert wurde:
Computer: Windows 7, 64bit
Java: jdk 1.8.060, jre 1.8.0_65
LWJGL: 2.9.3
Die Klasse Launcher
(hier befindet sich die Main methode)
Startet die Anwendung, hier kann ich bestimmen wie gross das Fenster werden soll:
Java:
package Game;
import java.awt.Dimension;
import java.awt.Toolkit;
public class Launcher {
private static int width;
private static int height;
private static Dimension screenSize;
public static void main(String[] args){
//für fullscreen
//setFullscreen();
//für Window
setWindowSize(1250, 750);
GameMainLoop game = new GameMainLoop("ErathWarper"); //instanz of game erstellen
}
public static void setFullscreen(){
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
width = (int) screenSize.getWidth();
height = (int) screenSize.getHeight(); //width = 1920:1080 at my PC
}
public static void setWindowSize(int x_width, int y_height){
width = x_width;
height = y_height;
screenSize = new Dimension(x_width, y_height);
}
public static Dimension getScreenSize() {
return screenSize;
}
}
Die Klasse GameMainLoop
Hier wird das Fenster erstellt und die anzeige ausprogrammiert (wird später in weitere Klassen ausgelagert).
Java:
package Game;
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.opengl.*;
import org.lwjgl.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
public class GameMainLoop {
//time calculation variables
private long lastFrame;
long TimeDelta = 0;
int ticks = 0;
long biggestDelta = 0;
private Texture spaceShip;
private Texture background;
//initialisize Textures
public GameMainLoop(String title){
buildDisplay(title);
initOpenGL();
initGraphics();
//initialisize the timer
lastFrame = getTime();
while(!Display.isCloseRequested()){
printTickLine();
render(getDelta());
tick();
Display.update();
Display.sync(60); //sets the framerate to 60!
}
Display.destroy();
}
// ***************************initialisation Methodes*************************************************************************************
private void buildDisplay(String title){
try {
Display.setDisplayMode(new DisplayMode(Launcher.getScreenSize().width, Launcher.getScreenSize().height));
Display.setTitle(title);
Display.create();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initOpenGL(){
//initialisize openGL
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Launcher.getScreenSize().getWidth(), Launcher.getScreenSize().getHeight(), 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);
}
private void initGraphics(){
spaceShip = loadTexture("SpaceShip");
background = loadTexture("Background");
}
//*****************************Update Methodes ********************************************************************
private void printTickLine(){
if(Sys.getTime() - lastFrame >= biggestDelta){
biggestDelta = Sys.getTime() - lastFrame;
}
TimeDelta += Sys.getTime() - lastFrame;
ticks++;
if(TimeDelta >= 1000){
TimeDelta = 0;
System.out.println("Ticks: " + ticks + " biggest Timedelta = " + biggestDelta + "ms");
ticks = 0;
biggestDelta = 0;
}
}
private void tick(){
}
//******************************Time Methodes *************************************************************
private long getTime(){
return (Sys.getTime() * 1000) /Sys.getTimerResolution();
}
private int getDelta(){
long currentTime = getTime();
int delta = (int)( currentTime - lastFrame);
lastFrame = getTime();
return delta;
}
//******************************Render and Texture Methodes ***********************************************
private void render(int delta){
glClear(GL_COLOR_BUFFER_BIT); //for 3d add "| GL_Depht_Buffer_BIT"
//Render
background.bind();
glBegin(GL_QUADS);
glTexCoord2f(0, 0); //UpperLeft
glVertex2i(0, 0);
glTexCoord2f(1, 0); //UpperRight
glVertex2i((int)Launcher.getScreenSize().getWidth(), 0);
glTexCoord2f(1, 1); //DownRight
glVertex2i((int)Launcher.getScreenSize().getWidth(), (int)Launcher.getScreenSize().getHeight());
glTexCoord2f(0, 1); //DownLeft
glVertex2i(0, (int)Launcher.getScreenSize().getHeight());
glEnd();
spaceShip.bind();
glBegin(GL_QUADS);
glTexCoord2f(0, 0); //UpperLeft
glVertex2i(200, 200);
glTexCoord2f(1, 0); //UpperRight
glVertex2i(300, 200);
glTexCoord2f(1, 1); //DownRight
glVertex2i(300, 300);
glTexCoord2f(0, 1); //DownLeft
glVertex2i(200, 300);
glEnd();
}
public Texture loadTexture(String key){
try {
return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/" + key + ".png")));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.err.println("coudn't load " + key + " Texture");
return null;
}
}
So da seht ihr mein Problem
Gibt es unter euch LWJGL - Heros die gewillt sind mir zu helfen, das wäre super.
Fehlende Informationen gebe ich euch gerne noch in weiteren Nachrichten!
Vielen Dank im Voraus
lg Saturn91/Manuel
Zuletzt bearbeitet: