# Auf einem Stick bewegen



## gerredtor (24. Nov 2016)

Hallo, ich habe einen Char in LWJGL erstellt und ich möchte das dieser char auf einem strich(Titel falsch sry) zu den ziel coordianten geht mein code:


```
if(x < toX)
            {
                x += (delta/1.0f);
            }

            if(x > toX)
            {
                x -= (delta/1.0f);
            }

            if(y < toY)
            {
                y += (delta/1.0f);
            }

            if(y > toY)
            {
               y -= (delta/1.0f);
            }
```

aber das klappt nicht sauber weil der spieler z.b. schräg nach unten geht und dann einfach rechts geht bis zum ziel aber nicht auf dem makiertem weg


----------



## Robat (24. Nov 2016)

Wenn es dir nur darauf ankommt, dass dein Spieler zum Ziel kommt, könntest du dir Ja markante Eckpunkte in einem Array speichern und dir Immer ein Element als "neues" toX setzten bis du da bist. so Würdest du ihm eine Richtung vorgeben.

Das von jemanden der noch nicht so viel mit Spieleprogrammierung zu tun Hatte. Gibt eventuell (Sehr wahrscheinlich  ) einen effizienteren weg


----------



## gerredtor (24. Nov 2016)

Habe es mittlerweile richtig hin bekommen, mit vektoren war einfacher


----------



## VfL_Freak (24. Nov 2016)

dann verrate doch auch bitte der Nachwelt die Lösung ...
Gruß Klaus


----------



## gerredtor (24. Nov 2016)

Habe es nun so gelöst: kompletter code


```
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.fourthfloorproductions.TowerDefense.Entity;

import com.fourthfloorproductions.TowerDefense.Engine.Frame;
import com.fourthfloorproductions.TowerDefense.Engine.FrameImage;
import com.fourthfloorproductions.TowerDefense.Engine.Laufllienien;
import com.fourthfloorproductions.TowerDefense.Engine.Weglinie;
import com.fourthfloorproductions.TowerDefense.Game;
import java.util.ArrayList;
import org.newdawn.slick.geom.Point;
import org.newdawn.slick.geom.Vector2f;
/**
*
* @author Christoph
*/
public abstract class Entity {
   
    private int live;
    private int damage;
   
    private Vector2f pos;
    private Vector2f speed;
   
    private int x,y;
    private FrameImage image;
    private Laufllienien lauflienien;
    private int aktWeg;
    private boolean Living = true;
   
    float lastX, lastY;
   
    float rx, ry;
   
    public Entity(ArrayList<Weglinie> weglinie)
    {
        this.image = new FrameImage("src/res/Downloads.png", 60,60);
       
        this.aktWeg = 0;
        this.lauflienien = new Laufllienien(weglinie);
       
        this.x = lauflienien.getWege().get(0).fromX;
        this.y = lauflienien.getWege().get(0).fromY;
       
        this.pos = new Vector2f(x,y);
        this.speed = new Vector2f(lauflienien.getWege().get(aktWeg).toX,lauflienien.getWege().get(aktWeg).toY);
        this.speed.setTheta(getAngle(new Point(lauflienien.getWege().get(aktWeg).toX, lauflienien.getWege().get(aktWeg).toY)));
    }
   
    public void draw(Frame f)
    {
        if(Living)
        {
            f.drawImage(image,pos.getX()-30,pos.getY()-30);
            rx=pos.copy().getX()-30;
            ry=pos.copy().getY()-30;
            f.drawLine(pos.getX(), pos.getY(), pos.getX()+30, pos.getY()+30);
        }
    }
       
    public final float getAngle(Point target) {
        float angle = (float) Math.toDegrees(Math.atan2(target.getY() - y, target.getX() - x));

        if(angle < 0){
            angle += 360;
        }

        return angle;
    }
   
    public boolean isFinal()
    {
        boolean f = false;
       
        int finalPosX = lauflienien.getWege().get(aktWeg).toX;
        int finalPosY = lauflienien.getWege().get(aktWeg).toY;
       
        if((finalPosX < lastX && finalPosX > pos.getX()) || (finalPosX > lastX && finalPosX < pos.getX()))
        {
           if((finalPosY < lastY && finalPosY > pos.getY()) || (finalPosY > lastY && finalPosY < pos.getY()))
           {
               f = true;
           }
        }
       
        return f;
    }
   
    public void update(int delta)
    {       

        if(isFinal())
        {
            if(aktWeg == lauflienien.getWege().size()-1)
            {
                Game.live -= damage;
                Living = false;
            }else{
                aktWeg += 1;
               
                this.x = lauflienien.getWege().get(aktWeg).fromX;
                this.y = lauflienien.getWege().get(aktWeg).fromY;
               
                this.pos = new Vector2f(x,y);
                this.speed = new Vector2f(lauflienien.getWege().get(aktWeg).toX,lauflienien.getWege().get(aktWeg).toY);
                this.speed.setTheta(getAngle(new Point(lauflienien.getWege().get(aktWeg).toX, lauflienien.getWege().get(aktWeg).toY)));
            }  
        }else{
            lastX = pos.getX();
            lastY = pos.getY();
           
            Vector2f realSpeed = speed;
            realSpeed.normalise();
            realSpeed.scale(0.1f*delta);

            pos.add(realSpeed);
        }       
    }
   
    public float getX()
    {
        return this.rx;
    }
   
    public float getY()
    {
        return this.ry;
    }
   
    public Vector2f getVector()
    {
        return this.pos;
    }
}
```


----------



## VfL_Freak (24. Nov 2016)

Danke


----------

