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


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.