2012-05-08 2 views
0

안녕하세요 저는 현재 2D 전투기를 XNA 4.0을 사용하는 오래된 Mortal Kombats와 비슷하게 만들고 있습니다. 어쨌든, 저는 현재 펀치 애니메이션을 제작하려고합니다.스프라이트와 XNA를 사용하여 전투기에서 펀치 프로그래밍

플레이어가 유휴 상태에 있고 왼쪽 컨트롤을 누르면 플레이어가 펀치해야합니다.

이제 플레이어가 화면 왼쪽을 향하고 있다고 가정합니다. 내 모든 스프라이트가 오른쪽을 향하도록 그려져 있습니다. 따라서 플레이어가 펀치를하면 스프라이트가 뒤집혀 그려집니다.

문제는, 플립 된 펀치 프레임의 가장 왼쪽 부분을 자신의 유휴 프레임의 가장 왼쪽 부분과 정렬하기 때문에 플레이어가 갑자기 우연히 텔레포트하는 것처럼 보입니다 (그게 적어도 내가 생각하는 것입니다) . 이 문제를 해결할 방법을 생각할 수 없습니다.

지금은 코드가 상당히 큽니다. 누군가가 문제의 가능한 부분을 파악할 수 있다면 그 코드를 게시하게되어 기쁩니다.

MSDN에서
SpriteBatch.Draw (Texture2D, Rectangle, Nullable<Rectangle>, Color, Single, Vector2, SpriteEffects, Single) 

가 : 스프라이트의 배치에 스프라이트를 추가 지정된 질감, 대상 사각형, 원 직사각형을 사용하여 색상을 렌더링 내가 바로 그것을 가지고있는 경우

+0

확인해야 할 코드 영역을 어떻게 알 수 있습니까? – BeRecursive

+0

@BeRecursive 당신이 높은 수준에서 무엇인가를 확인할 수 있다면 의미가 있습니다. 이 게임들은 비슷한 구조를 가지고 있습니다. 본질적으로 모든 프레임을 같은 방법으로 그립니다. 지정된 너비와 높이에 대해 지정된 위치에서 시작합니다. 모든 애니메이션의 프레임 위치를 하드 코드했습니다. –

답변

0

그래, 문제를 해결했습니다. 실제로 문제는 스프라이트 시트였습니다. 그것을 디자인 한 사람은 각 프레임의 각 이미지를 가운데에 배치하지 않았습니다.

그렇다면 그는 모든 이미지의 중심에 위치했지만 프레임의 크기는 다양했습니다. 그러나 그 문제는 계속되었다.

일부 디버깅 후, 나는 무슨 일이 일어나고 있는지 알아 냈습니다. 유휴 프레임에는 해당 프레임의 문자 양쪽에 2 픽셀 공간이있었습니다. 펀치 프레임에는 해당 프레임의 문자 양쪽에 23 픽셀의 공간이있었습니다.

Draw() 함수는 2D 위치 벡터를 기반으로 각 프레임을 그렸습니다. 이 위치 벡터는 각 프레임의 왼쪽 위 모서리를 지정합니다.

이제 Idle 프레임과 Punch 프레임은 각 프레임의 문자 왼쪽에 다른 픽셀 너비가 있으므로 플레이어가 Punch를 누르면 "텔레포트 된"문자처럼 보입니다.

이제이 문제의 해결책은 모든 프레임 크기를 동일하게 만드십시오! 이것은 "텔레포트"문제를 해결했습니다. 나는이 문제에 대한 대안을 찾아 낼 수 없다.

내가 이해할 수없는 한 가지가 있습니다. 스프라이트 시트가 다른 프레임 크기로 구성된 게임이 너무 많습니다. 이 순간 이동 문제없이 어떻게 그들을 사용합니까?!

1

, 당신은 그리기 위해이 오버로드를 사용할 수 , 회전, 원점, 효과 및 레이어.

그래서 스프라이트의 원점을 중심으로 전달할 수 있으며, 예를 들어 중심을 중심으로 회전합니다. 귀하의 로테이션을위한 최적의 원점을 찾으십시오.

+0

좋아요. 그래서 원점 매개 변수에 대해 전혀 생각하지 않았습니다. 그래서 현재의 Draw 호출은'spriteBatch.Draw (textureImage, position, null, Color.흰색, 0, 새 Vector2 (frameSize.X/2, frameSize.Y/2), 1f, SpriteEffects.FlipHorizontally, 0);'position '은 스프라이트가있는 화면의 현재 위치를 유지하는 Vector2입니다. 그어진. 원산지 계산이 정확합니까? –

+0

이렇게하면 CUSTOM을 지정한 위치에 textureImage를 그려야합니다. 모든 텍스쳐가 같은 지점에서 뒤집어 지길 원한다고 생각합니다. 따라서 모든 스프라이트가 동일한 원점을 사용하는지 확인해야합니다. – roim

+0

그러나 각 스프라이트의 기원을 어떻게 계산할 수 있습니까? '(currentFrame.X + frameSize.X)/2, (currentFrame.Y + frameSize.Y)/2'라고 말합니까? –

관련 문제