Objekte synchronisieren Variablen

Kim_Dotcom

Mitglied
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.?
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
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

Mitglied
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

Mitglied
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:
Java:
For(Gameobjects g1 : Beweglich) {
For(Gameobjects g2 : Beweglich) {
g1. testCollision(g2)
}}

Sonst sind das ja endlos viele Schleifen ineinander.
 

Kim_Dotcom

Mitglied
Mutterklasse:
Code:
class Gameobject {
   
    public void create(Vector2 pos) {
       
    }
   
    public void draw() {
       
    }

    private void action() {
       
    }

    public void collisionCheck(Rectangle b) {
       
    }
}

Kinklasse Bullet
Code:
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)
Code:
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

Super-Moderator
Mitarbeiter
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

Mitglied
Code:
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:
Code:
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

Super-Moderator
Mitarbeiter
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.

Java:
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

Mitglied
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
Code:
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

Super-Moderator
Mitarbeiter

Kim_Dotcom

Mitglied
Mutterklasse
Code:
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
Code:
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
Code:
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
Code:
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

Super-Moderator
Mitarbeiter
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

Mitglied
Code:
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);
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

Top Contributor
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

Top Contributor
Moin,
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 :D:p
(habe zumindest nicht Erklärendes gefunden)

VG Klaus
 

Kim_Dotcom

Mitglied
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

Super-Moderator
Mitarbeiter
Guck dir, bevor du dich an ein Spiel machst, erstmal Java Grundlagen an ;) Ohne Grundkenntnisse direkt mit sowas einsteigen ist ... gewagt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Wie bekomme ich eine Transition für alle Objekte zum stoppen? Spiele- und Multimedia-Programmierung 1
K Bewegte Objekte per Mausklick entfernen Spiele- und Multimedia-Programmierung 3
N Helden: Verschiedene Objekte oder konkrete Unterklassen Spiele- und Multimedia-Programmierung 1
gamebreiti Wie Objekte versenden und empfangen Spiele- und Multimedia-Programmierung 4
J Objekte übereinander lagern Spiele- und Multimedia-Programmierung 1
L JavaFX Objekte bewegen Spiele- und Multimedia-Programmierung 3
Q Mehr objekte darstellen als Pixel vorhanden Spiele- und Multimedia-Programmierung 6
lord239123 Minecraft Nur sichtbare Objekte rendern Spiele- und Multimedia-Programmierung 5
Z Objekte animieren mit Threads Spiele- und Multimedia-Programmierung 4
M Objekte verschwinden durch Explosion Spiele- und Multimedia-Programmierung 2
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
A JME3 will Blender/j3o Objekte nicht einladen Spiele- und Multimedia-Programmierung 3
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
T JOGL 2D Objekte drehen rotate Spiele- und Multimedia-Programmierung 4
D Objekte in weiter Entfernung flimmern / flackern Spiele- und Multimedia-Programmierung 2
G 3D-Objekte / Grafiken gesucht Spiele- und Multimedia-Programmierung 6
S Klickbare Objekte im Spiel Spiele- und Multimedia-Programmierung 8
T Java3D: Objekte platzieren und entfernen? Spiele- und Multimedia-Programmierung 7
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
L 3D Objekte in Java importieren Spiele- und Multimedia-Programmierung 2
M Java3D Picking - falsche Objekte werden gepickt Spiele- und Multimedia-Programmierung 3
P Erkennen auf welche Objekte gezeigt wird in JoGL Spiele- und Multimedia-Programmierung 6
T Selbst-handelnde Objekte im Client-Server Betrieb Spiele- und Multimedia-Programmierung 9
M Java3D Objekte entfernen und hinzufügen Spiele- und Multimedia-Programmierung 10
aze Java 3d Objekte überdecken 2d Komponenten Spiele- und Multimedia-Programmierung 7
aze Java 3D : 3D Objekte speichern und später wieder einlesen Spiele- und Multimedia-Programmierung 9
D Halbdurchsichtige Objekte Spiele- und Multimedia-Programmierung 17
F zu viele Objekte, Problem mit neuzeichnen. Spiele- und Multimedia-Programmierung 5
M Alle Objekte aus der SimpleUniverse entfernen Spiele- und Multimedia-Programmierung 2
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
B Position der ViewingPlatform und Visueller Objekte setzen Spiele- und Multimedia-Programmierung 3
B Isometrischer KartenEditor mit Animierten Objekte Spiele- und Multimedia-Programmierung 3
J 1x Punktlicht auf 5 Objekte benutzen Spiele- und Multimedia-Programmierung 17
F Maussteuerung-gezeichnete Objekte Spiele- und Multimedia-Programmierung 4
B Objekte zur Laufzeit verändern Spiele- und Multimedia-Programmierung 3
A durch Objekte hindurchzoomen Spiele- und Multimedia-Programmierung 2
S 3D Objekte ohne Java3D darstellen? Spiele- und Multimedia-Programmierung 10
J Zu viele Objekte - OutOfMemoryError Spiele- und Multimedia-Programmierung 3
L Objekte zentrieren Spiele- und Multimedia-Programmierung 2
G zur laufzeit objekte einfügen Spiele- und Multimedia-Programmierung 3
G 2D-Objekte werden nicht vollständig gezeichnet Spiele- und Multimedia-Programmierung 4
conan2 Objekte in richtiger Z-Reihenfolge zeichnen Spiele- und Multimedia-Programmierung 2
A Objekte nacheinander zeitgesteuert rotieren lassen Spiele- und Multimedia-Programmierung 4
H 3D Objekte ausfüllen Spiele- und Multimedia-Programmierung 3
T 3D-Objekte Laden Spiele- und Multimedia-Programmierung 3
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2
G Zugriff auf einzelne Objekte Spiele- und Multimedia-Programmierung 12
hdi mehrere Threads/Tasks in einem synchronisieren -> TaskPoo Spiele- und Multimedia-Programmierung 36
T Variablen übergabe fehlerhaft Spiele- und Multimedia-Programmierung 2
B Problem : Variablen werden vererbt Spiele- und Multimedia-Programmierung 7
B RPG - Problem : Instanzierte Variablen freigeben Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben