# Objekte synchronisieren Variablen



## Kim_Dotcom (4. Feb 2019)

Hallo zusammen,
Ich arbeite an einem kleinem Spiel und habe ein Problem mit Spielobjekten. Ich habe eine abstract class "gameObjekt" mit den Kindklassen "Player" und "Bullet". Sie haben private Variablen für Position, die nur mit Methoden setPos von anderen Klassen aus geändert werden können. Also zb:
Bullet b = new Bullet();
b.setPos(x, y);

Allerdings scheint dann auch x, y vom Player geändert werden. Wieso?

Danke, habe Post mit Handy verfasst.

NACHTRAG: Zu erwähnen ist vll noch, dass ich alle erstellten Objekte mit der Mutterklasse gameObjekt in ner Schleife durchgehen und zb "refreshPosition" Aufrufe. Also die Arraylist weiß nicht ob es sich um Player oder Bullet handelt da die Unterklassen die Methoden mit Override verwenden macht das nix. Hat es vll damit zu tun.?


----------



## httpdigest (4. Feb 2019)

Also, wenn du einen Player anlegst und eine Bullet anlegst und du auf der Bullet-Instanz per setPos(x, y) die Position der Bullet änderst, dann beobachtest du, dass sich auf der Player-Instanz ebenfalls die Werte für die Position geändert haben?
Sind deine Variablen/Felder innerhalb der Player Klasse zufällig statische Klassevariablen/-felder?


----------



## Kim_Dotcom (4. Feb 2019)

Richtig so meinte ich das. Nein static ist da nichts, eben private. Wie gesagt gibt es für Player und Bullet eine Mutterklasse. Diese ist abstract. Diese benötige ich, da ich in einer Schleife alle Gameobjects durchgehe und Methoden Aufrufe die die Kindklassen überschreiben. Vll liegt der Fehler da drin k. A.
Gibt es einen Unterschied zwischen Objekt einer Klasse und Instanzen. Bzw. Wenn ich zb
Player p1 = new Player() ;
Player p2 = new Player() ;

schreibe, dann kann ich doch x, y von p1 unabhängig von p2 ändern oder?


----------



## Kim_Dotcom (4. Feb 2019)

Die Methoden mit override überschreiben doch die Methoden der Mutterklasse. Wenn ich in der Schleife alle "Gameobjects" durchgehe, und Bullet in der Methode "draw" was anderes tut, wie Player in der Methode "draw" dann macht Player in draw aufeinmal dasselbe wie Bullet in "draw", weil Bullet zuletzt erstellt wird, kann das sein?

Aber wie gehe ich in einer Schleife sonst alle beweglichen Spielobjecte durch ohne es für jede Klasse extra machen zu müssen? Da ich auch Kollisionen untereinander testen muss. Momentan Schreibe ich ja:

```
For(Gameobjects g1 : Beweglich) {
For(Gameobjects g2 : Beweglich) {
g1. testCollision(g2)
}}
```

Sonst sind das ja endlos viele Schleifen ineinander.


----------



## mrBrown (5. Feb 2019)

Kannst du den Code dazu zeigen?


----------



## Kim_Dotcom (5. Feb 2019)

Mutterklasse:

```
class Gameobject {
   
    public void create(Vector2 pos) {
       
    }
   
    public void draw() {
       
    }

    private void action() {
       
    }

    public void collisionCheck(Rectangle b) {
       
    }
}
```

Kinklasse Bullet 

```
public class Bullet extends Gameobject
{ 
    protected Vector2 Pos;
    protected Vector2 Vel;
    Rectangle Rect;
    Sprite spr;

    public void create(Vector2 pos) {
        spr = new Sprite(MyGdxGame.bulletTex);
        this.spr.setCenter(pos.x,pos.y);
        this.setPos(pos);
        this.setVel(new Vector2(0,0));
        Rect = new Rectangle(0,0,15,15);
    }
  
    public void draw() {
        spr.draw(MyGdxGame.batch);
    }
  
    private void action() {
        if(this instanceof Bullet) {
        Vector2 v = getPos();
        v.add(this.getVel());
        this.setPos(v);
        this.spr.setCenter(v.x,v.y);
        Rect.setCenter(Pos.x,Pos.y);
        }
    }
  
    public void collisionCheck(Rectangle b) {
        if(Rect.overlaps(b)) {
           MyGdxGame.delete = true;
        }
    }

    public Vector2 getPos() {
        return this.Pos;
    }

    public Vector2 getVel() {
        return this.Vel;
    }

    public final void setPos(Vector2 pos) {
        this.Pos = pos;
    }

    public final void setVel(Vector2 vel) {
        this.Vel = vel;
    }
}
```

