# Problem beim bewegen einer Figur



## Duck93 (5. Mrz 2012)

Hallo,

Ich habe vor einigen Tagen angefangen mein erstes Spiel zu Programmieren. Allerdings bin ich bereits sehr schnell auf ein (für mich) unlogisches Problem gestoßen:

Ich habe eine Klasse Wurm (der Character, den ich bewege) und eine Klasse Keylogger (Name erklärt sich hoffentlich) mit den Attributen up, down, left, right. (alles 4 boolean Werte) Die Klasse Keylogger setzt die boolean werte jeweils true, falls die entsprechende Taste Gedrückt ist, und false falls nicht. Dementsprechend reagiert der Wurm mit Animationsänderung, Laufrichtungsänderung etc. 
Soweit so gut: Wenn cih rechts laufe, funktioniert auch alles, animation stoppt auch wenn keine Taste gedrückt wurde, wenn cih jedoch nach links laufen möchte, so ändert sich nur scheinbar zufällig die animation, jedoch "läuft" der Wurm nicht über die Karte, obwohl alles wie beim Rechtslaufen implementiert ist, nur eben andersherum.

Hier mal meine beiden Klasse (nur Ausschnitte, da ansonsten zu lang):
Wurm:

Diese Klasse Erbt von einer Oberklasse Sprite, die sich um das Zeichnen, die Animationen etc kümmert, daher kommen auch loop_from und loop_to.

```
@Override public void doLogic(long delta)
    {
        super.doLogic(delta);
        if(keys.up)
        {
            System.out.println("Springen");
            //this.SetVerticalSpeed(20);
        }
        else
        {
        }
        if(keys.left)
        {
            if(this.loop_from == 0 || this.loop_from == 0 && this.loop_to == 0)
            {
                loop_from = 3;
                loop_to = 7;
            }
            System.out.println("Linkslaufen");
            this.SetHorizontalSpeed(0);
            this.SetHorizontalSpeed(-10);
        }
        else
        {
            this.SetHorizontalSpeed(0);
        }
        if(keys.right)
        {
            if(this.loop_from == 3 || this.loop_from == 0 && this.loop_to == 0)
            {
                loop_from = 0;
                loop_to = 3;
            }
            System.out.println("rechtslaufen");
            this.SetHorizontalSpeed(0);
            this.SetHorizontalSpeed(10);
        }
        else
        {
            this.SetHorizontalSpeed(0);
        }
        if(!keys.up && !keys.down && !keys.left && !keys.right)
        {
            if(loop_from == 0)
            {
                loop_from = 0;
                loop_to = 0;
            }
            else if (loop_from == 3)
            {
                loop_from = 3;
                loop_to = 3;
            }
        }
    }
```

Diese Methode wird im Haupthread aufgerufen, um die jeweilige Aktion zu tätigen.

keys ist ein Objekt der Klasse KeyLogger ( ja, ich weiß.. unschöner direkter Zugriff auf Variablen )

KeyLogger:

```
@Override public void keyPressed(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_UP)
        {
            up = true;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {
            down = true;
        }
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {
            left = true;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            right = true;
        }
    }

    @Override public void keyReleased(KeyEvent e)
    {
        if(e.getKeyCode()==KeyEvent.VK_UP)
        {
            up = false;
        }
        if(e.getKeyCode()==KeyEvent.VK_DOWN)
        {
            down = false;
        }
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
        {
            left = false;
        }
        if(e.getKeyCode()==KeyEvent.VK_RIGHT)
        {
            right = false;
        }

        if(e.getKeyCode()==KeyEvent.VK_ENTER)
        {
            if(!panel.isStarted())
            {
                panel.doInitializations();
                panel.setStarted(true);
            }
        }

        if(e.getKeyCode()==KeyEvent.VK_ESCAPE)
        {
            if(panel.isStarted())
            {
                panel.stopGame();
                panel.timer.stop();
            }
            else
            {
                panel.frame.dispose();
            }
        }
    }
```

panel ist mein Fenster, in dem sich alles abspielt.

Diese Herangehensweise ist aus einem Tutorial (pdf-Format) von dem ich leider nicht den Urheber kenne. Wer eine bessere/effizientere Herangehensweise weiß, ich wäre für jedwede Vorschläge offen 

lg


----------



## Wurm123 (5. Mrz 2012)

If keys.left setzt den horizontal speed erst richtig. Danach kommt allerdings das if keys.right welches in den else zweig läuft und somit den horizontal speed wieder auf 0 setzt.


----------



## Duck93 (5. Mrz 2012)

Verdammt... Darauf hätte ich ja auch selber kommen können 
Danke vielmals


----------

