# der Player bewegt sich nicht



## NHI (29. Sep 2018)

Hi, ihr habt mir schon oft weiter geholfen und ich hoffe ihr könnt es auch dieses mal. Ich schicke euch den Code, das Problem ist, dass sich ein kleines Rechteck, dass der Player sein soll nicht bewegt bei der Benutzung der WASD- Tasten.

Schon mal Danke im Voraus 
LG NHI


----------



## NHI (29. Sep 2018)

```
package HindernisslaufPack;

import java.util.Timer;
import java.util.TimerTask;

public class Background {
Timer move;

Background() {
    move = new Timer();
    move.scheduleAtFixedRate(new TimerTask()  {

        @Override
        public void run() {
           
           
           
            if (Var.BackX1 > -800)   {
               
                Var.BackX1 -= 2;
            }
            else Var.BackX1 = -2;
           
           
           

            if (Var.BackX2  > 0)   {
               
                Var.BackX2 -= 2;
            }
            else {
            Var.BackX2 = 790;
            }
           
           
           
           
                       
        }
       
       
       
       
       
       
       
       
       
    }, 0,12);
   
   
   
   
   
}
}
```


```
package HindernisslaufPack;

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

public class Draw extends JLabel{
protected void paintComponent(Graphics g) {
   
    super.paintComponent(g);
   
    Graphics2D g2D = (Graphics2D) g;
    g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
   
    g.drawImage(Var.Background1, 0, Var.BackX1, 800, 600,null);
    g.drawImage(Var.Background2, 0, Var.BackX2, 800, 600,null);
    g.fillRect(Var.Pgegnerx, Var.Pgegnery, 20, 20);
    for (int i =0; i<4; i++) {
       
        g.fillRect(Var.gegnerx[i],Var.gegnery[i], 100, 20);
    }
   
   
    repaint();
   
    Var.BackX1 = 0;
    Var.BackX2 = 800;
   
}
   

}
```


----------



## NHI (29. Sep 2018)

```
package HindernisslaufPack;

import java.util.Timer;
import java.util.*;

public class gegner {
Timer move;
int temp;
public gegner () {
   
    Timer move = new Timer();
   
for (int i=0; i<4; i++)  {
   
    temp += 150;
       
        Var.gegnery[i] = 600-temp;
        Var.gegnerx[i] = 1200-temp;
       
       
    }   
   
   
   
   
    move.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
           
            for (int i =0; i<4; i++) {
               
            Var.gegnerx[i] -= Var.gegnerspeed[i];
                if (Var.gegnerx[i] <0) {
                   
                    Var.gegnerx[i] = 1000;
                }
       
           
           
        }

        }
   
       
       
       
    }, 0, 8);
   
    }
}
```


```
package HindernisslaufPack;

import java.awt.Window;

import javax.swing.JFrame;

public class GUI {

    public GUI() {
       
        Var.jf1.setSize(Var.Breite, Var.Höhe);
        Var.jf1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Var.jf1.setLocationRelativeTo(null);
        Var.jf1.setTitle("Hinddernisslauf");
        Var.jf1.requestFocus();
        Var.jf1.setVisible(true);
       
        Draw draw = new Draw();
        draw.setBounds(0,0,Var.Breite,Var.Höhe);
        draw.setVisible(true);
        Var.jf1.add(draw);
       
       
       
       
    }
   
   
   
   
}
```


```
package HindernisslaufPack;

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


public class KeyHandler implements KeyListener {

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W )    {
           
        Var.moveup = true;
        }   
        else if (e.getKeyCode() == KeyEvent.VK_S) {
           
            Var.movedown = true;
        }
        else if (e.getKeyCode() == KeyEvent.VK_A) {
           
            Var.moveleft = true;
        }
        else if (e.getKeyCode() == KeyEvent.VK_D) {
           
            Var.moveright = true;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W )    {
           
            Var.moveup = false;
            }   
            else if (e.getKeyCode() == KeyEvent.VK_S) {
               
                Var.movedown = false;
            }
            else if (e.getKeyCode() == KeyEvent.VK_A) {
               
                Var.moveleft = false;
            }
            else if (e.getKeyCode() == KeyEvent.VK_D) {
               
                Var.moveright = false;
            }
       
    }

    @Override
    public void keyTyped(KeyEvent e) {
       
       
    }

}
```


```
package HindernisslaufPack;

public class Main {

    public Main() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
        new Var();
        new GUI();
        new Draw();
        new Background();
        new gegner();
        new KeyHandler();
        new PlayerMovement();
    }

}
```