Und Hauptklasse on der das Spiel läuft (Auschnitt)

```
for (Gameobject obj : gameobject) {
            for (Rectangle b : blocks) {
                obj.collisionCheck(b);
            }
            obj.action();
            if(delete == true) destroy.add(obj);
            delete = false;
        }
        for (Gameobject obj : destroy) {
            gameobject.remove(obj);
        }
```

Bullet scheint die Methoden der Kinklasse Player zu überschreiben. Ich will eine Mutterklasse für alle GameObjekt die ich in ner Schleife durchgehen kann und Methoden wie checkCollisions Aufrufe. Aber jede Kinklasse soll vll was anderes tun in den Methoden.


----------



## mrBrown (5. Feb 2019)

Als mögliche Fehlerquelle seh ich da nur Vector2, der nicht immutable ist, was so wie er da benutzt wird einige Probleme verursachen kann. 

Zeig mal auch die andere Klasse und das instanziieren deiner Objekte.


----------



## Kim_Dotcom (5. Feb 2019)

```
ArrayList<Gameobject> gameobject;
Gameobject = new ArrayList() ;
Character player = new Character();
Gameobject. add(player) ;

if(pressed[1] == true) {
            Bullet b = new Bullet();
            Vector2 v = player.getPos();
            v.add(new Vector2(200,100));
            b.create(v);
            b.setVel(player.getVel());
            gameobject.add(b);
        }
```

Und die Klasse für den Spieler:

```
public class Charakter extends Gameobject
{ 
    float s;
    float W;
    float H;
    int walkSpd;
    int maxSpd;
    float fricStart;
    float fric;
    int grav;
    Vector2 gravDir;
    int jumpSpd;
    boolean onBlock;
    boolean onPlatform;

    protected Vector2 Pos;
    protected Vector2 Vel;
   
    Rectangle Rect;
    Sprite spr;
    Sprite spr2;
    TextureRegion ani;
    float time;
    float scale;
    float rot;
    boolean[][] colMap;

    public void create(Vector2 pos) {
        this.setPos(pos);
        this.setVel(new Vector2(0,0));
        s = 0.4f;
        W = 50 * s;
        H = 100 * s;
        walkSpd = 15;
        maxSpd = 20;
        jumpSpd = 40;
        grav = 30;
        gravDir = new Vector2(0,-1);
        fricStart = 9f;
        fric = fricStart;
        onBlock = false;
        onPlatform = false;
      
        spr = new Sprite(MyGdxGame.playerTex);
        scale = 0.2f;
        rot = 0;
        spr.setCenter(Pos.x,Pos.y);
        spr.setScale(scale);
        Rect = new Rectangle(0,0, 30,30);
        ani = MyGdxGame.playerAni.getKeyFrame(0);
        time = 0;
        spr2 = new Sprite(ani);
        spr2.setCenter(Pos.x,Pos.y);
        spr2.setScale(scale);
    }
  
    public void draw() {
        //Player
        spr2.draw(MyGdxGame.batch);
        spr.draw(MyGdxGame.batch);
    }

    private void action()
    { 
        if(this instanceof Charakter) {
        Vector2 v = this.getPos();
        v.add(this.getVel());
        this.setPos(v);
        spr.setCenter(v.x,Pos.y);
        spr.setRotation(MyGdxGame.playerTheta);
        time += Gdx.graphics.getDeltaTime();
        ani = MyGdxGame.playerAni.getKeyFrame(time, true);
        spr2.setRegion(ani);
        spr2.setCenter(Pos.x, Pos.y);
        spr2.setRotation(MyGdxGame.playerTheta);
       
        if(!onBlock) {
            Vector2 g = new Vector2(gravDir.x * grav * Gdx.graphics.getDeltaTime(),
                                    gravDir.y * grav * Gdx.graphics.getDeltaTime());
            //Vel.add(g);
        }
        }
    }

    public void collisionCheck(Rectangle b)
    {
            onBlock = false;
            this.Vel.x = MathUtils.clamp(Vel.x, -200, 200);
            this.Vel.y = MathUtils.clamp(Vel.y, -200, 200);
               
                float xx = Pos.x - Rect.getWidth()/2;
                float yy = Pos.y - Rect.getHeight()/2;
                Rectangle tmp = new Rectangle(xx + Vel.x, yy + Vel.y, Rect.getWidth(), Rect.getHeight());
                if(b.overlaps(tmp)) {
                    while(!b.overlaps(tmp)) {
                        tmp.setPosition(xx + Math.signum(Vel.x), yy + Vel.y);
                        Pos.x += Math.signum(Vel.x);
                    }
                    this.Vel.x = -Vel.x * 0.1f;
                }
              
                xx = Pos.x - Rect.getWidth()/2;
                yy = Pos.y - Rect.getHeight()/2;
                tmp = new Rectangle(xx, yy + Vel.y, Rect.getWidth(), Rect.getHeight());
                if(b.overlaps(tmp)) {
                    while(!b.overlaps(tmp)) {
                        tmp.setPosition(xx, yy + Math.signum(Vel.y));
                        Pos.y += Math.signum(Vel.y);
                    }
                    this.Vel.y = -Vel.y * 0.1f;
                }

                if (b.overlaps(new Rectangle(Pos.x + gravDir.x, Pos.y + gravDir.y, W,H))) {
                    onBlock = true;
                }
        }
   
    public Vector2 getPos() {
        return this.Pos;
    }

    public Vector2 getVel() {
        return this.Vel;
    }

    public final void setPos(Vector2 pos) {
        this.Pos = pos;
    }

    public final void setVel(Vector2 vel) {
        this.Vel = vel;
    }
}
```

