# Character Bild links/rechts



## Bud6y (24. Mrz 2009)

Hallo,

ich bin gerade dabei ein 2d Jump'n run zu programmieren... habe derzeit mit dem Gedanken gespielt ob es nicht vielleicht eine Möglichkeit gäbe das gleiche Bild das der Spieler hat wenn er nach rechts schaut dazu zu verwenden wenn er nach links schaut, demnach müsste man das Bild nur spiegeln...

würde mich freuen falls das so funktioniert und mir jemand dabei helfen könnte

gruß Lukas


----------



## Geeeee (24. Mrz 2009)

Affine Transformation
AffineTransform (Java 2 Platform SE 5.0)


----------



## Bud6y (24. Mrz 2009)

danke für die schnelle Antwort..... aber des ist noch zu "hoch" für mich.... kannst mir nicht schnell ein Beispiel zeigen


----------



## Steev (24. Mrz 2009)

Folgenden Methodenaufruf vor das zeichnen deines Spieler-Bildes

scale(-1, 1);


----------



## Bud6y (24. Mrz 2009)

hi,

ich habe das so gemacht aber es hat sich nichts geändert ?:

if(walking_left){
				AffineTransform af = new AffineTransform();
				af.scale(-1,1);
				g.drawImage(stance_1, x_pos_left, y_pos_up, parent);
			}


----------



## Geeeee (24. Mrz 2009)

noch ein g.setTransform(af) vor dem Bild.


----------



## Steev (24. Mrz 2009)

du kannst die Sklierung schon auf das Graphis2D-Objekt setzen.

Dann wird die Bildposition allerdings mitgespiegelt, daher musst du dann eine Translation verwenden. Etwa so:


        Graphics2D g2 = (Graphics2D) g;
        g2.translate(100, 50);
        g2.scale(-1, 1);
        g2.drawImage(img, 0, 0, this);


----------



## Bud6y (24. Mrz 2009)

hmm das funktioniert nicht mit g.setTransform(af)

also bei mir sieht es ungefähr so aus:
...
public void paint(Graphics g){
....
if(walking_left){
				AffineTransform af = new AffineTransform();
				af.scale(-1, 1);
				af.setTransform(af);
				g.drawImage(stance_1, x_pos_left, y_pos_up, parent);
			}
...
}


----------



## Geeeee (24. Mrz 2009)

Achso...nein.
Ich dachte es wäre dein Graphics2D Object.
also folgendermaßen dann:

public void paint(Graphics g){
Graphics2D playerGraphic = (Graphics2D) g;
if(walking_left){
AffineTransform af = new AffineTransform();
af.scale(-1, 1);
playerGraphic.setTransform(af);
playerGraphic.drawImage(stance_1, x_pos_left, y_pos_up, parent);
}
...
} 

du hattest oben auch noch af.setTransform(af) geschrieben, DAS würde auf keinen Fall was bringen


----------



## Bud6y (24. Mrz 2009)

jetzt verschwindet mein Character wenn ich ihn nach links bewege , und kommt auch nicht wieder wenn ich in die andere Richtung gehe...

hab das genauso gemacht, wie du es vorgeschlagen hattest.....


----------



## Geeeee (24. Mrz 2009)

was passiert denn, wenn du ohne AF das machst? Also direkt das Graphics2D objekt, wie steev es geschrieben hat.


----------



## Bud6y (24. Mrz 2009)

das gleiche ..... also das Bild verschwindet


----------



## Steev (24. Mrz 2009)

Das kommt daher, weil du meinen Code nicht eins zu eins umgesetzt hast.

Du brauchst eine Translation um die Koordinaten des Spielers, da dein Spieler sonst verschwindet.
Werf dein AffineTransformation-Objekt raus, da du es sowieso nicht benötist und mach mal genau das was ich weiter oben geschrieben habe.

Das mit dem verschwinden ist doch logisch, oder?

Du hast eine Position (100, 25) die du um (-1, 1) skalierst, also (100, 25) * (-1, 1).
Der neue Ort des Objektes ist damit an der Stelle (-100, 25)



