스프라이트의 움직임에 외삽 법을 적용하기 전에 내 충돌이 완벽하게 작동했습니다. 그러나 스프라이트의 움직임에 외삽 법을 적용한 후 (사물을 부드럽게) 충돌이 더 이상 작동하지 않습니다.
이것은 외삽 전에 일이 작동하는 방식입니다.
그러나 외삽 법을 구현하면 충돌 루틴이 중단됩니다. 나는 이것이 외삽 루틴 (내 렌더링 호출에 위치)에 의해 생성 된 새로운 좌표에 작용하기 때문이라고 가정합니다.
외삽을 적용한 후
이 동작을 수정하는 방법?
외삽 직후에 추가 충돌 검사를 시도했지만 많은 문제가 해결되는 것처럼 보이지만 렌더링에 논리를 넣는 것이 문제가 아니기 때문에 이것을 배제했습니다.
또한 spritesX 위치의 복사본을 만들어 원본보다 외삽하고 그림을 사용하여 그림을 그릴 때 논리가 그대로 유지되도록 원본을 그대로 두었습니다.이 방법이 더 나은 옵션이지만 여전히 이상한 효과가 있습니다. 벽과 충돌 할 때. 나는 이것이 또한 이것을 다루는 올바른 방법이 아니라고 확신합니다.
나는 여기에서 비슷한 몇 가지 질문을 찾았지만 그 대답은 도움이되지 못했습니다.
이것은 내 외삽 코드입니다.
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
외삽 적용
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
편집하다
위에서 언급했듯이, Sprite의 좌표 사본을 구체적으로 사용하여 복사하려고 시도했습니다 .... 이것은 자체 문제가 있습니다.
첫 번째로, 복사에 관계없이 스프라이트가 움직일 때 매우 매끄럽고 정지 할 때 약간 왼쪽 / 오른쪽으로 흔들립니다. 여전히 시간을 기준으로 위치를 추정하기 때문입니다. 이 정상적인 동작입니까, 스프라이트가 멈 추면 '끄기'할 수 있습니까?
왼쪽 / 오른쪽에 플래그를 설정하고 이들 중 하나가 활성화 된 경우에만 외삽을 시도했습니다. 또한 차이가 있는지 확인하기 위해 마지막 위치와 현재 위치를 복사하려고했습니다. 그러나 충돌이 발생하는 한 도움이되지 않습니다.
사용자가 say를 누르고 오른쪽 버튼과 스프라이트가 오른쪽으로 움직이면 벽에 닿을 때 오른쪽 버튼을 계속 누르고 있으면 스프라이트는 벽에 의해 정지 된 상태에서 오른쪽으로 계속 애니메이션됩니다 ( 그러나 오른쪽 플래그가 여전히 설정되어 있고 충돌 루틴이 스프라이트를 벽 밖으로 지속적으로 이동시키기 때문에 스프라이트가 여전히 움직이고 있음을 코드 (플레이어가 아닌)에 표시하기 때문에 실제로 움직이지 않습니다. 외삽이 계속됩니다. 플레이어가 볼 수있는 것은 스프라이트 '정적'입니다 (예, 애니메이션이지만 실제로 화면을 가로 질러 움직이지는 않습니다). 그리고 외삽 법이 그렇게하려고 할 때마다 격렬하게 흔들립니다 ..... ..이 도움을 바랍니다