Wie gesagt sollen Klassen die Methoden der Oberklasse überschreiben aber nicht gegenseitig


----------



## mrBrown (5. Feb 2019)

Kim_Dotcom hat gesagt.:


> Wie gesagt sollen Klassen die Methoden der Oberklasse überschreiben aber nicht gegenseitig


Tun sie nicht 


Wie vermutet, ist die Vector2-Klasse, bzw deren Nutzung, das Problem.


```
Bullet b = new Bullet();
            Vector2 v = player.getPos(); //v ist das Vektor-Object der Spieler-Position
            v.add(new Vector2(200,100)); // Du veränderst v, welches die Position des Spielers ist
            b.create(v); // v wird die Position von b, und ist gleichzeitig immer noch die Position des Spielers 
            b.setVel(player.getVel()); // hier passiert das gleiche für die Geschwindigkeit, b und player haben denselben Vektor
            gameobject.add(b);
```

Lösungen gibt es zwei: Entweder vor jeder Zuweisung erst eine Kopie des Vektors machen und diese nutzen.
Oder Vektor2 immutable machen, das verhindert diese Fehlerquelle gänzlich.


----------



## Kim_Dotcom (5. Feb 2019)

Nein das hat nix gebracht, ich hatte eh noch Fehler drin Im Code, wie falsche privates. Hab gestern noch rumgemurkst und so hier gepostet. Aber ich vermute es hat was mit der ArrayList für Gameobjects zutun. Wenn ich bei

```
for (Gameobject obj : gameobject) {
            for (Rectangle b : blocks) {
                obj.collisionCheck(b);
            }
            obj.action(); //ohne dass hat Bullet seine richtige Pos
            if(delete == true) destroy.add(obj);
            delete = false;
        }
```

das obj. Action rausnehme nimmt der Spieler nicht mehr den Platz der Bullet ein dafür folgt die Kamera der Bullet und nicht mehr dem Player. Als ob die neu erstelle Bullet dem Player den "Platz klauen" würde. Wenn ich der Variable Player einen Verweis zur Charakterklasse gebe und dann Gameobjects. add(Player) mache, dann verweist doch der Eintrag der ArrayList auf den Player. Vll stimmt was mit meiner ArrayList nicht


----------



## mrBrown (5. Feb 2019)

Kim_Dotcom hat gesagt.:


> Nein das hat nix gebracht



Was hat nichts gebracht?

Wenn dein Code jetzt anders aussieht, dann Poste doch deinen aktuellen Code...



Kim_Dotcom hat gesagt.:


> Aber ich vermute es hat was mit der ArrayList für Gameobjects zutun.


Ich vermute nicht, ich vermute da weiterhin Probleme mit den Vektoren, die zumindest in deinem geposteten Code auf jeden Fall auftreten.


----------



## Kim_Dotcom (5. Feb 2019)

Mutterklasse  