public void paint(Graphics g){
Graphics2D playerGraphic = (Graphics2D) g;
if(walking_left){
playerGraphic.translate(x_pos_left, y_pos_up);
playerGraphic.scale(-1, 1);
playerGraphic.drawImage(stance_1, 0, 0, parent);
}
...
}


----------



## Bud6y (24. Mrz 2009)

hmm so wie ich das versteh bring ich das bild auf ne andere Stelle richtig???, hab das noch nicht ganz verstanden....

ich will des Bild sozusagen "spiegeln", was bringt mir dann die veränderung der Koordinaten?....


----------



## Steev (24. Mrz 2009)

Du spiegelst nicht nur das Bild, sondern das gesamte Koordinatensystem. Daher musst du die Koordinaten verändern, damit das Bild an derselben Stelle ist wie vorher auch. Hier ein Beispiel:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;


public class Test extends JFrame implements Runnable
{
    public static void main(String[] args)
    {
        new Test();
    }

    public Test()
    {
        super("Test");
        setBounds(100, 100, 400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        new Thread(this).start();
    }

    static BufferedImage img = new BufferedImage(25, 25, BufferedImage.TYPE_INT_ARGB);
    static {
        Graphics2D g2 = img.createGraphics();
        g2.setColor(Color.RED);
        g2.drawRect(0, 0, 24, 24);
        g2.fillOval(15, 7, 10, 10);
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.translate(100, 100);
        g2.scale(-1, 1);
        g2.drawImage(img, 0, 0, this);
    }

    @Override
    public void run()
    {
        while(true) {
            repaint();
            try {
                Thread.sleep(60);
            } catch (Exception e) {}
        }
    }
}


----------



## Bud6y (24. Mrz 2009)

gibt es den keine möglichkeit um nur das Bild zu Spiegeln?, weil das ist mir etwas zu kompliziert ~.~


----------



## Bud6y (24. Mrz 2009)

und ausserdem scheint dein prog irgendwi nix zu machen


----------



## Geeeee (24. Mrz 2009)

Wenns dir zu komplex ist, dann nimm einfach ein zweites Bild, was schon vorher im Speicher liegt. Bzw. das Bild sofort "aktivieren", wenn du links bzw. dann wieder rechts drückst. Dann muss es nicht während des paint-Aufrufs geladen werden.
Das hat den Vorteil, dass du dann bei langem Links-Laufen nicht immer wieder die Transformation berechnen musst.
Ist irgendwie ne Interpretationssache: Ich denke mir, die CPU-Belastung einer ständigen Berechnung ist größer als die Speicherbelastung durch ein zweites Bild.


----------



## Quaxli (24. Mrz 2009)

Würde ich auch so machen. Meist brauch man ja noch ein bißchen mehr als nur links und rechts, dann kann man das gleich in ein Bild packen.

Beispiel von mir:


----------



## slawaweis (24. Mrz 2009)

Bud6y hat gesagt.:


> gibt es den keine möglichkeit um nur das Bild zu Spiegeln?, weil das ist mir etwas zu kompliziert ~.~



es gibt mehrere Wege, ein Bild zu spiegeln. Der kürzeste geht über die Funktion:

Graphics (Java Platform SE 6)

[highlight="java"]
if(walking_left)
  {
  int ix = 0; // Image X
  int iy = 0; // Image Y
  int iw = stance_1.getWidth(null); // Image Width
  int ih = stance_1.getHeight(null); // Image Height
  g.drawImage(stance_1,
                    x_pos_left, y_pos_up, // X und Y der linken oberen Ecke der Zielfläche
                    x_pos_left+iw, y_pos_up+ih, // X und Y der rechten unteren Ecke der Zielfläche
                    ix+iw, iy, // rechte obere Ecke der Quelle wird auf die linke obere Ecke der Zielfläche gemappt
                    ix, iy+ih, // linke untere Ecke der Quelle wird auf die rechte untere Ecke der Zielfläche gemappt
                    parent);
  }
[/highlight]

Der beste Weg geht über eine gespiegelte Kopie im Speicher, falls man genug Speicher hat 

Slawa


----------

