2D Game

Panda9296

Bekanntes Mitglied
Ich habe ein Problem im Code den ich nicht finde : Es soll praktisch ein Bild für ein 2d Game gemacht werden:

Ich bekommen folgenden Fehler:

at java.desktop/java.awt.Container.add(Container.java:436)
at d2D.java.GUI.<init>(GUI.java:19)
at d2D.java.Main.main(Main.java:6) //Gui was falsch?? oder stimmt was mit dem Bild nicht?

MAIN:
Code:
package d2D.java;

public class Main {

    public static void main(String[] args) {
        new GUI();
        new Variabeln();
        new Steuerung();
        new Label();
    }

}

GUI:
Code:
package d2D.java;
import javax.swing.JFrame;

public class GUI {
    
    public GUI() {
    
        Variabeln.jf1= new JFrame();
        Variabeln.jf1.setSize(Variabeln.screenwidth,Variabeln.screenheight);
        Variabeln.jf1.setLocationRelativeTo(null);
        Variabeln.jf1.setLayout(null);
        Variabeln.jf1.setTitle("Miguel sein 2D-Spiel");
        Variabeln.jf1.setResizable(false);
        Variabeln.jf1.requestFocus();
        
        
        Variabeln.lbl1 = new Label();
        Variabeln.lbl1.setBounds(0,0,Variabeln.screenwidth,Variabeln.screenheight);
        Variabeln.lbl1.add(Variabeln.lbl1);
        Variabeln.lbl1.setVisible(true);
        
    }
 
}
LABEL:

package d2D.java;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JLabel;

