C# Problem mit XML Datei

Ich gehe mal davon aus dass man folgende Zeile ändern muss damit das ganze auch in einem Windows Game Projekt funktioniert. Jedoch habe ich keine Ahnung wie ich sie ändern soll da ich die Sachen in den Klammern nicht verstehe:confused_alt:
HTML:
private void Form1_Load(object sender, EventArgs e)
 
KamehamehaX10 schrieb:
Es gibt kein WinForms für XNA.
Da ist nichts mit "Form_Load" und "Button reinsetzen und bei OnClick".

Weißt du überhaupt was du da machst Cartman?
Ich würde dir dringenst raten, dich erstmal in Programmierung einzulesen, bevor du versuchst mit XNA irgendwas herumzufuchteln. Du hast offensichtlich das Prinzip der OOP nicht verstanden.

Er könnte ja XNA in WinForms hosten ;)
Btw. was ist denn das Prinzip der OOP? Ich verstehe den Bezug imo nicht.

Cartman999 schrieb:
Ich gehe mal davon aus dass man folgende Zeile ändern muss damit das ganze auch in einem Windows Game Projekt funktioniert. Jedoch habe ich keine Ahnung wie ich sie ändern soll da ich die Sachen in den Klammern nicht verstehe:confused_alt:
HTML:
private void Form1_Load(object sender, EventArgs e)

Du solltest dich wirklich erst einmal ein wenig mehr mit C# im Allgemeinen auseinandersetzen, bevor du anfängst blind irgendwelche Tutorials abzuschreiben?
Form1_Load ist ein EventHandler. Um das Event zu "empfangen" musst du es aber erstmal anmelden. In deinem Fall dürfte das schwierig werden, da es das Event Loaded in XNA nicht gibt, zumindest nicht in der Klasse Game (siehe Link unten für mehr Infos).
Was ist überhaupt dein Plan? Was hast du vor?

Darlis schrieb:

Oder mit Bezug zu XNA
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.game_members.aspx
 
Ich möchte XML Dateien erstellen in der sich Informationen über Gegner/jeweiliges Level befinden. Außerdem müssen verschiedene Informationen(der Spielstand) in einer XML Datei gespeichert werden sodass der Spieler ein Level nicht immer von vorne beginnen muss. Da die Level aber relativ kurz sind(5-10min) könnte man es auch so machen(falls dies leichter zu programmieren ist) dass nur gespeichert wird wenn ein Level abgeschlossen ist. Irgendwann muss aber gespeichert werden, man kann ja nicht vom Spieler verlangen dass er das Spiel komplett durchspielt ohne zu speichern.
Was haltet ihr von solchen XML Level Editoren? Könnte ich das alles auch schneller damit machen?
http://gleed2d.codeplex.com/
 
holy schrieb:
Er könnte ja XNA in WinForms hosten ;)
Btw. was ist denn das Prinzip der OOP? Ich verstehe den Bezug imo nicht.

Dann wäre er nicht hier.;)

Er weiß ja gar nicht mal, was ein Event ist bzw. dass es von einer Form stammt. Er erkennt den Bezug nicht, sondern nur den Zusammenhang, dass es in Fall X (Windows Forms Applicaton) "am Anfang" ausgeführt wird. Wer das nicht rafft, hat was verpasst.
 
Cartman999 schrieb:
Ich möchte XML Dateien erstellen in der sich Informationen über Gegner/jeweiliges Level befinden. Außerdem müssen verschiedene Informationen(der Spielstand) in einer XML Datei gespeichert werden sodass der Spieler ein Level nicht immer von vorne beginnen muss. Da die Level aber relativ kurz sind(5-10min) könnte man es auch so machen(falls dies leichter zu programmieren ist) dass nur gespeichert wird wenn ein Level abgeschlossen ist. Irgendwann muss aber gespeichert werden, man kann ja nicht vom Spieler verlangen dass er das Spiel komplett durchspielt ohne zu speichern.
Was haltet ihr von solchen XML Level Editoren? Könnte ich das alles auch schneller damit machen?
http://gleed2d.codeplex.com/

Mal unabhängig von WinForms, XNA oder WPF. Die XML-Serialisierung funktioniert überall. Man muss das Beispiel nur passend adaptieren. Haben Beispiele so an sich.
Außerdem würde es mich wundern wenn MS in XNA keine Funktionen zum Speichern/Laden von Spielständen vorgesehen hätte.

EDIT: Und da ist die Funktion auch schon -> http://msdn.microsoft.com/en-us/library/bb203924.aspx

Und siehe da. Es wird ein XmlSerializer verwendet ;)
 