```
class Gameobject {
    Vector2 Pos;
    Vector2 Vel;
    Sprite spr;
   
    public void create(Vector2 pos) {
       
    }
   
    public void draw() {
       
    }

    public void action() {
       
    }

    public void collisionCheck(Rectangle b) {
       
    }

    public Vector2 getPos() {
        return this.Pos;
    }

    public Vector2 getVel() {
        return this.Vel;
    }

    public void setPos(Vector2 pos) {
        this.Pos = pos;
    }

    public void setVel(Vector2 vel) {
        this.Vel = vel;
    }
}
```

Charakter 

```
public class Charakter extends Gameobject
{ 
    float s;
    float W;
    float H;
    int walkSpd;
    int maxSpd;
    float fricStart;
    float fric;
    int grav;
    Vector2 gravDir;
    int jumpSpd;
    boolean onBlock;
    boolean onPlatform;
   
    Rectangle Rect;
    Sprite spr2;
    TextureRegion ani;
    float time;
    float scale;
    float rot;
    boolean[][] colMap;

    public void create(Vector2 pos) {
        this.setPos(pos);
        this.setVel(new Vector2(0,0));
        s = 0.4f;
        W = 50 * s;
        H = 100 * s;
        walkSpd = 15;
        maxSpd = 20;
        jumpSpd = 40;
        grav = 30;
        gravDir = new Vector2(0,-1);
        fricStart = 9f;
        fric = fricStart;
        onBlock = false;
        onPlatform = false;
      
        spr = new Sprite(MyGdxGame.playerTex);
        scale = 0.2f;
        rot = 0;
        this.spr.setCenter(Pos.x,Pos.y);
        this.spr.setScale(scale);
        Rect = new Rectangle(0,0, 30,30);
        ani = MyGdxGame.playerAni.getKeyFrame(0);
        time = 0;
        spr2 = new Sprite(ani);
        spr2.setCenter(Pos.x,Pos.y);
        spr2.setScale(scale);
    }
  
    public void draw() {
        //Player
        spr2.draw(MyGdxGame.batch);
        this.spr.draw(MyGdxGame.batch);
    }

    public void action()
    { 
        Vector2 v = this.getPos();
        v.add(this.getVel());
        this.setPos(v);
        this.spr.setCenter(v.x,Pos.y);
        this.spr.setRotation(MyGdxGame.playerTheta);
        time += Gdx.graphics.getDeltaTime();
        ani = MyGdxGame.playerAni.getKeyFrame(time, true);
        spr2.setRegion(ani);
        spr2.setCenter(Pos.x, Pos.y);
        spr2.setRotation(MyGdxGame.playerTheta);
       
        if(!onBlock) {
            Vector2 g = new Vector2(gravDir.x * grav * Gdx.graphics.getDeltaTime(),
                                    gravDir.y * grav * Gdx.graphics.getDeltaTime());
            //Vel.add(g);
        }
    }

    public void collisionCheck(Rectangle b)
    {
            onBlock = false;
            this.Vel.x = MathUtils.clamp(Vel.x, -200, 200);
            this.Vel.y = MathUtils.clamp(Vel.y, -200, 200);
               
                float xx = Pos.x - Rect.getWidth()/2;
                float yy = Pos.y - Rect.getHeight()/2;
                Rectangle tmp = new Rectangle(xx + Vel.x, yy + Vel.y, Rect.getWidth(), Rect.getHeight());
                if(b.overlaps(tmp)) {
                    while(!b.overlaps(tmp)) {
                        tmp.setPosition(xx + Math.signum(Vel.x), yy + Vel.y);
                        Pos.x += Math.signum(Vel.x);
                    }
                    this.Vel.x = -Vel.x * 0.1f;
                }
              
                xx = Pos.x - Rect.getWidth()/2;
                yy = Pos.y - Rect.getHeight()/2;
                tmp = new Rectangle(xx, yy + Vel.y, Rect.getWidth(), Rect.getHeight());
                if(b.overlaps(tmp)) {
                    while(!b.overlaps(tmp)) {
                        tmp.setPosition(xx, yy + Math.signum(Vel.y));
                        Pos.y += Math.signum(Vel.y);
                    }
                    this.Vel.y = -Vel.y * 0.1f;
                }

                if (b.overlaps(new Rectangle(Pos.x + gravDir.x, Pos.y + gravDir.y, W,H))) {
                    onBlock = true;
                }
        }
   
    public Vector2 getPos() {
        return this.Pos;
    }

    public Vector2 getVel() {
        return this.Vel;
    }

    public void setPos(Vector2 pos) {
        this.Pos = pos;
    }

    public void setVel(Vector2 vel) {
        this.Vel = vel;
    }
}
```

