0

我正在写一个基于网格运动的简单游戏,比如推箱子游戏。我需要使用几个不同的文本文件来存储关卡。我写了一些代码,现在我得到错误:

System.ArgumentNullException “此方法不接受此参数的 null。Nazwa 参数:纹理”

整个代码在几个文件中。我的代码有什么问题?

游戏1.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Sokoban
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        public Texture2D tOtoczenie;
        public Rectangle kOtoczenie;

        Sceny scena;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferHeight = 660; // 11
            graphics.PreferredBackBufferWidth = 900; // 15
            Content.RootDirectory = "Content";
        }

        // Sterowanie po gridzie (en - grid movement with stops)
        KeyboardState stanKlawiatury, poprzedniStanKlawiatury;

        public bool WcisnietyKlawisz(Keys klawisz)
        {
            return stanKlawiatury.IsKeyDown(klawisz) && poprzedniStanKlawiatury.IsKeyUp(klawisz);
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        /// 

        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            scena = new Sceny();

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
            tOtoczenie = Content.Load<Texture2D>("Otoczenie");
            kOtoczenie = new Rectangle(0, 0, 900, 660);
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            poprzedniStanKlawiatury = stanKlawiatury;
            stanKlawiatury = Keyboard.GetState();

            if (WcisnietyKlawisz(Keys.Right))
                scena.wspX += 60;

            else if (WcisnietyKlawisz(Keys.Left))
                scena.wspX -= 60;

            else if (WcisnietyKlawisz(Keys.Up))
                scena.wspY -= 60;

            else if (WcisnietyKlawisz(Keys.Down))
                scena.wspY += 60;

            if (Keyboard.GetState().IsKeyDown(Keys.NumPad1))
                scena.LoadScene("level1");

            scena.Update();
            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            spriteBatch.Draw(tOtoczenie, kOtoczenie, Color.White);
            spriteBatch.End();
            scena.Draw(spriteBatch);

            base.Draw(gameTime);
        }
    }
}

风景.cs

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

namespace Sokoban
{
    public class Sceny
    {
        public List<ObiektyGry> sciany;
        public List<ObiektyGry> sloty;
        public List<ObiektyGry> diamenty;
        public List<ObiektyGry> graczL;

        public Texture2D tDiament;
        public Texture2D tSlot;
        public Texture2D tSciana;

        public Rectangle kDiament;
        public Rectangle kSlot;
        public Rectangle kSciana;

        public Texture2D tGracz;
        public Rectangle kGracz;

        public int wspX;
        public int wspY;

        public Sceny()
        {
            sciany = new List<ObiektyGry>();
            sloty = new List<ObiektyGry>();
            diamenty = new List<ObiektyGry>();
            graczL = new List<ObiektyGry>();
        }

        public void LoadContent(ContentManager theContentManager, string theAssetName)
        {
            tGracz = theContentManager.Load<Texture2D>("Gracz");
            tDiament = theContentManager.Load<Texture2D>("Diament");
            tSlot = theContentManager.Load<Texture2D>("Slot");
            tSciana = theContentManager.Load<Texture2D>("Ściana");
        }

        public void Update()
        {
            foreach (ObiektyGry obiekt in sciany)
                obiekt.Update();
            foreach (ObiektyGry obiekt in sloty)
                obiekt.Update();
            foreach (ObiektyGry obiekt in diamenty)
                obiekt.Update();
            foreach (ObiektyGry obiekt in graczL)
                obiekt.Update();
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            foreach (ObiektyGry obiekt in sciany)
                obiekt.Draw(spriteBatch, obiekt.Tekstura, obiekt.Kształt);
            foreach (ObiektyGry obiekt in sloty)
                obiekt.Draw(spriteBatch, obiekt.Tekstura, obiekt.Kształt);
            foreach (ObiektyGry obiekt in diamenty)
                obiekt.Draw(spriteBatch, obiekt.Tekstura, obiekt.Kształt);
            foreach (ObiektyGry obiekt in graczL)
                obiekt.Draw(spriteBatch, obiekt.Tekstura, obiekt.Kształt);
        }

        public void LoadScene(string name)
        {
            sciany.Clear();
            graczL.Clear();
            diamenty.Clear();
            sloty.Clear();

            StreamReader reader = new StreamReader(name+".txt");

            int x = 0;
            int y = 0;

            string file = reader.ReadToEnd();

            for (int i = 0; i<file.Length; i++)
            {
                if (file[i] == 13)
                {
                    y++;
                    x = 0;
                }
                else if (file[i] != 10)
                    x++;

                if (file[i] == '1' ) // sciana
                {
                    ObiektyGry sciana = new ObiektyGry();
                    sciana.Kształt = new Rectangle(x * 60, y * 60,60,60);
                    sciana.Tekstura = tSciana;
                    sciany.Add(sciana);
                }

                else if (file[i] == '2') // slot
                {
                    ObiektyGry slot = new ObiektyGry();
                    slot.Kształt = new Rectangle(x * 60, y * 60, 60, 60);
                    slot.Tekstura = tSlot;
                    sloty.Add(slot);
                }

                else if (file[i] == '3') // diament
                {
                    ObiektyGry diament = new ObiektyGry();
                    diament.Kształt = new Rectangle(x * 60, y * 60, 60, 60);
                    diament.Tekstura = tDiament;
                    diamenty.Add(diament);
                }

                else if (file[i] == '4') //gracz
                {
                    ObiektyGry gracz = new ObiektyGry();
                    wspX = x * 60;
                    wspY = y * 60;
                    gracz.Kształt = new Rectangle(wspX, wspY, 60, 60);
                    gracz.Tekstura = tGracz;
                    graczL.Add(gracz);
                }
            }
        }
    }
}

ObiektyGry.cs

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;

namespace Sokoban
{

    public class ObiektyGry
    {
        public Rectangle Kształt { get; internal set; }
        public Texture2D Tekstura { get; internal set; }
        public static ContentManager contentManager;

        public ObiektyGry()
        {

        }


        public void Update()
        {

        }

        public void Draw(SpriteBatch spriteBatch, Texture2D Tekstura, Rectangle Ksztalt)
        {
            //Tekstura = obiekt.Tekstura;
            //Kształt = obiekt.Kształt;

            //spriteBatch.Begin();
            spriteBatch.Draw(Tekstura, Ksztalt, Color.White);
            //spriteBatch.End();
        }
    }
}

level1.txt(例如)

111111111111111
100000000000001
100000000000001
100000000000001
100020000000001
100000034000001
100000000000001
100000000000001
100000000000001
100000000000001
111111111111111
4

2 回答 2

0

因此,我删除了所有 Scney 类,并在 Game1 类中实现了关卡更改。在那之后,我对纹理完全没有任何问题!

于 2013-01-20T01:48:16.137 回答
0

是的,正如评论中已经提到的,你还没有为你的场景加载你的纹理。我看到你已经加载了你的关卡,但没有加载你的纹理......

于 2013-01-13T04:26:59.970 回答