```
package HindernisslaufPack;

import java.util.Timer;
import java.util.TimerTask;

public class PlayerMovement {
Timer move;
   
public PlayerMovement() {
   
    move = new Timer();
    move.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
       
            if (Var.moveup == true) {
                if (Var.Pgegnery >= 40 )  {
                   
                    Var.Pgegnery =Var.Pgegnery - 2;
                } }
               
            else if (Var.movedown == true) {
                    if (Var.Pgegnery >= 40 )  {
                       
                        Var.Pgegnery += 2;
                    }     }
               
            else    if (Var.moveright == true) {
                        if (Var.Pgegnerx <= 760 )  {
                           
                            Var.Pgegnerx  += 2;
                        } }
               
            else            if (Var.moveright == true) {
                            if (Var.Pgegnerx >= 40 )  {
                               
                                Var.Pgegnerx  -= 2;
                            }
                   
                        }
               
            }
           
           
           
           
        }, 0, 7);
       
       
       
       
       
   
   
   
            }
   
}
```


```
package HindernisslaufPack;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;

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

public class Var {

   
     static JFrame jf1 = new JFrame();
     static int Breite = 800;
    static int Höhe = 600;
   
    static BufferedImage Background1;
    static BufferedImage Background2;
    static BufferedImage man1;
   
   
    static int[] gegnerx = new int[4];
    static int[] gegnery = new int[4];
    static int Pgegnerx = 200, Pgegnery = 400;
   
   
    static int BackX1;
    static int BackX2;
    static int[] gegnerspeed = new int[4];
   
    static boolean moveup;
    static boolean movedown;
    static boolean moveright;
    static boolean moveleft;
   
       
        public Var() {
           
            try {
                Background1  = ImageIO.read(new File ("rsc/MeinNeuesBild.png"));
                Background2  = ImageIO.read(new File ("rsc/MeinNeuesBild.png"));
               
               
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Datei nicht gefunden");
            }
           
            gegnerspeed [0] = 2;
            gegnerspeed [1] = 3;
            gegnerspeed [2] = 2;
            gegnerspeed [3] = 4;
           
           
           
        }
   

}
```
s


----------



## Javinner (29. Sep 2018)

@NHI
Ich weiß, woher du diesen Code hast 
Kurz um, vergiss den Kerl, das ist alles nichts, was er da macht! Lerne lieber Grundlagen, bevor du diesen Quark abtippst!

Was hier wichtig ist, ist Hierarchie. Ein Fenster hat ein Zeichenblatt, auf dem Zeichenblatt werden Figuren gezeichnet. Die Figuren selbst sind für ihre Position zuständig, denn das Zeichenblatt zeichnet nur die aktuelle Position der Figuren. Eine Figur hat also ein Bild und eine Koordinate. Wenn du dann das Spiel startest, wird ein Timer gestartet, welcher sequentiell alles in ihm Vorhandene abläuft. Hier werden dann die Koordinaten der Figuren, bzw. das Hintergrundbild, welches hier in Bewegung ist, auf ein aktuellen Stand gebracht. Erst in der Zeichenmethode des Zeichenblattes wird alles neu gezeichnet.

Dieses Stück Code..

```
public class Main {

    public Main() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
        new Var();
        new GUI();
        new Draw();
        new Background();
        new gegner();
        new KeyHandler();
        new PlayerMovement();
    }

}
```
..ist Fusch! Denn hier in der Main-Methode findet ja das Spielen statt. Das ist sowas für den A****, da gibt es auch kein Verbesserungsvorschlag, das gehört ganz anders gemacht.

edit: wenn du einige Klassen postest und es sich in die Länge zieht, dann ist es eventuell besser, diese in Spoiler zu packen. Die Einstellung findest du in dem selben Menü für Code, beachte, dass Code-Darstellung in den Spoiler gehört, also so:
SPOILER
    CODE
    /CODE
/SPOILER
nimmt wesentlich weniger Platz ein


----------



## NHI (29. Sep 2018)

Danke für die Antwort aber der code wurde nicht abgetippt, ich habe ihn selbst geschrieben ich habe geguckt wie es in einigen tutorials angegangen wird aber das ist mein eigener Code und keine Kopie, die Idee des Games ist ebenfalls meine eigene. Ick kann einige der Grundlagen sonst wäre ich nicht in der Lage gewesen das zu schreiben ich weiss wie der Code funktioniert und habe ihn nicht Blind abgetippt. Alllerdings bitte ich dich mir näher zu erläutern wie du das von der Struktur angehen würdest.


----------



## NHI (29. Sep 2018)

Also ich meine welche Klassen du anlegen würdest, die für was zuständig wären


----------



## mihe7 (29. Sep 2018)

@NHI Das hat er Dir doch geschrieben:



Javinner hat gesagt.:


> Was hier wichtig ist, ist Hierarchie. Ein Fenster hat ein Zeichenblatt, auf dem Zeichenblatt werden Figuren gezeichnet. Die Figuren selbst sind für ihre Position zuständig, denn das Zeichenblatt zeichnet nur die aktuelle Position der Figuren. Eine Figur hat also ein Bild und eine Koordinate. Wenn du dann das Spiel startest, wird ein Timer gestartet, welcher sequentiell alles in ihm Vorhandene abläuft. Hier werden dann die Koordinaten der Figuren, bzw. das Hintergrundbild, welches hier in Bewegung ist, auf ein aktuellen Stand gebracht. Erst in der Zeichenmethode des Zeichenblattes wird alles neu gezeichnet.


