2011-07-18 2 views
0

내 수업에 대한 콘텐츠 형식 판독기를 가져 오려고하지만 아무 것도하지 않는 것 같습니다. 이 기능을 작동 시키려면 제가해야 할 일이 있습니까?ContentTypeReader가 Windows Phone 7.1에서 작동하도록하는 방법

public class Map 
{ 

    ... 

    /// <summary> 
    /// Read a Map object from the content pipeline. 
    /// </summary> 
    public class MapReader : ContentTypeReader<Map> 
    { 
     protected override Map Read(ContentReader input, Map existingInstance) 
     { 
      Map map = existingInstance; 
      if (map == null) 
      { 
       map = new Map(); 
      } 

      map.TileSetFile = input.ReadString(); 
      map.Dimensions = input.ReadObject<Point>(); 
      map.Tiles = input.ReadObject<int[]>(); 

      map.Load(input.ContentManager); 

      return map; 
     } 
    } 
} 

xml은 제대로 읽히지 만 읽기 기능은 호출되지 않은 것 같습니다. 어떤 아이디어?

나는 여기있는 것 이상을 필요로합니까?

+1

사용하려고하면이 예외가 throw됩니까? –

+0

아니, 그냥 코드를 완전히 무시하는 것 같습니다. 어떻게 등록해야하나요? –

+0

이지도 유형에 맞는 ContentTypeWriter가 있습니까? 이 유형에서는 런타임 판독기 클래스를 등록해야합니다. –

답변

0

면책 조항 : 나는 어떤에 의해 오전 없습니다 콘텐츠 파이프 라인에 관한 짧은 요약을 제공하기 전에 XNA 컨텐츠 파이프 라인

에 대한 전문가를 의미하고 확장하는 방법, 내가 언급하고 싶습니다 XNA 이후 3.1, ContentTypeReader 및 ContentTypeWriter 구현은 더 이상 필요하지 않습니다.

XNA 3.1에서는 Reflection을 사용하여 자동 XNB serialization이 도입되었으므로 작성자와 판독기가 포함되어 있지 않으면 XNA가이를 처리합니다 (일부 사례 제외). 자세한 내용은 여기

읽기 : 당신이 시각 사용하는 경우

enter image description here

이들의 대부분은 설계 시간 (발생 : Automatic XNB Serialization

XNA 컨텐츠 파이프 라인은 다음과 같은 단계로 제조 된 과정이다 게임에 아트 애셋을 추가하거나 게임을 제작할 때 사용하는 Studio). 마지막 부분은 게임을 실행하고 Content.Load를 호출하여 자산을로드 할 때 런타임에 실행됩니다.

확장을 위해 열려있는 XNA 콘텐츠 파이프 라인을 사용하면 XNA Framework와 함께 제공되는 기본 제공 콘텐츠 형식 이외의 형식을 지원할 수 있으므로 새 콘텐츠 형식 및 새 파일 형식을 다음과 같이 처리 할 수 ​​있습니다. 귀하의 게임에 대한 입력. 다음 그림에서

, 당신은 콘텐츠 파이프 라인을 확장 할 때 실행되는 이벤트의 사슬을 볼 수

enter image description here

귀하의 예제에서 (지도 새로운 유형을 지원하는 확장을 만들려면), 다음 작업을 수행해야합니다 (일부는 이미 가정) :

  1. VS에서 새 내용 파이프 라인 확장 라이브러리 프로젝트를 만듭니다.
  2. 이 프로젝트를 게임 콘텐츠 프로젝트에 대한 참조로 추가하십시오.
  3. 새로운 ContentImporter 추가 ContentProcessor [선택] ContentTypeWriter 및 ContentTypeReader는
  4. 이 방법을 구현해야합니다 귀하의 ContentTypeWriter 클래스 :

    public override string GetRuntimeReader(TargetPlatform targetPlatform) 
        { 
         // TODO: change this to the name of your ContentTypeReader 
         // class which will be used to load this data. 
         return "ContentPipelineExtension.CharacterReader, ContentPipelineExtension, Version=1.0.0.0, Culture=neutral"; 
        } 
    

이 예제에서, 나는 다른 CharacterReader을 사용했습니다하는 것으로 클래스의 경우 독자 유형을 등록하고 어셈블리를 포함하는 독자 유형을 등록해야합니다.나는 그것을위한 새로운 문자라는 유형, 수입, 프로세서와 리더/라이터와 데모 프로젝트를 생성 havev ContentTypeWriter.GetRuntimeReader

: 여기 GetRuntimeReader 방법에 대해 알아

.

당신은 그것을 여기에서 얻을 수 있습니다 : Sample project

* 디버그하기 위해 프로세서/수입이 줄을 추가하고 비주얼 스튜디오 실제로 콘텐츠 파이프 라인 확장 라이브러리의 코드를 트리거 것을 볼 수 있습니다.

System.Diagnostics.Debugger.Launch(); 

*주의해야 할 또 다른 한가지는 당신의 새로운 형태 (지도, 문자, 무엇이든) 자신의 공유 어셈블리에 정의되어야하며, 이러한 유형의 실제 게임과 모두 사용해야하기 때문에, 제대로 계획하여 콘텐츠 파이프 라인 확장 라이브러리.

희망이 도움이됩니다.

+0

"ContentTypeReader 및 ContentTypeWriter를 구현하는 것이 더 이상 필요하지 않습니다."라고 말했고 기본적인 경우에는 맞습니다. 그것은 XML 파일에있는 모든 데이터를 성공적으로로드하고 있습니다. 유일한 것은로드 프로세스 동안 일부 종속 파일을로드하기 위해 자동으로 일부 코드를 실행할 수 있어야한다는 것입니다. 예를 들어, Map 클래스가 TileSet 클래스를로드하고 Texture가로드되기를 원합니다. 현재, 내가 만든 Load (ContentManager) 함수를 수동으로 호출해야합니다. 하지만 나는 그것을 자동으로 원한다. ContentReader는 그렇게하지 않습니까? –

+0

내 수업보기 : 지도 : http://xp-dev.com/sc/browse/81727/%2Ftrunk%2Fprojects%2FWindowsPhone%2FCrystalData%2FMap.cs?rev=421 –

+0

TileSet - http : // xp-dev .com/sc/browse/81727/% 2Ftrunk % 2Fprojects % 2FWindowsPhone % 2FCrystalData % 2FTileSet.cs? rev = 421 –