Obejkt drehen & vorwärts bewegen

Status
Nicht offen für weitere Antworten.

zerni

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

v.jpg


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

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

es ist so:

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

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

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

Mitglied
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

Mitglied
:x :x :x

so lösung:

Code:
    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 -.-
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Slick2D SpriteSheet drehen in kuckrichtung Spiele- und Multimedia-Programmierung 1
M Kann nur nach rechts drehen Spiele- und Multimedia-Programmierung 7
Androbin mehr-dimensionale(n) Array(s) "drehen" Spiele- und Multimedia-Programmierung 8
A AffineTransform: Nach Drehen verschieben Spiele- und Multimedia-Programmierung 2
L Bild in Richtung Maus drehen Spiele- und Multimedia-Programmierung 4
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
R Drehen eines Bildes relativ zur Mauszeigerposition Spiele- und Multimedia-Programmierung 2
A Drehen von einem Image Spiele- und Multimedia-Programmierung 4
CookieSoft 3D Würfel will sich nicht drehen! [LWJGL] Spiele- und Multimedia-Programmierung 2
T JOGL 2D Objekte drehen rotate Spiele- und Multimedia-Programmierung 4
F 2D Shooter (von oben) Kugelberechnung und drehen der Figur Spiele- und Multimedia-Programmierung 17
R Koordinaten, Breite, Höhe nach drehen berechnen? Spiele- und Multimedia-Programmierung 3
M 2D - Bild um y-Achse drehen Spiele- und Multimedia-Programmierung 9
S Drehen nur um x-Achse Spiele- und Multimedia-Programmierung 5
T [java3d] Figur drehen Spiele- und Multimedia-Programmierung 16
B vertikal schreiben oder eine Bilddatei drehen? Spiele- und Multimedia-Programmierung 11
A "Textur-Achse" drehen. Spiele- und Multimedia-Programmierung 2
M um eigene Achse drehen Spiele- und Multimedia-Programmierung 3
B Bounds drehen sich nicht mit.... Spiele- und Multimedia-Programmierung 7
P Rechteck drehen Spiele- und Multimedia-Programmierung 3
P 2D Bild drehen Spiele- und Multimedia-Programmierung 4
N Rundenstrategiespiel - Problem beim Drehen eines Bildes Spiele- und Multimedia-Programmierung 18
K Bilder drehen Spiele- und Multimedia-Programmierung 5
R Bild drehen Spiele- und Multimedia-Programmierung 24
X Bild auf aktueller position drehen Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben