2017-04-24 6 views
0

메신저를 꺼집니다하지만 난 할 때 (창의 왼쪽) 화면이 꺼집니다 여기 내 코드입니다 : 여기그것은 이미지를 90도 회전을 시도 화면

에 대한 링크입니다 내 이미지 : http://imgur.com/gallery/pQ85Z

바로 지금 메신저 'r'을 누르면 회전 시키려고하지만이 후에는 화면의 가장자리에 맞을 때 회전해야합니다.

PImage head; 
int fizzyX = 400; 
int fizzyY = 50; 
int movementX=0; 
int movementY=0; 
float x; 

void setup() { 
    size(800,800); 
    background(255); 
    head = loadImage("Fizzy.PNG"); 
} 

void collisionDetection() { 
    if (fizzyX == (750)) { 
    movementX=-1; 
    key = 'a'; 
    } 
} 



void keyPressed() { 
    if (key == 'a' || key == 'A') { 
    movementX = -1; 
    movementY = 0; 
    } 
    if (key == 'd' || key == 'D') { 
    movementX = 1; 
    movementY = 0; 
    } 
    if (key == 'w' || key == 'W') { 
    movementX = 0; 
    movementY = -1; 
    } 
    if (key == 's' || key == 'S') { 
    movementX = 0; 
    movementY = 1; 
    } 
    if (key == 'r') { 
    x = PI/2; 
    } 
} 

void draw() { 
    rotate(x); 
    background(255); 
    imageMode(CENTER); 
    image(head,fizzyX,fizzyY); 
    fizzyX+=movementX; 
    fizzyY+=movementY; 
    keyPressed(); 
    collisionDetection(); 
    translate(width/2,height/2); 

} 

답변

0

rotate() 기능은 기본적으로 0,0 인 원점 주위에 회전을 수행한다. 이렇게하면 이미지가 창의 왼쪽 위 모퉁이를 중심으로 회전하여 이미지가 화면 밖으로 나옵니다.

이미지를 가운데로 회전하려면 먼저 원점을 이미지의 가운데로 이동해야합니다. translate() 기능을 사용하여이 작업을 수행하지만 전에 회전해야합니다.

함께 퍼팅, 그 결과는 다음과 같습니다

void draw() { 

    background(255); 

    imageMode(CENTER); 
    translate(fizzyX, fizzyY); 
    rotate(x); 

    image(head,0,0); 

    fizzyX+=movementX; 
    fizzyY+=movementY; 
    collisionDetection(); 

} 

은 또한 수동으로 keyPressed() 함수를 호출 안됩니다. 처리가 당신을 위해 그것을 호출합니다. 내 제안

+0

내가 필요한 것을 정확히 답을 주셔서 감사합니다,하지만 난 이해가 안 돼요 fizzyX와 Y의 값 대신 화면 왼쪽 상단에? –

+0

@TimothyBolton 좌표가 ** 원점 **에 상대적이라는 것을 기억하십시오. translate()를 호출하면 원점이 fizzyX, fizzyY로 이동합니다. 그래서 우리가'100,100'에 무언가를 그렸을 때 모든 것은 원점에 상대적이기 때문에 사실상'fizzyX + 100, fizzyY + 100'이 될 것입니다. 그래서 'fizzyX, fizzyY'에 넣기 위해 뭔가를'0,0'에 그립니다. 말이 돼? –

0

더 자세한 :

당신은 RX가 HALF_PI 증가합니다 눌러

- 각 시간 당신이 pushMatrix를 사용해야 변환을 할

- 각 시간 (HALF_PI 처리에 정의 된 상수())와 popMatrix()를 사용하여 그 사이에있는 것만 변형합니다.

- 그림을 배치 할 원점을 놓은 다음 회전하여 그림을 0,0에 놓습니다. 이것은 수정 된 코드이며, 매력처럼 작동합니다.

-use PVector 가능하면,

-X는 rotationAngle이 더 나은 하나

는, 그것을 작동 시도 될 나쁜 이름이고, 쉽게 코드, 그 variableX 덜 복잡 이해 variableY하게 그 이해하기 쉽다. 대신 이미지의 이미지 (머리, 0,0) (머리, fizzyX, fizzyX)는 이전의 이미지를 넣지해야하는 이유

PImage head; 
PVector fizzy; 
PVector movement; 
float rotationAngle; 

void setup(){ 
    size(800,800); 
    fizzy=new PVector(400,50); 
    movement=new PVector(0,0); 
    rotationAngle=0; 
    background(255); 
    head = loadImage("Fizzy.png"); 
} 

void collisionDetection() { 
    if (fizzy.x == (750)) { 
    movement.set(-1,0); 
    } 
} 

void keyPressed() { 
    if (key == 'a' || key == 'A') { 
    movement.set(-1,0); 
    } 
    if (key == 'd' || key == 'D') { 
    movement.set (1,0); 
    } 
    if (key == 'w' || key == 'W') { 
    movement.set (0,-1); 
    } 
    if (key == 's' || key == 'S') { 
    movement.set (0,1); 
    } 
    if (key == 'r') { 
    rotationAngle+=HALF_PI; 
    } 
} 

void draw() { 
    background(255); 
    pushMatrix(); 
    translate(fizzy.x,fizzy.y); 
    rotate(rotationAngle); 
    imageMode(CENTER); 
    image(head,0,0); 
    popMatrix(); 

    fizzy.add(movement); 
    collisionDetection(); 
}