2

ねえ、私はしばらくの間見回してきましたが、まだこの問題に対する直接的な答えを見つけることができません. UI の一部に頻繁に変化するアイコンが表示される XNA ゲームがあります (頻度は関係ありません)。スプライトシートを出力する単純なスプライトシートメーカーと、それぞれのアイコンの場所を含む単純な XML ファイルを使用することにしました。

私ができるようにしたいのは、XMLファイルから適切なアイコンのスプライトシートの場所とアイコンサイズをRectangle. 次に、これを描画ビットのソース四角形として使用できます。

ただし、独自のコンテンツ パイプラインを作成せずに XML ファイルを XNA 4.0 プロジェクトにロードする方法 (可能であれば避けたいもの) の簡単な説明をまだ見つけていません。データをRectangle変数に入れます。

XML ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with TexturePacker http://texturepacker.com-->
<!-- $TexturePacker:SmartUpdate:748fc56befb00c22540f953093f731a7$ -->
<!--Format:
n  => name of the sprite
x  => sprite x pos in texture
y  => sprite y pos in texture
w  => sprite width (may be trimmed)
h  => sprite height (may be trimmed)
oX => sprite's x-corner offset (only available if trimmed)
oY => sprite's y-corner offset (only available if trimmed)
oW => sprite's original width (only available if trimmed)
oH => sprite's original height (only available if trimmed)
r => 'y' only set if sprite is rotated
-->
<TextureAtlas imagePath="Loadout_Icons.png" width="185" height="86">
    <sprite n="Charge_Down.png" x="0" y="0" w="37" h="43"/>
    <sprite n="Charge_Up.png" x="37" y="0" w="37" h="43"/>
    <sprite n="Damage_Down.png" x="74" y="0" w="37" h="43"/>
    <sprite n="Damage_Up.png" x="111" y="0" w="37" h="43"/>
    <sprite n="FireRate_Down.png" x="148" y="0" w="37" h="43"/>
    <sprite n="FireRate_Up.png" x="0" y="43" w="37" h="43"/>
    <sprite n="Health_Down.png" x="37" y="43" w="37" h="43"/>
    <sprite n="Health_Up.png" x="74" y="43" w="37" h="43"/>
    <sprite n="Speed_Down.png" x="111" y="43" w="37" h="43"/>
    <sprite n="Speed_Up.png" x="148" y="43" w="37" h="43"/>
</TextureAtlas>

また、独自の XML ファイルを作成しないことで自分自身を撃っているかどうかもわかりませんが、その方が簡単でしょうか?

msdn が提供しなければならなかったもののほとんどを役に立たずに読みましたが、関連するページや質問へのリンクは大歓迎です。前もって感謝します。

4

3 に答える 3

0

コメントでしか言及されていなかったので、テクスチャパッカー専用に作成された専用のパイプライン拡張に関する Niko Drašković の提案を使用することになったと言うことにしました。 02/texturepacker-xna-content-pipeline-extension/ . これにより、テクスチャ パッカーによって作成された XML ファイルの操作が非常に簡単になります。

ただし、少し補足として、この質問を再検討したもう 1 つの理由は、最近 XML についてかなりの作業を行っており (それらをよりよく理解するために)、見つけた最良の方法であると言うことでした。それぞれに新しいパイプライン拡張機能を作成せずにカスタム XML ファイルの読み取りを処理する方法 (現在のように洗練されているように見えます) は次のとおりです。他のテクスチャなどと同じように、XML ファイルをコンテンツ ディレクトリに追加します。XML のプロパティで、[ビルド アクション] を [コンテンツ]に設定し、[出力ディレクトリにコピー] を [常にコピー] に設定します。ここから、ファイルの名前を渡す別のクラスを作成し、その中で XML から必要なすべてを処理します。これらのクラスは次で始まります。

Stream stream = TitleContainer.OpenStream("Content\\" + fileName + ".xml");
XDocument doc = XDocument.Load(stream);

次に、(System.Xml.Linq ライブラリの残りの部分を使用して) 適切なデータの読み取りと保存を行い、データに簡単にアクセスするメソッドを使用します。これは問題に取り組むための最良のアプローチではないかもしれませんが、それ以来私にとってはうまくいき、理解してすぐに実装するのに十分簡単です. これが同様の問題を抱えている他の人に役立つことを願っています。

于 2012-12-07T01:01:11.123 に答える
0

以下は機能するはずですが、完全にテストされていません。

[XmlRoot("TextureAtlas", IsNullable = false)]
public class TextureAtlasXml
{
    public static TextureAtlasXml FromFile(String file)
    {
        using (var stream = File.OpenRead(file))
        {
            return FromStream(stream);
        }
    }

    public static TextureAtlasXml FromStream(Stream stream)
    {
        var serializer = new XmlSerializer(typeof(TextureAtlasXml));
        return (TextureAtlasXml)serializer.Deserialize(stream);
    }


    [XmlAttribute("imagePath")]
    public String ImagePath;

    [XmlAttribute("width")]
    public Int32 Width;

    [XmlAttribute("height")]
    public Int32 Height;

    [XmlElement("sprite")]
    public List<SpriteXml> Sprites;
}

public class SpriteXml
{
    [XmlAttribute("n")]
    public String Name;

    [XmlAttribute("x")]
    public Int32 X;

    [XmlAttribute("y")]
    public Int32 Y;

    [XmlAttribute("w")]
    public Int32 Width;

    [XmlAttribute("h")]
    public Int32 Height;

    public Rectangle Rectangle { get { return new Rectangle(this.X, this.Y, this.Width, this.Height); } }
}

コンテンツ パイプラインの使用を検討することをお勧めします。これにより優れたソリューションが得られますが、コードは希望どおりに機能するはずです。

于 2012-11-12T10:29:06.000 に答える
0

Sprite Vortex (実際には特定のバージョン) を使用する場合は、次のクラスを使用できます。新しいバージョンでは XML 形式が変更されているため、Sprite Vortex 1.2.2 を使用する必要があります。プロパティを追加する XML ファイルが「コンパイルしない」に変更されていることを確認してください。

実際の例が必要な場合は、非常に簡単な例をお送りします。

ps Sprite Vortex は、他のプログラムを使用する場合と同じことを行う必要がありますが、v 1.2.2 はかなりバグがありますが、それほど悪くはありません。

クラスはこちら: http://pastebin.com/sNSa7xgQ

于 2012-11-17T05:26:39.570 に答える