2013-05-11 2 views
0

XNA 게임에서 픽셀 당 충돌을 스프라이트 시트와 통합하려고합니다. 나는 대부분 this에서 벗어나고 있지만, 저에게는 효과가 없습니다.Texture2D.GetData "인덱스가 범위를 벗어났습니다."

내 스프라이트 시트의 왼쪽 위 모서리에있는 스프라이트에서 데이터를 가져 오기 위해 수행중인 작업은 다음과 같습니다. 그것은 잘 작동하는 것 같습니다 - 적어도 오류는 없습니다. (48, 32)에 의해 사각형을 상쇄을 제외하고,

Rectangle SpriteSource = new Rectangle(48, 32, 16, 32); 
ColorData = new Color[SpriteSource.Width * SpriteSource.Height]; 
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height); 

정확한 동일한 코드 :

Rectangle SpriteSource = new Rectangle(0, 0, 32, 32); 
ColorData = new Color[SpriteSource.Width * SpriteSource.Height]; 
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height); 

지금 왼쪽 상단에없는 스프라이트를 얻을 수 있습니다. 그래도 어떤 이유로 "이 매개 변수는 배열 내의 유효한 인덱스 여야합니다."매개 변수 이름 : dataIndex

무엇이 잘못 되었나요? 이 인스턴스에서 DataIndex는 무엇을 말하는가? ColorData 배열 또는 실제 Texture2D? 또한 특별한 mipmapping을하지 않은 경우 - 그것이 무엇인지는 모르지만 대략적인 아이디어가 있습니다 - 나는 밉 매핑 레벨로 0을 사용하겠습니까?

편집 : 좀 더 정보 (SS = SpriteSource, O.Tex = Owner.Spritesheet) :

만큼 SS.X <= O.Tex.Width - SS.WidthSS.Y == 0로, 코드/잘 실행 컴파일합니다. SS.X > O.Tex - SS.Width 인 경우 완전히 예상되는 "이 사각형의 너비가 너무 크거나 작음"오류가 발생합니다. Y를 변경하고 X를 0으로 유지하는 것과 동일합니다.

그러나 다음 조건이 모두 참인 경우 SS.X > 0 && SS.Y > 0 && (SS.X * SS.Y) < (SS.Width * SS.Height)과 비슷한 오류가 발생하지만 "이 매개 변수는 배열 내의 유효한 인덱스 여야합니다 매개 변수 이름 : elementCount"가 생성됩니다.

EDIT2 : elementCount 오류에 대해 약간 잘못 생각한 것 같습니다. SS.X * SS.Y > SS.Width * SS.Height 조건에서 생성 될 수 있습니다. 나는 그런 바보 같은 상태가 적어도 문제의 일부가 아니기 때문에 기쁘다.

+0

픽셀 충돌을위한 팁 하나가 첫 번째 상자 충돌과 픽셀 충돌을 확인합니다. 하지만 마지막으로 나는 픽셀 융합을 제거합니다. 왜냐하면 많은 오브젝트가있을 때 실제로 뒤떨어져 있기 때문입니다. 이제는 상자와 서클 충돌 만 사용합니다. –

답변

1

저는 XNA 프로그래머가 아니지만 Spritesheet가 Texture2D 인 경우 문제가 발생한 이유를 알고 있습니다. 의이 매개 변수에 대해 자세히 살펴 보자

  • INT 수준 - 밉맵 수준
  • Null 허용 - 복사 할 질감의 섹션. 데이터가 전체 텍스처 복사 될 것임을 나타냄
  • T [] 데이터 -
  • 얻을 요소 Numnber -
  • 의 INT에 elementCount를 얻기 위해 제 요소의 인덱스 - 데이터 배열
  • 시작 인덱스에서 INT

두 번째 매개 변수로 SpriteSource를 전달 했으므로 이미 텍스처의 하위 섹션을 선택했습니다. 네 번째 매개 변수는 두 번째 매개 변수로 전달하는 사각형 (SpriteSource)의 시작 인덱스입니다!

GetData의 네 번째 매개 변수로 0을 효과적으로 전달하기 때문에 SpriteSource.X와 SpriteSource.Y가 모두 0이고 0 * 0 = 0이므로 모두가 예상대로 작동합니다.두 번째 경우는 시작 색인이 SpriteSource (16 * 32 = 512)의 크기보다 큰 1024 여야한다고 말하기 때문에 실패합니다. 네 번째 매개 변수로 0을 전달하면 "SourceSprite에서 인덱스 0에서 시작"을 의미하므로 작동합니다.

소스 스프라이트가 항상 원하는 스프라이트 시트의 스프라이트 사각형 인 경우 0을 startIndex로 전달하면 이후의 스프라이트가 생성됩니다.

내 생각에 ...

+0

당신 말이 맞습니다. 내가 연결된 스레드에서, 그 남자는 그의 모든 다른 스프라이트에 대해 하나의 ColorData 배열을 사용하고 있습니다. 그래서 그것은 저에게 효과적이지 않습니다. 나는 지금 모든 일을하고있다. 비록 내가 startIndex 매개 변수에 대한 설명이 "얻을 첫 번째 요소의 색인"인 이유를 모르겠지만 설정해서는 안됩니까? 어느 쪽이든, 나를 도울 시간을내어 주셔서 감사합니다. –

+0

@ 7heSama 듣기 좋다. 나는 옳았다. "get"과 "set"에 대해서는 소스 (두 번째 매개 변수)에서 요소를 가져 와서 대상 (세 번째 매개 변수)에 복사합니다. – user1323245

관련 문제