Ich habe diesen Artikel versucht nachzuprogrammieren jedoch wird der Texture2D Variable nie meine Textur(light) zugewiesen. Keine Ahnung warum, habe den Code schon mehrmals überlesen
http://www.xnamag.de/article.php?aid=26
Fehlermeldung: ArgumentNullException was unhandled
This method does not accept null for this parameter.
Parameter name: texture
Code(ganz unten bei batch.Draw(texture,...) bekomme ich die Fehlermeldung):
Code:
namespace SharedContent 
{ 
    public class Sprite 
{ 
    Vector2 position; 
    float rotation; 
    Vector2 scale; 

    string textureAsset; 
    Texture2D texture; 

    public Vector2 Position 
    { 
        get { return position; } 
        set { position = value; } 
    } 

    public float Rotation 
    { 
        get { return rotation; } 
        set { rotation = value; } 
    } 

    public Vector2 Scale 
    { 
        get { return scale; } 
        set { scale = value; } 
    } 

    public string TextureAsset 
    { 
        get { return textureAsset; } 
        set { textureAsset = value; } 
    } 

    [ContentSerializerIgnore] 
    public Texture2D Texture 
    { 
        get { return texture; } 
    } 

    public void Load(ContentManager content) 
    { 
        texture = content.Load<Texture2D>(textureAsset); 
    } 

    public void Draw(SpriteBatch batch) 
    { 
        batch.Draw( 
            texture, 
            position, 
            null, 
            Color.White, 
            rotation, 
            Vector2.Zero, 
            scale, 
            SpriteEffects.None, 
            0f); 
        } 
    } 
}
XML Datei(meine Textur heißt light):
Code:
<?xml version="1.0" encoding="utf-8" ?> 
<XnaContent> 
  <Asset Type="System.Collections.Generic.List[SharedContent.Sprite]"> 
    <Item> 
      <Position>100 100</Position> 
      <Rotation>0</Rotation> 
      <Scale>.1 .1</Scale> 
      <TextureAsset>light</TextureAsset> 
    </Item> 
    <Item> 
      <Position>200 100</Position> 
      <Rotation>0</Rotation> 
      <Scale>.1 .1</Scale> 
      <TextureAsset>light</TextureAsset> 
    </Item> 
    <Item> 
      <Position>400 100</Position> 
      <Rotation>0</Rotation> 
      <Scale>.1 .1</Scale> 
      <TextureAsset>light</TextureAsset> 
    </Item> 
  </Asset> 
</XnaContent>
Game1 Code:
Code:
namespace WindowsGame16 
{ 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
        GraphicsDeviceManager graphics; 
        SpriteBatch spriteBatch; 
        Texture2D licht; 
        List<Sprite> sprites = new List<Sprite>(); 

        public Game1() 
        { 
            graphics = new GraphicsDeviceManager(this); 
            Content.RootDirectory = "Content"; 
        } 
    
          
        protected override void Initialize() 
        { 
            base.Initialize(); 
        } 

        protected override void LoadContent() 
        { 
            spriteBatch = new SpriteBatch(GraphicsDevice);            
            sprites = Content.Load<List<Sprite>>("Levelinf"); 
            
        } 

        protected override void UnloadContent() 
        { 
        } 

        protected override void Update(GameTime gameTime) 
        { 
            base.Update(gameTime); 
        } 

        protected override void Draw(GameTime gameTime) 
        { 
            GraphicsDevice.Clear(Color.CornflowerBlue); 
            spriteBatch.Begin(); 
            foreach (Sprite sprite in sprites) 
                sprite.Draw(spriteBatch); 
            spriteBatch.End(); 

            base.Draw(gameTime); 
        } 
    } 
}
 
Laut der Doku:
http://msdn.microsoft.com/en-us/library/ff433989.aspx

Im Bereich Exceptions sieht man:
Exception type Condition
ArgumentNullException texture is null.

Somit ist deine texture null, und diese ist null weil du übersehen hast die Property TextureAsset mit einem Wert zu füllen. Bezugnehmend auf die Seite die du gepostet hat wäre dies dieser Code Teil den du vernachlässigt hast:

Code:
public class SpriteContentReader : ContentTypeReader<Sprite>
{
     protected override Sprite Read(
             ContentReader input, 
             Sprite existingInstance)
     {
         Sprite sprite = new Sprite();

         sprite.Position = input.ReadVector2();
         sprite.Rotation = input.ReadSingle();
         sprite.Scale = input.ReadVector2();
         sprite.TextureAsset = input.ReadString();

         sprite.Load(input.ContentManager);

         return sprite;
     }
}
 
Hat sich erledigt. Problem gelöst.
 
Zuletzt bearbeitet:
Es wäre immer nett wenn man auch erklärt was dazu beigetragen hat das es nun funktioniert.
 
Ich musste nur noch folgenden Code in der LoadContent Methode von Game1 hinzufügen:
Code:
foreach(Sprite sprite in sprites) {
    sprite.Load(Content);
}
 
Zurück
Oben