PDA

View Full Version : [java] AffineTransform


mone.java
06-08-2008, 13:30
Salve a tutti, il mio problema č questo:
Sto provando a rifare frozen-bubble (http://www.frozen-bubble.org/) in java, il problema č che per ruotare e posizionare il cannone uso AffineTransform con la seguente funzione:


/**
* Override del metodo draw della classe Entity utile a eseguire una trasformazione
* allo sprite, attraverso la classe AffineTransform, prima che esso venga disegnato
* nel contesto grafico
*
* @param g: contasto grafico nel quale diasegnare l'entiā
*/
public void draw(Graphics g) {
AffineTransform at = new AffineTransform();
//ruoto l'immagine di a gradi
at.setToRotation(Math.toRadians(cambiaAngoloDelCazzo(alpha)), 50,50);
//sposto lo sprite nelle coordinate indicate
at.setToTranslation(x,y);
//disegno lo sprite
sprite.draw(g, at, 0, 0);
}


la quale richiama la funzione draw della classe Sprite:


/**
* Disegna l'immagine dello sprite corrente all'interno del contesto grafico
* g passato come parametro, e nel caso il parametro at sia diverso da null
* verranno applicate le trasformazioni da esso definite
*
* @param g: contesto grafico dentro al quale disegnare
* @param at: Se diverso da null, l'immagine viene disegnata con le trasformazioni definite
* da questo parametro
* @param x: Posizione nelle ascisse
* @param y: Posizione nelle ordinate
*/
public void draw(Graphics g ,AffineTransform at ,int x ,int y) {
//se il parametro at č diverso da null viene disegnato lo sprite
//con le trasformazioni da esso definite
if (at == null) {
g.drawImage(image, x, y, null);
}
else {
Graphics2D g2d = (Graphics2D)g;
// abilita l'antialiasing
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(image, at, null);
}

}


ora il problema č che viene applicata solo una delle due trasformazione e cič la seconda che viene dichiarata (nel mio caso la translazione ma se metto dopo la rotazione viene eseguita solo quella).
Qualcuno di voi ha un'idea di cosa si possa trattare???
Ciao e grazie anticipatamente

andbin
06-08-2008, 14:53
ora il problema č che viene applicata solo una delle due trasformazione e cič la seconda che viene dichiarata (nel mio caso la translazione ma se metto dopo la rotazione viene eseguita solo quella).
Qualcuno di voi ha un'idea di cosa si possa trattare???Semplice: i metodi setToRotation() e setToTranslation() non sono "additivi" ma impostano completamente la matrice di trasformazione, nella sua interezza.

Devi usare rotate(), scale(), translate() ecc... che "concatenano" la trasformazione!!

mone.java
06-08-2008, 20:54
Grazie mille!!!!!!!!!!!!!!!!!!!!!