2015-10-02 2 views
1

Le problème est le suivant: J'ai une position de laisser dire un vaisseau spatial et la position doit être définie au milieu de celui-ci (par exemple en raison de problèmes de collision, etc.). Si le Spaceship ne serait pas mis en rotation, l'image serait tirée comme ceci:Comment dessiner une image pivotée depuis son centre dans Slick2D?

spaceship.draw(xPos - width/2 , yPos - height/2);

Le Spaceship est maintenant l'image dans Slick2D, qui a un angle aléatoire (0 < = angle < 360), et encore la la position doit être définie à son centre. Qu'est-ce que lisse fait au tirage au sort() - méthodes est la suivante:

enter image description here Il dessine un ovale autour de l'image (je suppose que la plus petite surface possible) et regarde alors où la ligne du centre au large 135 ° coupe l'ellipse (point rouge) et définit cela comme position.

Je veux encore dessiner centrée, ce qui signifie, je dois subract une valeur dans les deux dimensions (draw(xPos - xOff, yPos - yOff)):

enter image description here

Mais im pour calculer que désactivé! Quelqu'un peut-il m'aider s'il vous plaît? J'ai perdu deux jours pour comprendre ce que le problème est ...

Merci beaucoup et SALUE, r

Voici le code de rendu:

> public void render(GameContainer gc, StateBasedGame sbg, Graphics g) 
> throws SlickException{ 
>   
>   // This sets all rotation to the middle of the graphics. 
>   // The method works RELATIVE TO THE TOP-LEFT-CORNER OF THE IMAGE. 
>   skin.setCenterOfRotation(skin.getWidth() * Revolve.getGS()/2 + Revolve.getXShift(), 
>     skin.getHeight() * Revolve.getGS()/2 + Revolve.getYShift()); 
>   
>   // This sets the Angle properly 
>   skin.setRotation(angle); 
>   
>   // This draws the image: xPos and yPos define THE CENTER of the Image. 
>   skin.draw(
>    (float) (Revolve.getXShift() + Revolve.getGS() * xPos), 
>    (float) (Revolve.getYShift() + Revolve.getGS() * yPos), 
>    Revolve.getGS() 
>   ); 
>  
>   // Draws the xPos and yPos of the Ship 
>   g.setColor(Color.white); 
>   g.drawOval(Revolve.getXShift() + Revolve.getGS() * xPos, Revolve.getYShift() + Revolve.getGS() * yPos, 2, 2); 
>  } 
+0

Je ne suis pas sûr de comprendre ce qui est votre problème. Vous voulez dessiner une image sur un emplacement spécifique et que vous voulez faire pivoter? Si oui, je ne comprends pas pourquoi vous avez besoin d'un tel concept avancé. S'il vous plaît pouvez-vous essayer d'expliquer différemment? – RPresle

+0

Si vous voulez juste faire pivoter votre image, pourquoi la rotation ne correspond pas à vos besoins? – RPresle

+0

Désolé pour les 6 jours de congé, j'étais en vacances, et c'était super :-) Maintenant, au problème: je peux faire pivoter l'image, c'est facile. Mais après la rotation, je dois le dessiner (l'image pivotée) à une position spécifique (x, y). Donc, je dis image.draw (x, y), mais alors x et y ne sont pas au centre de l'image, mais en haut à gauche du centre. Pour être précis: au point rouge dessiné ci-dessus. Mais je veux définir le centre de l'image pivotée, et là il doit être dessiné. Est-ce plus clair? Sinon, dites-moi s'il vous plaît!Salutations, r –

Répondre

1

Eh bien tout devient clair avec un code.

Voici une solution:

@Override 
public void init(GameContainer container) throws SlickException 
{ 
    this.character = new Image("/home/ronan/Images/20150517010612.jpg"); 
    this.scale = 0.5f; 
    // When you set your center of rotation is is relative to your image ONLY. 
    // this will make the center of my image to be the center of the rotation 
    // NOTHING more to add 
    this.character.setCenterOfRotation((this.character.getWidth()/2)*this.scale, (this.character.getHeight()/2)*this.scale); 
} 

@Override 
public void update(GameContainer container, int delta) throws SlickException 
{ 
    this.rotation +=delta/10; 
    this.character.setRotation(this.rotation); 
} 

public void render(GameContainer container, Graphics g) throws SlickException 
{ 
    // Here I consider that my position is (500,500). then to draw it, I just substract hal the size of my image. 
    // It will draw from top-lefft corner but based on my center. 
    character.draw(500-(this.character.getWidth()/2)*this.scale, 500 - (this.character.getHeight()/2)*this.scale,this.scale); 
} 

Je sépare tout d'être clair.

Dans la méthode init, vous devez définir le centre de rotation. Ce centre est relatif à l'image, il suffit donc de diviser votre largeur par deux pour avoir la coordonnée du centre de votre image. quand ça marche, tu multiplies par ton échelle. Rien de plus à ajouter car c'est vraiment local pour votre image.

Dans la méthode de rendu, pour dessiner une image, c'est toujours à partir du coin supérieur gauche. Il suffit de soustraire la moitié de la largeur et la moitié de la hauteur pour utiliser votre centre. Il suffit d'adapter ce code au vôtre et tout devrait bien se passer. Demandez si vous avez besoin de plus de précision.

enter image description here enter image description here

+0

Bonjour RPresle (et d'autres qui cherchent de l'aide avec des problèmes similaires). Je l'ai fait, en fait tu l'as fait. J'ai utilisé votre code et cela a fonctionné, mais pas parfaitement depuis le début. Il y avait un petit décalage, mais je pourrais le corriger en impliquant la hauteur dans la ligne dans la méthode render() (il utilise deux fois la largeur, cela ne fonctionne que dans les images carrées). MERCI BEAUCOUP. –

+0

Je suis content que vous l'ayez compris. Je corrige mon code parce que c'est clairement une erreur. – RPresle