我正在写一个基于网格运动的简单游戏,比如推箱子游戏。我需要使用几个不同的文本文件来存储级别。我写了一些代码,现在我收到了错误:
System.ArgumentNullException“此方法不接受null 这个参数。纳兹瓦参数:纹理“
整个代码在几个文件中。我的代码出了什么问题?
Game1.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);
}
}
}
Sceny.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
答案 0 :(得分:0)
是的,正如评论中已经提到的那样,你没有为你的短片加载你的纹理。我看到你已经加载了你的等级,但不是你的纹理......
答案 1 :(得分:0)
所以,我删除了所有的Sceny类,并在Game1类中实现了级别更改。之后我对纹理没有任何问题!