2

だから、私はここで奇妙な問題を抱えています。Windows、Xbox 360、および Windows Phone 7 で同じ XNA コードを使用しています。ほとんどのコードを動作させることができますが、Level が Windows Phone 7 バージョンで TileMap を呼び出そうとしても、TileMap に到達しません。ただし、Windows と Xbox 360 では問題なく動作します。ここで他に何かしなければならないことはありますか?

さらにいくつかの詳細。Windows Phone バージョンでは、特定の値に対してデバッガーから「式を評価できませんでした」というメッセージが表示されます。Windows版では発生しません。同様に、呼び出している画像のサイズが約 1 KB であり、.map ファイルが 3x3 マトリックスしか作成しない場合でも、それを十分に長く続けると、OutOfMemoryException が発生します。

GameplayScreen.cs

    private Level level;
    ...
    public override void LoadContent()
    {
        if (Content == null)
            Content = new ContentManager(ScreenManager.Game.Services, "Content");
        //Create Sprite Batch for drawing textures
        //spriteBatch = new SpriteBatch(GraphicsDevice);

        //Load fonts
        hudFont = Content.Load<SpriteFont>("Fonts/hud");

        lifeIcon = Content.Load<Texture2D>("Sprites/Player/lifeIco");

        //Load overlays
        //winOverlay = Content.Load<Texture2D>("Overlays/win");
        //loseOverlay = Content.Load<Texture2D>("Overlays/lose");

        try
        {
            MediaPlayer.IsRepeating = true;
            MediaPlayer.Play(Content.Load<Song>("Sounds/music"));
        }
        catch { }

        LoadNextLevel();

        //Camera.InitializeScreen(graphics);

        base.LoadContent();
    } //end LoadContent

    /// <summary>
    /// Loads the next level.
    /// </summary>
    public void LoadNextLevel()
    {
        //Set the next level
        levelIndex = (levelIndex + 1) % numberOfLevels;

        if (level != null)
            level.Dispose();

        level = new Level(ScreenManager.Game.Services, levelIndex);

    } //end LoadNextLevel()

Level.cs

    private TileMap levelMap;
    public Level(IServiceProvider service, int levelIndex)
    {
        //Create content manager for current level.
        content = new ContentManager(service, "Content");

        //Load level map
        //This is where the code hangs
        levelMap = new TileMap(this, levelIndex, content.Load<Texture2D>(@"Tiles/tiles"));


        //Load sounds
        //exampleSound = content.Load<SoundEffect>("Sounds/example");

        //Initialize Camera
        Camera.InitializeLevel(levelMap);
        player = new Player(this, start);
    } //end Level

TileMap.cs

    public TileMap(Level level, int levelIndex, Texture2D tileSheet)
    {
        // Never reaches here on Windows Phone 7 Version
        // Comes right here on Windows and Xbox 360 Version
        this.tileSheet = tileSheet;

        string levelPath = string.Format("Content/Levels/{0}.map", levelIndex);

私がすでに提案し、やろうとしたいくつかのこと:

Tile Map の呼び出しの外で「Tiles/tiles」を呼び出そうとしましたが、タイルを DXT 圧縮で圧縮しようとしました。「タイル/タイル」は完全に正常にロードされますが、呼び出しはまだ失敗し、OutOfMemoryException が発生します。私のコンテンツの合計ファイル サイズは 1.23 MB です。

4

1 に答える 1

0

Level.cs では、コンテンツをサービスとして渡す代わりに、事前に読み込まれたすべてのものを渡します: {Texture2D, Sound}。XNA では通常、すべてのコンテンツがメインのゲーム クラスまたはコンポーネントに読み込まれます。私は 95% これが「式を評価できませんでした」の原因です。

また、.NET Compact Framework 2.0 を見て、ガベージ コレクターがどのように機能するかを確認してください。

http://blogs.msdn.com/b/stevenpr/archive/2004/07/26/197254.aspx

于 2012-08-19T20:04:14.230 に答える