스프라이트가 향하는 방향으로 어떻게 움직일 수 있습니까?


11

Java / Slick 2D를 사용하고 있습니다. 마우스를 사용하여 스프라이트를 회전시키고 화살표 키를 사용하여 스프라이트를 이동하려고합니다. 스프라이트가 아무 문제없이 회전하도록 할 수는 있지만, 예상 방향으로 움직일 수는 없습니다. "앞으로"를 누르면 스프라이트가 마우스를 향해 움직일 필요는 없습니다. 실제로 화면의 왼쪽으로 만 움직입니다. 많은 게임이이 스타일의 모션을 사용하기 때문에 이에 대한 표준 코드가 있어야합니다. 누구든지 삼각법이 무엇인지 나를 도울 수 있습니까? 감사

편집 : 회전 코드는 다음과 같습니다 ( /programming/12610320/why-is-my-image-rotating-off-center )

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

그리고 운동 코드. 화면 왼쪽으로 만 이동할 수 있습니다 ...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

추가 한 코드의 요점은 무엇입니까? 이것은 새로운 문제입니까? 새로운 문제라면 새로운 질문을여십시오. 스프라이트가 향하는 방향으로 움직이는 것과 관련된 정보로만이 질문을 업데이트하십시오.
MichaelHouse

아니요 문제를 일으킨 코드입니다. 아래의 의견을 참조하십시오. 누군가가 그것을 요구했다.
rphello101

sprite.movespeed를 계산하는 위치를 보지 못합니까?
AturSams

이동 속도는 일정합니다.이 경우에는 .3
rphello101로

답변:


14

현재 속도와 제목을 기반으로 벡터를 얻으려고합니다. 그런 다음 해당 벡터를 사용하여 위치를 늘리십시오.

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

이제 회전에 따른 속도를 알 수 있습니다. 당신은 그 정보로 당신의 입장을 업데이트 할 수 있습니다.

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

:이 모든 것을 포함하는 (실수) 클래스의 경우, 당신은 Ludum 내가 여기 함께 넣어 21 항목 도전 볼 수 있습니다 bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/...
MichaelHouse

감사합니다. 약간의 수정 후, 이것은 효과가있었습니다. 나는 당신이 이것을 읽으면 스프라이트가 뒤로 이동하는 것이 당신이 여기있는 것의-=에 불과하지만 다른 질문이 있습니다. 그래도 왼쪽 또는 오른쪽으로 이동하려면 어떻게합니까?
rphello101

@ rphello101 좋은 질문입니다. 새로운 질문을해야합니다. 더 많은 사람들이 혜택을 볼 수 있고 내가 가진 것보다 더 나은 답변을 얻을 수 있습니다.
MichaelHouse

3

마우스 위치를 얻습니다

mouseX = ... 
mouseY = ...

스프라이트 위치를 얻습니다

spriteX = ...
spriteY = ...

당신은 각도를 찾을 수

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

당신의 움직임은 :

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

팁 : 사전 계산 된 값으로 cos 및 sin에 대한 테이블 (array)을 만듭니다. 그래서 당신은 그냥 cosTable [(int) angle] * speed * time과 sinTable [(int) angle] * speed * time 할 수 있습니다. 정확하지 않습니다. 그러나 가치가 더 빨라집니다.
Sidar

이렇게하면 스프라이트가 마우스쪽으로 이동하지만 스프라이트가 향하는 방향과 동일하지 않습니다. 회전 속도가 제한되거나 다른 이유로 스프라이트가 마우스를 향하도록 회전 할 수 있습니다. 기본적으로 잘못된 질문에 대답하고 있습니다.
MichaelHouse

@ Byte56 그는 "앞으로 쳤을 때 스프라이트가 반드시 마우스를 향해 움직일 필요는 없다"고 말했다. 그래도 당신은 옳을 수 있습니다.
AturSams

확실히 모호합니다. 이 경우 질문의 제목을 기본값으로 설정했습니다. 오해하지 마십시오. 당신의 대답은 좋습니다. OP가 원할 때 / 돌아올 때 원했던 것을 알아낼 것입니다.
MichaelHouse

2
@Sidar 그것은 조기 최적화입니다. 병목 현상으로 sin / cos 작업을 식별하지 않고 sin / cos 테이블을 작성하는 것은 시간 낭비입니다.
bummzack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.