Bullet 

```
public class Bullet extends Gameobject
{ 
    Rectangle Rect;

    public void create(Vector2 pos) {
        spr = new Sprite(MyGdxGame.bulletTex);
        this.spr.setCenter(pos.x,pos.y);
        this.setPos(pos);
        this.setVel(new Vector2(0,0));
        Rect = new Rectangle(0,0,15,15);
    }
  
    public void draw() {
        this.spr.draw(MyGdxGame.batch);
    }
  
    public void action() {
        Vector2 v = getPos();
        v.add(this.getVel());
        this.setPos(v);
        this.spr.setCenter(v.x,v.y);
        Rect.setCenter(Pos.x,Pos.y);
    }
  
    public void collisionCheck(Rectangle b) {
        if(Rect.overlaps(b)) {
           MyGdxGame.delete = true;
        }
    }

    public Vector2 getPos() {
        return this.Pos;
    }

    public Vector2 getVel() {
        return this.Vel;
    }

    public void setPos(Vector2 pos) {
        this.Pos = pos;
    }

    public void setVel(Vector2 vel) {
        this.Vel = vel;
    }
}
```
 
Und Haupklasse des Spiels  


Spoiler





```
public class MyGdxGame implements ApplicationListener
{ 
    long lastTimeCounted;
    float sinceChange;
    float frameRate;
    BitmapFont font;
    GUI gui;
    boolean[] pressed;

    OrthographicCamera cam;
    float camW;
    float camH;

    Texture texture;
    ShapeRenderer shape;
    static SpriteBatch batch;

    ArrayList<Rectangle> blocks;
    ArrayList<Gameobject> gameobject;
    ArrayList<Gameobject> destroy;
    static boolean delete;

    static Vector2 playerSpd;
    static float playerTheta;
    Charakter player;
    Pixmap playerPix;
    static Texture playerTex;
    static Animation playerAni;
    Texture playerLegs1Tex;
    Texture playerLegs2Tex;
    Texture playerLegs3Tex;
    Texture playerLegs4Tex;
    static Texture bulletTex;
   
    static Texture mBlue1Tex;
    static Texture mBlue2Tex;

    static Animation mGreenAni;
    Texture mGreen1Tex;
    Texture mGreen2Tex;
    Texture mGreen3Tex;
    Texture mGreen4Tex;

    static Animation mYellowAni;
    Texture mYellow1Tex;
    Texture mYellow2Tex;
    Texture mYellow3Tex;
    Texture mYellow4Tex;
  
    int terrainW;
    int terrainH;
    int S;
    LevelLoader terrain;

    @Override
    public void create()
    { 
        FrameRate();
   
        cam = new OrthographicCamera();
        camConfig();
       
        gui = new GUI();
        gui.Controller();
        pressed = new boolean[20];
        for(int i=0; i<20; i++) pressed[i] = false;
       
        shape = new ShapeRenderer();
        batch = new SpriteBatch();
      
        terrain = new LevelLoader();
        S = 32;
        terrain.create(0);
        terrainW = terrain.map.getWidth();
        terrainH = terrain.map.getHeight();

        blocks = new ArrayList();
        gameobject = new ArrayList();
        destroy = new ArrayList();
       
        delete = false;
       
        playerSpd = new Vector2(0,0);
        playerTheta = 0;
        player = new Charakter();
        playerPix = new Pixmap(Gdx.files.internal("PNG/player1.png"));
        playerTex = new Texture(playerPix);
        playerLegs1Tex = new Texture(Gdx.files.internal("PNG/legs1.png"));
        playerLegs2Tex = new Texture(Gdx.files.internal("PNG/legs2.png"));
        playerLegs3Tex = new Texture(Gdx.files.internal("PNG/legs3.png"));
        playerLegs4Tex = new Texture(Gdx.files.internal("PNG/legs4.png"));
        TextureRegion t1 = new TextureRegion(playerLegs1Tex);
        TextureRegion t2 = new TextureRegion(playerLegs2Tex);
        TextureRegion t3 = new TextureRegion(playerLegs3Tex);
        TextureRegion t4 = new TextureRegion(playerLegs4Tex);
        TextureRegion[] t = {t1, t2, t3, t4};
        playerAni = new Animation(0.1f, t);
        playerAni.setPlayMode(Animation.PlayMode.LOOP_PINGPONG);
        player.create(new Vector2(terrain.plStartX,terrain.plStartY));
        gameobject.add(player);
   
        bulletTex = new Texture(Gdx.files.internal("PNG/bullet1.png"));
   
        mBlue1Tex = new Texture(Gdx.files.internal("PNG/Monsters/mBlue1.png"));
        mBlue2Tex = new Texture(Gdx.files.internal("PNG/Monsters/mBlue2.png"));
   
        mGreen1Tex = new Texture(Gdx.files.internal("PNG/Monsters/mGreen1.png"));
        mGreen2Tex = new Texture(Gdx.files.internal("PNG/Monsters/mGreen2.png"));
        mGreen3Tex = new Texture(Gdx.files.internal("PNG/Monsters/mGreen3.png"));
        mGreen4Tex = new Texture(Gdx.files.internal("PNG/Monsters/mGreen4.png"));
        TextureRegion m1 = new TextureRegion(mGreen1Tex);
        TextureRegion m2 = new TextureRegion(mGreen2Tex);
        TextureRegion m3 = new TextureRegion(mGreen3Tex);
        TextureRegion m4 = new TextureRegion(mGreen4Tex);
        TextureRegion[] m = {m1, m2, m3, m4};
        mGreenAni = new Animation(0.1f, m);
        mGreenAni.setPlayMode(Animation.PlayMode.LOOP_PINGPONG);
       
        mYellow1Tex = new Texture(Gdx.files.internal("PNG/Monsters/mYellow1.png"));
        mYellow2Tex = new Texture(Gdx.files.internal("PNG/Monsters/mYellow2.png"));
        mYellow3Tex = new Texture(Gdx.files.internal("PNG/Monsters/mYellow3.png"));
        mYellow4Tex = new Texture(Gdx.files.internal("PNG/Monsters/mYellow4.png"));
        TextureRegion mm1 = new TextureRegion(mYellow1Tex);
        TextureRegion mm2 = new TextureRegion(mYellow2Tex);
        TextureRegion mm3 = new TextureRegion(mYellow3Tex);
        TextureRegion mm4 = new TextureRegion(mYellow4Tex);
        TextureRegion[] mm = {mm1, mm2, mm3, mm4};
        mYellowAni = new Animation(0.1f, mm);
        mYellowAni.setPlayMode(Animation.PlayMode.LOOP_PINGPONG);
       
    }

    @Override
    public void render()
    { 
        Vector2 plPos = player.getPos();
        float viewX = plPos.x;// - camW/2;
        float viewY = plPos.y;// - camH/2;
        Vector2 vtmp = new Vector2(cam.position.x, cam.position.y);
        vtmp.lerp(new Vector2(viewX, viewY), 0.3f);
        cam.position.x = vtmp.x;
        cam.position.y = vtmp.y;
        cam.update();
   
        Gdx.gl.glClearColor(0.6f, 0.5f, 0.3f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
   
        //////// blocks drawing ////////
        batch.setProjectionMatrix(cam.combined);
        batch.begin();
        terrain.draw(batch, (int)((viewX-camW/2)/S-4), (int)((viewY-camH/2)/S-4), (int)camW/S+8,(int)camH/S+8);
        //Charas
        for (Gameobject obj : gameobject) {
            obj.draw();
        }
        batch.end();
   
        //FPS
        update();
        gui.camGui.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        batch.setProjectionMatrix(gui.camGui.combined);
        batch.begin();
        font.draw(batch, (int)frameRate + " fps", 5, Gdx.graphics.getHeight() - 5);
        batch.end();
        //Buttons
        pressed = gui.draw();
       
        ///////// Collision Checking ////////
        blocks.clear();
        int ii = (int)(viewX/S)-4;
        int ii2 = ii + (int)(camW/S)+8;
        int jj = (int)(viewY/S)-4;
        int jj2 = jj + (int)(camH/S)+8;
        ii = MathUtils.clamp(ii, 0, terrain.W);
        ii2 = MathUtils.clamp(ii2, 0, terrain.W);
        jj = MathUtils.clamp(jj, 0, terrain.H);
        jj2 = MathUtils.clamp(jj2, 0, terrain.H);
        for(int i=ii; i<ii2; i++) {
            for(int j=jj; j<jj2; j++) {
                if(terrain.block[i][j] > 0) {
                      blocks.add(new Rectangle(i*S,j*S, S,S));
                }
            }
        }
       
        ////////////////////////////
        ////// So lassen !!!!! /////
        ////////////////////////////
       
        //Player Control
        Vector2 plVel = player.getVel();
        plVel.add(playerSpd);
        player.setVel(plVel); //Methode fur MyGdxGame / pos etc. private
        playerSpd = new Vector2(0,0);
   
        if(pressed[1] == true) {
            Bullet b = new Bullet();
            Vector2 v = player.getPos();
            v.add(new Vector2(200,100));
            b.create(v);
            v = new Vector2(300,0);
            b.setVel(v);
            gameobject.add(b);
        }
       
        /*if(pressed[0]==true) {
            Vector2 speed = new Vector2(-c.gravDir.y * c.walkSpd * Gdx.graphics.getDeltaTime(),
                                        -c.gravDir.x * c.walkSpd * Gdx.graphics.getDeltaTime());
            c.Vel.x -= speed.x;
            c.Vel.x = MathUtils.clamp(c.Vel.x, -c.maxSpd, c.maxSpd);
            c.Vel.y -= speed.y;
            c.Vel.y = MathUtils.clamp(c.Vel.y, -c.maxSpd, c.maxSpd);
            int xx = (int)c.Pos.x / S;
            int yy = (int)c.Pos.y / S;
            /*if(terrain.block[xx][yy] > 3 && terrain.block[xx-(int)c.gravDir.x][yy-(int)c.gravDir.y] < 4) {
                c.Pos.x -= c.gravDir.x * (S+2);
                c.Pos.y -= c.gravDir.y * (S+2);
            }*/
        /*}
        if(pressed[0]==true) {
            Vector2 speed = new Vector2(-c.gravDir.y * c.walkSpd * Gdx.graphics.getDeltaTime(),
                                        -c.gravDir.x * c.walkSpd * Gdx.graphics.getDeltaTime());
            c.Vel.x += speed.x;
            c.Vel.x = MathUtils.clamp(c.Vel.x, -c.maxSpd, c.maxSpd);
            c.Vel.y += speed.y;
            c.Vel.y = MathUtils.clamp(c.Vel.y, -c.maxSpd, c.maxSpd);
            int xx = (int)c.Pos.x / S;
            int yy = (int)c.Pos.y / S;
            /*if(terrain.block[xx][yy] > 3 && terrain.block[xx-(int)c.gravDir.x][yy-(int)c.gravDir.y] < 4) {
                c.Pos.x -= c.gravDir.x * (S+2);
                c.Pos.y -= c.gravDir.y * (S+2);
            }*/
        /*}
        if(pressed[0]==true) {
            c.Vel.sub(c.gravDir.x * c.jumpSpd * Gdx.graphics.getDeltaTime(),
                      c.gravDir.y * c.jumpSpd * Gdx.graphics.getDeltaTime());
        }*/
       
        //////////////////////////////////
        for (Gameobject obj : gameobject) {
            for (Rectangle b : blocks) {
                obj.collisionCheck(b);
            }
            obj.action();
            if(delete == true) destroy.add(obj);
            delete = false;
        }
        for (Gameobject obj : destroy) {
            gameobject.remove(obj);
        }
    }

    @Override
    public void dispose()
    {
    }

    @Override
    public void resize(int width, int height)
    {
        camConfig();
    }

    @Override
    public void pause()
    {
    }

    @Override
    public void resume()
    {
    }

    public void update() {
        long delta = TimeUtils.timeSinceMillis(lastTimeCounted);
        lastTimeCounted = TimeUtils.millis();

        sinceChange += delta;
        if(sinceChange >= 1000) {
            sinceChange = 0;
            frameRate = Gdx.graphics.getFramesPerSecond();
        }
    }

    public void FrameRate() {
        lastTimeCounted = TimeUtils.millis();
        sinceChange = 0;
        frameRate = Gdx.graphics.getFramesPerSecond();
        font = new BitmapFont();
        font.scale(2);
        batch = new SpriteBatch();
        cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    }

    public void camConfig() {
        float size = 1000;
        if (Gdx.graphics.getHeight() < Gdx.graphics.getWidth()) {
            camH = size * Gdx.graphics.getHeight() / Gdx.graphics.getWidth();
            camW = size;
            cam.setToOrtho(false, camW, camH);
        }
        else {
            camW = size * Gdx.graphics.getWidth() / Gdx.graphics.getHeight();
            camH = size;
            cam.setToOrtho(false, camW, camH);
        }
   
    }
}
```


