2017-02-19 1 views
0

Android Studio에서 화면 가운데를 회전하는 개체가있는 게임을 작업 중입니다. 내 문제는 개체를 회전 한 후 어떤 이유로 x 및 y 위치가 동일하게 유지 된 것입니다. 캔버스가 회전하고 있기 때문에 추측하고 있습니다. 캔버스에서 동일한 점이 남아 있기 때문입니다. 충돌 감지를 계산하려면 x와 y 좌표가 필요합니다. x와 y가 변경되지 않았다는 것을 깨달은 후에 나는 기본 trig를 사용하여 x와 y를 계산할 함수를 작성하려고 시도했지만 어떤 이유로 든 이상한 값을 뱉어 내고있었습니다 (또한 아래에 첨부되어 있습니다). 내 질문은 기본 캔버스에서이 개체의 x 및 y 위치를 어떻게 찾습니까? 고급 감사합니다, 코드는 아래 있습니다.Android Studio에서 회전 된 객체의 (x, y)를 어떻게 얻을 수 있습니까?

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

아래의 코드는 x와 y 좌표를 찾는 내 시도이지만 이상한 값만 나오고 문제를 찾을 수 없습니다. 이 코드는 저의 주요 클래스입니다.

`

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

'android.graphics.Matrix' API를 사용합니다 – pskink

+0

객체를 회전 시키지만 canvas.rotate()와 마찬가지로 x와 y를 같은 위치에 유지합니다. 기능. –

+0

실제로 달성하기를 원하십니까? 캔버스를 회전시킨 다음 무언가를 그린 다음 ...? – pskink

답변

0

봅니다 행렬을 볼 수 있습니다. 이것은 객체의 변형을 정의하는 더 좋은 방법입니다. 여기 https://en.m.wikipedia.org/wiki/Transformation_matrix 예 봐 : 당신에

클래스 Matrix3f, vec3f, 방법과 vec2f 변환, 반전, 곱하기 등이 직접 제공해야

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); 
    } 
는 (네트워크에서 코드 샘플을 많이 찾을 수 있습니다)

+0

행렬을 사용하여 회전을 구현하려고했지만 여전히 동일한 문제가 발생합니다. x와 y 위치는 바뀌지 않습니다. 위의 코드는 이해할 수 없습니다. 내가 내 코드에서 그것을 사용하려고하면 나는 백만개의 에러를 얻는다. ??? –

+0

이 코드는 행렬로 수행 할 수있는 작업의 샘플입니다. 이전 게시물의 링크를보고이 질문을 혼자서 공부하십시오. 아무도 당신을 도와주지 않으면 혼자서 이해하지 못한다. 네트워크에 많은 오픈 소스 게임 엔진이 있다고 생각합니다 (예 : 단일성). 그들을 사용하려고합니다. 좋은 것을 선택한 자기에 의해 엔진을 쓰고 싶다면 몇 가지 기본적인 것들을 배워야합니다. 행렬이 그 중 하나입니다. 행운을 빕니다. 내가 이전 게시물에서 사용한 클래스의 구현을 작성하길 원한다면 질문을 배우는 더 좋은 방법은 스스로 작성하는 것입니다. – user3811082

관련 문제