public class Label extends JLabel {
private static final long serialVersionUID=1L;

protected void paintcom(Graphics g) {
super.paintComponent(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.drawImage(Variabeln.ib1,0,Variabeln.backroundgroundY1,800,600,null);
g.drawImage(Variabeln.ib1,0,Variabeln.backroundgroundY1,800,600,null);

repaint();

}
}


Variable(ja ich weiß falsch geschrieben kein Bock mehr es zu ändern 😀

Code:
package d2D.java;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Variabeln {
    
     static JFrame jf1;
     static int screenwidth = 800;
     static int screenheight = 600;
     static int backroundgroundY1 = 0, backgroundY2 =-600;
  
     static boolean moveup=false,movedown=false,moveleft=false,moveright=false;
     static Label lbl1;
    
     static BufferedImage ib1,ib2;
     public Variabeln() {
         try {
            
             ib1 = ImageIO.read(new File("obd/b1.jpg"));
             ib2 = ImageIO.read(new File("obd/b1.jpg"));
         }catch(IOException e) {
             e.printStackTrace();
             System.err.println("Bilder konnten nicht geladen werden");
         }
     }

}

oh man ich will nix durcheinander bringen 😀

Code:
package d2D.java;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Steuerung  implements KeyListener{

    @Override
    public void keyTyped(KeyEvent e) {   
    }

    @Override
    public void keyPressed(KeyEvent e) {
        
        if(e.getKeyCode()==KeyEvent.VK_UP) {
            Variabeln.moveup=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN) {
            Variabeln.movedown=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_LEFT) {
            Variabeln.moveleft=true;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
            Variabeln.moveright=true;
        }
        
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
        if(e.getKeyCode()==KeyEvent.VK_UP) {
            Variabeln.moveup=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN) {
            Variabeln.movedown=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_LEFT) {
            Variabeln.moveleft=false;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
            Variabeln.moveright=false;
        }
        
    }

    
}

Ich bin sehr dankbar für eine Hilfestellung
 
Also bitte beim nächsten Mal auch die Fehler-Details (Exception) mit bringen. Dun die Zeile etwas besser markieren. Sonst wird es immer ein raten.

Also die Zeile macht so keinen Sinn:
Code:
Variabeln.lbl1.add(Variabeln.lbl1);

Du willst das Label lbl1 dem Label lbl1 hinzufügen?
Das sollte wohl eher sowas sein:
Code:
Variabeln.jf1.add(Variabeln.lbl1);
Variabeln.jf1.setVisible(true);

Aber das ist schrecklicher Code. Diese Static Variablen in der Klasse Variablen... Du hast doch eine Klasse GUI - wieso machst Du da nicht das Frame und Label als Instanzvariablen rein?

Also sowas in der Art:

Java:
package d2D.java;
import javax.swing.JFrame;

public class GUI {
    
     private JFrame jf1;
     private Label lbl1;

    public GUI() {
    
        jf1= new JFrame();
        jf1.setSize(Variabeln.screenwidth,Variabeln.screenheight);
        jf1.setLocationRelativeTo(null);
        jf1.setLayout(null);
        jf1.setTitle("Miguel sein 2D-Spiel");
        jf1.setResizable(false);
        jf1.requestFocus();
        
        
        lbl1 = new Label();
        lbl1.setBounds(0,0,Variabeln.screenwidth,Variabeln.screenheight);
        jf1.add(Variabeln.lbl1);
        jf1.setVisible(true);   
    }
}

Beim Label auch ähnlich, wobei die Frage ist, ob das eine Klasse sein muss oder ob es nicht ausreicht, direkt eine Instanz von JLabel zu nehmen ...

Also die Klasse Variablen komplett weg und die static Elemente wanden non static in die Klassen, in die diese gehören ...

Und wenn man schon dabei ist; Variablen sinnvoll benennen. jf1 wäre evtl. mainFrame oder so. lbl1 dann etwas, wozu dieser Label da ist.
 
Also bitte beim nächsten Mal auch die Fehler-Details (Exception) mit bringen. Dun die Zeile etwas besser markieren. Sonst wird es immer ein raten.

Also die Zeile macht so keinen Sinn:
Code:
Variabeln.lbl1.add(Variabeln.lbl1);

Du willst das Label lbl1 dem Label lbl1 hinzufügen?
Das sollte wohl eher sowas sein:
Code:
Variabeln.jf1.add(Variabeln.lbl1);
Variabeln.jf1.setVisible(true);

Aber das ist schrecklicher Code. Diese Static Variablen in der Klasse Variablen... Du hast doch eine Klasse GUI - wieso machst Du da nicht das Frame und Label als Instanzvariablen rein?

Also sowas in der Art:

Java:
package d2D.java;
import javax.swing.JFrame;

public class GUI {
   
     private JFrame jf1;
     private Label lbl1;

    public GUI() {
   
        jf1= new JFrame();
        jf1.setSize(Variabeln.screenwidth,Variabeln.screenheight);
        jf1.setLocationRelativeTo(null);
        jf1.setLayout(null);
        jf1.setTitle("Miguel sein 2D-Spiel");
        jf1.setResizable(false);
        jf1.requestFocus();
       
       
        lbl1 = new Label();
        lbl1.setBounds(0,0,Variabeln.screenwidth,Variabeln.screenheight);
        jf1.add(Variabeln.lbl1);
        jf1.setVisible(true);  
    }
}

Beim Label auch ähnlich, wobei die Frage ist, ob das eine Klasse sein muss oder ob es nicht ausreicht, direkt eine Instanz von JLabel zu nehmen ...

Also die Klasse Variablen komplett weg und die static Elemente wanden non static in die Klassen, in die diese gehören ...

Und wenn man schon dabei ist; Variablen sinnvoll benennen. jf1 wäre evtl. mainFrame oder so. lbl1 dann etwas, wozu dieser Label da ist.
ok ja das mit variablen zu variablen schreiben hab ich schon entdeckt aber du hast recht ich hab schon überlegt ob ich es nicht anders machen kann. Das Thema ist ich möchte ein bewegliches Hintergrundbild das quasi in Schleife läuft also mach ich aus dem einen Bild ein zweites und sage er soll es durchlaufen lassen und dann mit dem zweiten Bild anfangen und dann wieder beim ersten ich denke man kann es probieren . Ich versuche es morgen direkt mal. danke
 
Rechtsklick -> (Refactor ->) Rename -> "Variable" 😛

Das ist aber IMO das geringste Problem, viel schlimmer ist dieses Youtube Tutorial... Das hält sich wie die Pest.
Wie meinst du 😀? ich lerne gerade den grafischen Aufbau =P es hat auch ganz gut funktioniert... Allerdings habe ich es diesmal wie oben empfohlen abgeändert und so ist es viel übersichtlicher
 
Das Problem dieses "Tutorials" ist, dass dort gezeigt wird, wie man es nicht macht: Konstruktoren als Methoden missbrauchen, statische Variablen (=globaler Zustand) an jeder Ecke, falsch angewandte Vererbung (bzw. falsche Bezeichner) usw. Die Klassen existieren dort doch nur, weil das Framework es fordert. So schreibt man weder objektorientierten noch Java-Code.

Allerdings habe ich es diesmal wie oben empfohlen abgeändert und so ist es viel übersichtlicher
Eben.

es hat auch ganz gut funktioniert...
Ja, natürlich funktioniert das. Java und seine Frameworks sind keine Garanten für guten Code. Und, versteh mich nicht falsch, ich würde auch jedem zugestehen, so etwas Quick & Dirty in der Weise zu implementieren; das stelle ich aber doch bitte nicht als Tutorial für Anfänger ins Netz.

Für die GUI-Entwicklung ist etwas Know-How erforderlich, das über die absoluten Java Basics hinausgeht. Insbesondere wäre hier der Event Dispatch Thread zu nennen. Die Funktionsweise ist nicht kompliziert, aber für das Verständnis unabdingbar. Ohne dieses kommt man leicht auf naheliegende Ideen, die aber nicht funktionieren können (z. B. Animation in einer Schleife, die in einem Listener/Swing Timer ausgeführt wird).
 
Das Problem dieses "Tutorials" ist, dass dort gezeigt wird, wie man es nicht macht: Konstruktoren als Methoden missbrauchen, statische Variablen (=globaler Zustand) an jeder Ecke, falsch angewandte Vererbung (bzw. falsche Bezeichner) usw. Die Klassen existieren dort doch nur, weil das Framework es fordert. So schreibt man weder objektorientierten noch Java-Code.


Eben.


Ja, natürlich funktioniert das. Java und seine Frameworks sind keine Garanten für guten Code. Und, versteh mich nicht falsch, ich würde auch jedem zugestehen, so etwas Quick & Dirty in der Weise zu implementieren; das stelle ich aber doch bitte nicht als Tutorial für Anfänger ins Netz.

Für die GUI-Entwicklung ist etwas Know-How erforderlich, das über die absoluten Java Basics hinausgeht. Insbesondere wäre hier der Event Dispatch Thread zu nennen. Die Funktionsweise ist nicht kompliziert, aber für das Verständnis unabdingbar. Ohne dieses kommt man leicht auf naheliegende Ideen, die aber nicht funktionieren können (z. B. Animation in einer Schleife, die in einem Listener/Swing Timer ausgeführt wird).
danke für den tipp da ich neben der Umschulung einen Grundlagenkurs mit OOP zur Auffrischung gerade nochmal absolviere(auch weil es privat ist und ich ein Zertifikat bekomme) und ich das Spiel erstmal funktionstüchtig hinbekommen möchte werde ich mir das als nächstes aufjedenfall auf die toDo- liste setzen
 

Neue Themen


Zurück
Oben