----------



## mrBrown (5. Feb 2019)

Wie gesagt: Bullet und Player haben **dieselbe** Position.

Verschiebst du den Spieler, verschiebt sich auch die Kugel, weil sie den selben Vector2 als Position haben.
Das das beim Zeichnen besonders komisch wirkt, liegt daran, dass die Sprites noch mal eigene Positionen haben, die nicht immer der wirklichen Position des Objekts entsprechen.  

Lösungen siehe oben. Die einfachste wäre, in jedem Setter den Vektor zu kopieren, die schönere wäre unveränderliche Objekte zu nutzen.

(Ich kann’s gar nicht oft genug sagen: veränderbare Objekte sind scheiße, wenn sie Werte darstellen)


----------



## Kim_Dotcom (6. Feb 2019)

> ```
> Bullet b = new Bullet();
> Vector2 v = player.getPos(); //v ist das Vektor-Object der Spieler-Position
> v.add(new Vector2(200,100)); // Du veränderst v, welches die Position des Spielers ist
> ...


Das heißt v ist ein Verweis auf Player Position und wenn ich v ändere, ändert sich auch Player Position? Ich bin noch Javanoob und komme von einer anderen Programmiersprache. Dort wäre es nicht so. v ist doch eine neue Variable, wie kann die Player Position beeinflussen. Und was genau meinst du mit Setzer. Die Set Methode? Habe immutable gegoogelt. Einfach final davor machen isses doch auch nicht, ändern sich ja ständig die Werte.


----------



## JCODA (6. Feb 2019)

Kim_Dotcom hat gesagt.:


> v ist doch eine neue Variable, wie kann die Player Position beeinflussen.


v ist eine neue Variable, allerdings ist der Inhalt von v immer noch der selbe. Wenn du einen neuen Vektor erstellen möchtest, benötigst du das Schlüsselwort "new". 
Du kannst in deiner Vektorklasse die Attribute final machen. Wenn du nun einen Wert verändern möchtest, in zum Beispiel der add-Methode, dann liefert diese add-Methode einen neuen Vektor (new Vector2D(x+dx,y+dy) ) zurück.


----------



## VfL_Freak (6. Feb 2019)

Moin,



> Vector2 v = player.getPos(); //v ist das Vektor-Object der Spieler-Position


Also liefert Dein 'getPos' als Rückgabe einen Vektor ??

VG Klaus


----------



## mrBrown (6. Feb 2019)

VfL_Freak hat gesagt.:


> > Vector2 v = player.getPos(); //v ist das Vektor-Object der Spieler-Position
> 
> 
> Also liefert Dein 'getPos' als Rückgabe einen Vektor ??



Der Kommentar stammt von mir, und zumindest ich würde Vector2 als (zweidimensionalen) Vektor interpretieren.
Kann natürlich sein, dass Vector2 eigentlich eine Ananas sein soll, fände ich dann aber etwas verwirrend


----------



## VfL_Freak (6. Feb 2019)

Moin,


mrBrown hat gesagt.:


> Der Kommentar stammt von mir, und zumindest ich würde Vector2 als (zweidimensionalen) Vektor interpretieren.


Habe jetzt gerade erst gesehen, dass die 'getPos'-Methoden irgendwas von Typ 'Vector2' zurückgeben!
Auch ich hatte aufgrund der (sicher seltsamen) Namensgebung angenommen, dass es sich um einen 'echten' Vektor handelt - aber nichts genaues weiß man nicht 
(habe zumindest nicht Erklärendes gefunden)

VG Klaus


----------



## Kim_Dotcom (6. Feb 2019)

Vielen, vielen Dank, trotz meiner Verwunderung, genau die Sache mit dem Wörtchen New hat mein Problem gelöst. Es klappt. 

Vector2 ist eine 2d Vector Klasse der libgdx Bibliothek. Extra zum Spiele machen


----------



## mrBrown (6. Feb 2019)

Guck dir, bevor du dich an ein Spiel machst, erstmal Java Grundlagen an  Ohne Grundkenntnisse direkt mit sowas einsteigen ist ... gewagt.


----------

