【问题标题】:WP7 tombstoning, saving sprite into Current state not workingWP7墓碑,将精灵保存到当前状态不起作用
【发布时间】:2012-03-25 20:30:25
【问题描述】:

我正在开发一款 WP7 游戏。我正在使用游戏状态管理(http://create.msdn.com/en-US/education/catalog/sample/game_state_management,但我认为这并不重要)我无法将数据保存到 Microsoft.Phone.Shell.PhoneApplicationService.Current.State

如果我在这个方法中放了精灵

   public override void Deactivate()
    {
        #if WINDOWS_PHONE            
        Microsoft.Phone.Shell.PhoneApplicationService.Current.State["Score"] = Score;
        Microsoft.Phone.Shell.PhoneApplicationService.Current.State["cloudSprite"] = cloudSprite;
        #endif
        base.Deactivate();
    }

里面什么都没有

    Microsoft.Phone.Shell.PhoneApplicationService.Current.State 

在激活方法中。但是,如果我删除 cloudSprite 并只放在那里,它是 int 它工作正常。我不知道出了什么问题,也许它无法处理更复杂的对象。我也试过float doubel,一切正常。但是,如果我把更复杂的东西放在那里,它就不起作用了。你怎么看?

编辑

这是我的精灵类。我不知道如何使它可序列化。我已经添加了 [DataContractAttribute()] 和 [DataMember] 但它不起作用

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Microsoft.Xna.Framework;
 using Microsoft.Xna.Framework.Graphics;
 using Microsoft.Xna.Framework.Content;
 using System.Runtime.Serialization;
 using System.IO;

 namespace GameStateManagementSample.GameObjects
 {
 [DataContractAttribute()]
public class Sprite
{
    [DataMember]
    public Vector2 Position;
     [DataMember]
    public Vector2 Size;
     [DataMember]
    public Texture2D Texture;

    [DataMember]
    public Rectangle Rect
    {
        get
        {
            return new Rectangle((int)Position.X, (int)Position.Y, (int)Size.X, (int)Size.Y);
        }
    }


    public Sprite(Vector2 position)
    {
        Position = position;
    }


    public Sprite(Vector2 position, Vector2 size)
    {
        Position = position;
        Size = size;
    }


    public Sprite(Vector2 position, Texture2D texture)
    {
        Position = position;
        Texture = texture;
        Size = new Vector2(Texture.Width, Texture.Height);
    }



    public void LoadContent(string assetName, ContentManager content)
    {
        Texture = content.Load<Texture2D>(assetName);

        if (Size == Vector2.Zero)
            Size = new Vector2(Texture.Width, Texture.Height);
    }

    public virtual void Draw(SpriteBatch spriteBatch)
    {
        //spriteBatch.Draw(Texture, Rect, Color.White);
        spriteBatch.Draw(Texture, Position, Color.White);

    }

    public virtual void Draw(SpriteBatch spriteBatch,  Rectangle TexturePositionInSpriteSheet, Color color)
    {
        spriteBatch.Draw(Texture, Position, TexturePositionInSpriteSheet, color);
    }

    public bool Intersects(Vector2 point)
    {
        if (point.X >= Position.X && point.Y >= Position.Y && point.X <= Position.X + Size.X && point.Y <= Position.Y + Size.Y)
            return true;
        else return false;
    }

    public bool Intersects(Rectangle rect)
    {
        return Rect.Intersects(rect);
    }



    public static void Serialize(Stream streamObject, object objForSerialization)
    {
        if (objForSerialization == null || streamObject == null)
            return;

        DataContractSerializer ser = new DataContractSerializer(objForSerialization.GetType());
        ser.WriteObject(streamObject, objForSerialization);
    }

    public static object Deserialize(Stream streamObject, Type serializedObjectType)
    {
        if (serializedObjectType == null || streamObject == null)
            return null;

        DataContractSerializer ser = new DataContractSerializer(serializedObjectType);
        return ser.ReadObject(streamObject);
    } 


}
 }

【问题讨论】:

    标签: windows-phone-7 tombstoning


    【解决方案1】:

    添加到 State 集合的对象使用 DataContractSerializer 进行序列化。确保您保存在那里的所有内容都可以通过这种方式进行序列化。
    任何序列化错误都会被静默忽略。

    更新

    这是您的 Sprite 对象的简化版本:

    [DataContract]
    public class Sprite
    {
        [DataMember]
        public Vector2 Position;
    
        [DataMember]
        public Vector2 Size;
    
        [DataMember]
        public Texture2D Texture;
    
        public Sprite()
        {
        }
    
        public Sprite(Vector2 position)
        {
            Position = position;
        }
    
        public Sprite(Vector2 position, Vector2 size)
        {
            Position = position;
            Size = size;
        }
    
        public Sprite(Vector2 position, Texture2D texture)
        {
            Position = position;
            Texture = texture;
            Size = new Vector2(Texture.Width, Texture.Height);
        }
    }
    

    这是一个被序列化和反序列化的例子:

    // Sprite 序列化测试 var sprite1 = new Sprite(new Vector2(12.34f, 56.78f));

    Sprite sprite2;
    
    using (var memStr = new MemoryStream())
    {
        var serializer = new DataContractSerializer(typeof(Sprite));
        serializer.WriteObject(memStr, sprite1);
    
        memStr.Position = 0;
        var sr = new StreamReader(memStr);
        var serialized = sr.ReadToEnd();
    
        // serialized now looks like
        // <Sprite xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MiscExperiments"><Position xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework"><d2p1:X>12.34</d2p1:X><d2p1:Y>56.78</d2p1:Y></Position><Size xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework"><d2p1:X>0</d2p1:X><d2p1:Y>0</d2p1:Y></Size><Texture xmlns:d2p1="http://schemas.datacontract.org/2004/07/Microsoft.Xna.Framework.Graphics" i:nil="true" /></Sprite>
    
        memStr.Position = 0;
    
        sprite2 = (Sprite)serializer.ReadObject(memStr);
    
        // sprite2 now contains the same as 
        // sprite2.Position = { X:12.34, Y:56.78 }
    }
    

    【讨论】:

    • 我已经编辑了我的帖子。我无法使其可序列化。我的代码在那里。请看一下。
    • 首先让我震惊的是你没有无参数的构造函数。反序列化需要它。或者,您可以自己序列化(和反序列化)对象,然后将结果字符串添加到 State 对象。
    • @MattLacey AFAIK DataContractSerializer 不需要无参数构造函数,XmlSerialiser 需要一个
    【解决方案2】:

    我相信您会得到 ArgumentOutOfRangeException,如果您不进行调试(在这种情况下会引发异常),它会被静默忽略。存储在 State 字典中的项目需要是可序列化的。尝试以某种方式存储该精灵并在状态字典中仅保存该精灵的链接(源)。

    【讨论】:

    • 据我所知,我没有遇到任何异常。我不确定我的精灵是否被标记为可序列化。我回家后告诉你。哦,谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多