# Obejkt drehen & vorwärts bewegen



## zerni (20. Jan 2006)

Hi leute

bin gerade an nem game und habe folgendes Problem:

also ich habe ein objekt, das ich drehe. zum beispiel zu 45°, dann fahre ich vorwärts, aber beim vorwärts fahren muss ich ja die neuen koordinaten errechnen, weil ja eine schräge bewegung gemacht wird.

ich habe den Ansatz:







also ist: 
Vx = sin (alpha) * v
Vy = cos (alpha) * v

xn = x + Vx
yn = y + Vy

wenn man nun mal von den koordinaten (5/5) und dem winkel 45° ausgeht:

alpha = 45!;
x = 5
y = 5
v = 2

Vx = sin (45) * 2 = 1,7
Vy = cos(45) * 2 = 1,05

xn = 5 + 1,7 = 6,7
yn = 5 + 1,05 = 6,05

also (7/6), aber da es 45° sind müssten es doch wenn schon identische X & Y-Werte (6/6) sein oder??

habe natürlich alles im Kreisbogen berechnet, gibt es so einen modus eigentlich auch in java? das würde nämlich auch was erklären^^


----------



## zerni (20. Jan 2006)

prob gelöst THX @illuvatar


----------



## MPW (20. Jan 2006)

kapier ich das jetzt....Illuvatar hat doch garnix gepostet....


----------



## lin (20. Jan 2006)

über chat wahrscheinlich


----------



## zerni (21. Jan 2006)

richtig, werde gleich noch die richtige lösung posten


----------



## zerni (21. Jan 2006)

ok hab noch nicht ganz die lösung, aber en neues prob 

es ist so:


```
public void turn(String direction){ // Drehen des Objekts
        if (direction == "left") this.angle = -Math.PI/36;
        if (direction == "right")this.angle = Math.PI/36;  
        this.angle_total += this.angle; // Aktualisieren des Winkels
    }
    
    public void movey(String direction){
        if (direction == "forward") {
                this.vy = this.v * (float)Math.cos(this.angle_total) * (-1);  //Geschwindigkeit in Y
                this.vx = this.v * (float)Math.sin(this.angle_total);         //Geschwindigkeit in X
                this.dx = this.vx*this.t;                                     //DeltaX
                this.dy = this.vy*this.t;                                     //DeltaY
        } 
        if (direction == "backward"){
                this.vy = this.v * (float)Math.cos(this.angle_total);
                this.vx = this.v * (float)Math.sin(this.angle_total);
                this.dx = this.vx * this.t;
                this.dy = this.vy * this.t;
        }
    }
    
    public void draw(java.awt.Graphics g){
        java.awt.Graphics2D g2d = (java.awt.Graphics2D)g;
        if(this.angle != 0)             {tx.rotate(this.angle, this.x+5, this.y+10); this.angle = 0;} // drehen des Objekts
        if(this.dx != 0 || this.dy != 0){tx.translate(this.dx,this.dy); this.dx = 0; this.dy = 0;}    // verschieben des Objekts
        g2d.setColor(new java.awt.Color(0,0,0));
        g2d.setTransform(tx);                                                                         // transform anwenden
        g2d.fill(r);                                                                                  // maaaaallllleeeeeen!!!!
    }
```

ich drücke auf eine pfeiltaste, z.b. links und dann wird turn ausgeführt. danach fahre ich vorwärts und muss dafür ja den neuen punkt berechnen! da stimmt so weit eigentlich alles. hab ich sogar mitm debugger überprüft!

wenn ich aber nun das objekt mit tx.translate(dx,dy) verschieben will macht er zicken!

wenn ich das objekt grafisch um 90° drehe und dann vorwärts fahre fährt er stattdessen 180° vorwärts :/

obwohl bei translate als dx = 2 und dy = 1,41e-14(also = 0) steht!

es ist mir ein rätsel, warum er runterfährt wenn in richtung dy garnicht verschoben wird!?


----------



## 0xdeadbeef (21. Jan 2006)

Warum benutzt Du translate und veschiebst nicht einfach die Koordinaten, an denen Du das Objekt auf den Bildschirm malst? Durch die Translation + Rotation veschiebst Du vermutlich auch den Drehpunkt (ohne näher darüber nachgedacht zu haben). Ich würde die affine Transformation nur für die Rotation verwenden.

Nebenbei: ich würde aus Geschwindigkeitsgründen Cos und Sin tabellieren. Also z.B. je 36 Werte für von 0 bis 350 Grad in 10°-Schritten beim Programmstart ausrechnen und ablegen. 

Und wenn Du nur ein Objekt mit 36 Rotationphasen hast, wäre es günstig, auch das Objekt bei seiner Initialisierung in allen 36 Roationsphasen zu berechnen und abzulegen. Dnan mußt Du für den entsprechenden Winkel nur noch auf einen das richtige Bild aus dem Array holen.


----------



## Illuvatar (21. Jan 2006)

Das erste was mir auffällt, ist dass du beim bewegen im backward Zweig das x noch irgendwie mit -1 malnehmen musst oder so, zumindest, ist das noch gleich wie bei forward.

Ansonsten kann ich mich nur 3735928559 (0xdeadbeef) anschließen.


----------



## zerni (21. Jan 2006)

das problem ist folgendes, mit rotate & translate drehe bzw bewege ich den gesamten untergrund mit, in diesem fall ein Panel!

wenn ich aber nun nur rotate nehme, aber sonst das objekt per koordinaten bewege, verlässt das objekt irgendwann das panel und es zieht so komische spuren hinter sich her! natürlich könnte ich auch das panel ständig neu malen, aber ich denke das zieht auf dauer zu viel cpu, weil es nicht das einzige ist, was gemalt wird.

ach und den drehpunkte verschiebe ich nicht, das geht schon.

probe: http://zer-design.de/PowerRacing/build/THEGAME.html [EDIT: ok, das geht bei mir grad garnicht :/ ]

aber gibt es nun eigentlich eine logische erklärung für mein Problem? oder hab ich die translate methode falsch verstanden?!

wegen den 36 einteilungen: danke werd ich realisieren 


noch eine Frage: ich krieg es nicht hin Bilder einzügen 



> Oben Deklariert: Image bg;
> Im Konstruktor geladen: bg = Toolkit.getDefaultToolkit().getImage("car.jpg");
> in der Draw methode gemalt: g.drawImage( this.bg, 0, 0, this );



ist da ein fehler dran?


----------



## zerni (21. Jan 2006)

:x  :x  :x 

so lösung:


```
public void turn(String direction){ // Drehen des Objekts
        if (direction == "left") this.angle = -Math.PI/36;
        if (direction == "right")this.angle = Math.PI/36;  
        this.angle_total += this.angle; // Aktualisieren des Winkels
    }
    
    public void movey(String direction){
        if (direction == "forward") tx.translate(0,-this.v);
        if (direction == "backward")tx.translate(0,this.v);

    }

    
    public void draw(java.awt.Graphics g){
        java.awt.Graphics2D g2d = (java.awt.Graphics2D)g;
        if(this.angle != 0){tx.rotate(this.angle, this.x+5, this.y+10); this.angle = 0;}
        g2d.setColor(new java.awt.Color(0,0,0));
        r.setRect(this.x, this.y, this.w, this.h);
        g2d.setTransform(tx);                                                                         // transform anwenden
        g2d.fill(r);                                                                                  // maaaaallllleeeeeen!!!!
    }
```

man man man, ich könnt mein kopf zwichen dir tür stecken, wegen dem mist -.-


----------

