2017-02-19 1 views
0

Je travaille sur un jeu dans Android Studio dans lequel un objet tourne autour du centre de l'écran. Mon problème est que pour une raison quelconque, après avoir fait tourner l'objet, les positions x et y sont restées les mêmes (je suppose que parce que la toile tourne, elle a toujours les mêmes points dans cette toile). J'ai besoin des coordonnées x an y pour calculer la détection de collision. Après avoir réalisé que x et y ne changeaient pas, j'ai essayé d'écrire une fonction qui calculerait le x et le y en utilisant le trig de base, mais elle crachait des valeurs étranges pour une raison quelconque (également ci-dessous). Ma question est comment puis-je trouver la position x et y de cet objet dans la toile principale? Merci à l'avance, le code est ci-dessous.Comment puis-je obtenir (x, y) d'un objet dans Android Studio qui a été pivoté?

`private int x; int y privé;

private int rotate; 
private int width; 
private int height; 

private int color = Color.rgb(226, 255, 243); 

private Paint paint = new Paint(); 

public Player(){ 
    rotate = 0; 
    width = Constants.width/10; 
    height = Constants.height/50; 
    x = Constants.width/2 - width/2; 
    y = Constants.height/2 + Constants.height/8; 
} 

public void setRotate(int rotate){ 
    this.rotate = rotate; 
} 
public int getRotate(){return rotate;} 

public int getX(){return x;} 
public int getY(){return y;} 
public int getWidth(){return width;} 
public int getHeight(){return height;} 

public void update(){ 
    if(rotate >= 360){ 
     rotate = 0; 
    } 
} 

public void draw(Canvas canvas){ 
    paint.setColor(color); 

    canvas.save(); 
    canvas.rotate(rotate, Constants.width/2, Constants.height/2); 
    canvas.drawRect(x, y, x + width, y + height, paint); 
    canvas.restore(); 
} 

Le code ci-dessous est ma tentative de trouver les coordonnées x et y, mais il ne recrache des valeurs étranges et je ne peux pas trouver le problème. Ce code est ma classe principale.

`

private int getPlayerX(int rotation){ 
    double angleA; 
    double angleC; 
    double sideC; 
    double sideA; 

    angleA = 180 - ((180 - rotation) + 90); 
    sideC = Constants.width/2 + Constants.height/8; 
    angleC = 180 - rotation; 

    sideA = ((Math.sin(angleA) * sideC))/(Math.sin(angleC)); 

    playerx = Constants.width/2 + (int) sideA; 

    return playerx; 
} 
private int getPlayerY(int rotation){ 
    double sideC; 
    double angleC; 
    double angleB; 
    double sideB; 

    sideC = Constants.width/2 + Constants.height/8; 
    angleC = 180 - rotation; 
    angleB = 90; 

    sideB = sideC * (Math.sin(angleB))/(Math.sin(angleC)); 

    playery = Constants.height + (int) sideB; 

    return playery; 
} 
+0

utilise l'API 'android.graphics.Matrix' – pskink

+0

Il fait pivoter l'objet tout en conservant le x et le y au même endroit, comme avec canvas.rotate(); fonction. –

+0

Que voulez-vous réaliser réellement? tourner la toile, puis dessiner quelque chose, alors ...? – pskink

Répondre

0

Essayez de regarder des matrices. C'est la meilleure pratique pour définir la transformation d'un objet. Regardez ici https://en.m.wikipedia.org/wiki/Transformation_matrix Exemple:

public Player(){ 
    //... 
    //matrix 3x3 with all transformations you need 
    Matrix3f m; 

    void rotate(float angle) { 
     Matrix3f rot = new Matrix3f(); 
     rot.data = {cos(angle), -sin(angle), 0.0, 
        sin(angle), cos(angle), 0.0, 
        0.0,  0.0,  1.0 } 
     m.Multiply(rot); 
    } 

    //get the world position of a local point 
    vec2f getWorld(vec2f inPt) { 
     vec3f p = vec3f(inPt.x, inPt.y, 1.0); 
     p = m.Transform(p); 
     return vec2f(p.x, p.y); 
    } 

    //get the local position of a world point 
    vec2f getLocal(vec2f inPt) { 
     Matrix3f invM = m.Invert(); 
     vec3f p = vec3f(inPt.x, inPt.y, 1.0); 
     p = invM.Transform(p); 
     return vec2f(p.x, p.y); 
    } 

Classes Matrix3f, vec3f, vec2f avec des méthodes Transform, inverti, Multiplier et ainsi de suite vous devez fournir par vous-même (vous pouvez trouver beaucoup d'exemples de code dans le réseau)

+0

J'ai essayé d'implémenter des rotations en utilisant des matrices mais je continue d'avoir le même problème, la position x et y ne change pas, et je ne comprends pas le code ci-dessus. Quand j'essaie de l'utiliser dans mon code, je reçois un million et une d'erreurs ??? –

+0

Ce code est l'exemple de ce que vous pouvez faire avec les matrices. Regardez le lien dans mon post précédent et étudiez cette question par vous-même. Si vous ne le comprenez pas par vous-même, personne ne vous aide. Je crois qu'il y a beaucoup de moteurs de jeu open source dans le réseau (l'unité par exemple). Essayez de les utiliser. Si vous voulez écrire le moteur par vous-même, c'est bien choisi, mais vous devez apprendre quelques choses de base. Les matrices sont l'une d'entre elles. Bonne chance. Si vous voulez, je vais écrire l'implémentation des classes que j'ai utilisées dans mon post précédent mais je pense que la meilleure façon d'apprendre la question est de l'écrire par moi-même – user3811082