2017-02-19 14 views
0

Я работаю над игрой в Android Studio, у которой есть объект, вращающийся вокруг центра экрана. Моя проблема в том, что по какой-то причине после поворота объекта позиции x и y остались прежними (я предполагаю, потому что, поскольку холст вращается, он все еще имеет те же точки в этом холсте). Для расчета обнаружения столкновений мне нужны координаты x и y. Поняв, что x и y не изменились, я попытался написать функцию, которая вычисляла бы x и y с помощью основного триггера, но по какой-то причине она выплевывала странные значения (также прилагается ниже). Мой вопрос заключается в том, как найти положение x и y этого объекта в основном холсте? Спасибо в продвинутом виде, код ниже.Как я могу получить (x, y) объекта в Android Studio, который был повернут?

`private int x; private int y;

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(); 
} 

Код ниже моя попытка найти й и у координаты, но он плюет только странные значения, и я не могу найти проблему. Этот код - мой основной класс.

`

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

use 'android.graphics.Matrix' API – pskink

+0

Он вращает объект, но при этом сохраняет x и y в одном и том же месте, как и с canvas.rotate(); функция. –

+0

чего вы хотите достичь на самом деле? поверните холст, затем нарисуйте что-нибудь, затем ...? – pskink

ответ

0

Try посмотреть матрицы. Это лучшая практика для определения трансформации объекта. Посмотрите здесь https://en.m.wikipedia.org/wiki/Transformation_matrix Пример:

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); 
    } 

Классы Matrix3f, vec3f, vec2f с помощью методов Transform, Invert, Multiply и так далее вы должны предоставить сами (вы можете найти много примеров кода в сети)

+0

Я пытался реализовать вращения с использованием матриц, но я все еще получаю ту же проблему, положение x и y не изменяется, и я не понимаю вышеприведенный код. Когда я пытаюсь использовать его в своем коде, я получаю миллион и одну ошибку ??? –

+0

Этот код является образцом того, что вы можете делать с матрицами. Посмотрите на ссылку в моем предыдущем посте и изучите этот вопрос самостоятельно. Если вы этого не понимаете, никто вам не поможет. Я считаю, что в сети много движков с открытым исходным кодом (единство, например). Попытайтесь использовать их. Если вы хотите написать движок самостоятельно, это хорошо, но вам нужно изучить некоторые основные вещи. Матрицы - одна из них. Удачи. Если вы хотите, я напишу о реализации классов, которые я использовал в своем предыдущем посте, но я думаю, что лучший способ узнать вопрос - написать его самостоятельно – user3811082