----------



## NHI (29. Sep 2018)

Stimmt danke, aber warum bewegt sich bei meiner struktur der player nicht?


----------



## mihe7 (29. Sep 2018)

Weil Du nirgends neu zeichnest?


----------



## NHI (29. Sep 2018)

Tue ich doch in der Klasse Draw wird der Player gezeichnet und repaint hab ich auch, nur die position des players verändert sich in PlayerMovement


----------



## mihe7 (29. Sep 2018)

Stimmt, der Code ist so krank, da habe ich das übersehen. Aber der KeyHandler wird nirgends genutzt, oder?


----------



## Robat (29. Sep 2018)

NHI hat gesagt.:


> Ick kann einige der Grundlagen sonst wäre ich nicht in der Lage gewesen das zu schreiben


Ich kann nicht beurteilen wie deine Kenntnisse sind und will ich auch gar nicht - der Code allerdings sagt etwas anderes. Du erstellst wahllos neue Instanzen von Klassen um sie dann in einer anderen Klasse neu zu erstellen (Draw-Klasse als Beispiel), der KeyListener wird nirgendswo hinzugefügt (was im übrigen auch dein Problem sein sollte, warum der Spiele nicht bewegt wird), das Geheimnisprinzip wird absolut nicht beachtet (alles public static Variablen), du legst tw. Member einer Klasse an nur um dann eine Variable mit dem gleichen Namen lokal noch mal anzulegen und sinnvolle Objekte gibt es auch nicht wirklich.

Ich will dir nicht zu nahe treten, aber vielleicht solltest du vorher noch mal einen Schritt zurückgehen, bevor du mit der GUI / Spiele Programmierung weiter machst. Es ist wichtig die Grundlagen von Java drauf zu haben, sonst schreibt man tw. Code der zwar im Moment funktioniert aber irgendwann zu einem Problem wird. Klar kriege ich den Nagel auch mit einem Löffel in die Wand .. irgendwann .. aber schön ist es nicht.

BTW: In paintComponent ein repaint() aufzurufen solltest du vermeiden, da repaint() intern auch wieder paintComponent() aufruft. Es wäre schlauer repaint() immer nur dann aufzurufen, wenn es auch nötig ist - nämlich wenn sich Parameter verändert haben


----------



## NHI (29. Sep 2018)

@mihe7 du kannst gerne meinen Code kritisieren dafür bin ich immer offen aber bitte auf respektvolle art und weise.
Das der Code chaotisch und von schlechtem Stil ist weiss ich jetzt auch. Der KeyHandler wird doch in der Main aufgerufen.

Die Grundlagen kann ich, da bin ich sicher, allerdings fehlt mir sehr Erfahrung oder auch Übung.Dieses Spiel dient mir als Übung, die ja schließlich nötig ist um diese anzuwenden. Mein Problem ist, dass ich eben noch sehr wenige Projekte realisiert habe und noch keine Rückmeldung derartiger Art bezüglich meines Stil, meiner Konstruktion etc. bekommen habe und entsprechend nur auf die Funktion geachtet, dessen wurde ich ja nun eines besseren belehrt.
Ich werde versuchen mich zu bessern, aber jeder fängt doch einmal so an, oder etwa nicht? Um die Grundlagen zu vertiefen, wollte ich Projekte realisieren um auch Dinge anzuwenden.


----------



## Javinner (29. Sep 2018)

NHI hat gesagt.:


> ich habe geguckt wie es in einigen tutorials angegangen wird


Wer da die Ausgangsquelle des Stils ist, ist sicher nicht ganz klar. Jedoch habe ich diesen "Stil" schon hier gesehen und den YouTuber erraten können  
Wie dem auch sei, es freut mich, dass du dich mit der Materie beschäftigen willst. Kennst du die Seite schon?


----------



## mihe7 (30. Sep 2018)

NHI hat gesagt.:


> du kannst gerne meinen Code kritisieren dafür bin ich immer offen aber bitte auf respektvolle art und weise.
> Das der Code chaotisch und von schlechtem Stil ist weiss ich jetzt auch.


Ich habe nicht Deinen Code kritisiert. Das Vorgehen, die Klassenbezeichnungen und selbst Variablennamen kennt man zum großen Teil aus diversen Threads. Eine Quelle ist das Pong-"Tutorial", das auf YouTube zu finden ist. 



NHI hat gesagt.:


> Der KeyHandler wird doch in der Main aufgerufen. Die Grundlagen kann ich, da bin ich sicher


Grundlagen: in Main wird kein KeyHandler aufgerufen, sondern ein KeyHandler-Objekt erstellt, das aber nirgends verwendet wird.


----------

