我目前的Xna Game 1 Class存在问题。我已经将2D相机与它自己独立的类合并,这需要使用矩阵。我所遇到的问题是在绘制方法中,我使用的是 : `spriteBatch.Begin(SpriteSortMode.BackToFront,BlendState.AlphaBlend,null,null,null,null,camera.TransformMatrix);
问题发生在它之后,因为案例方法改变了所绘制的内容,例如Case Main菜单并且似乎没有达到播放,或者非常坦率地绘制到屏幕上。我试图放置一个单独的SpriteBatch .Begin方法在每种情况下,因此,使用spriteBatch.end()结束案例本身的每个方法。
我也尝试过,没有在update方法中调用translateCamera类,但这也无济于事。
非常感谢任何帮助!
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferWidth = 800;
graphics.PreferredBackBufferHeight = 600;
screenRectangle = new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
npc_creation = new NPC_Creation[0];
player1 = new charDevelopment();
camera = new Camera2D();
}
/// <summary>
protected override void Initialize()
{
Random rnd = new Random();
rndYpos = rnd.Next(200,500);
rndXpos = rnd.Next(100, 300);
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
protected override void LoadContent()
{
#region loadTextures
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
backGround = Content.Load<Texture2D>("MainMenu");
graphics.PreferredBackBufferWidth = screenWidth; // width of screen..
graphics.PreferredBackBufferHeight = screenHeight; //height of screen..
IsMouseVisible = true;
graphics.ApplyChanges(); // load images...
potion = Content.Load<Texture2D>("potion");
itemrect = new Rectangle(((screenRectangle.Width + potion.Width) / 2), ((screenRectangle.Height + potion.Height) / 2), potion.Width / 4, potion.Height / 4);
item = new ItemPotion(potion, itemrect, screenRectangle);
OnScreenLevel = Content.Load<SpriteFont>("OnScreenLevel");
charAtkSound = Content.Load<SoundEffect>("AttackSound"); //loads attack sound
Grave = Content.Load<Texture2D>("Grave");
HealthBar = Content.Load<Texture2D>("HealthBar");
btnPlay = new cButton(Content.Load<Texture2D>("Button1"), graphics.GraphicsDevice);
movement = new cMovement(Content.Load<Texture2D>("SpritesRe"), new Vector2(rndXpos, rndYpos), 64, 57, HealthBar, cBar,Grave);
Inv = new InventoryScreen(movement);
TempNPC = Content.Load<Texture2D>("MonsterSprite");
//npc_creation[i] = new NPC_Creation(Content.Load<Texture2D>("MonsterSprite"), screenRectangle,HealthBar,Content.Load<Texture2D>("Grave"));
btnPlay.setPosition(new Vector2(350, 300));
StartGame();
#endregion
}
/// <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
}
protected override void Update(GameTime gameTime)
{
KeyboardState keyState = Keyboard.GetState();
TranslateCamera(keyState);
//Spawns the mobs
if (map.getSpawnStatus() == true)
{
npc_creation = new NPC_Creation[map.getNumOfNPC()];
for (int i = 0; i < npc_creation.Length; i++)
{
npc_creation[i] = new NPC_Creation(TempNPC, screenRectangle, HealthBar, Grave);
npc_creation[i].setSpawnPosition(-10*i);
}
map.setSpawnStatus(false);
}
//888888
MouseState mouse = Mouse.GetState();
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
this.Exit();
switch (CurrentGameState)
{
case GameState.MainMenu: // if mouse is clicked... call method
if (btnPlay.isClicked == true) CurrentGameState = GameState.charCreate;
btnPlay.Update(mouse);
break;
case GameState.charCreate: // creating character
charCreate.Show(); // show menu
if (charCreate.create == true)
{
charCreate.Close(); // close menu
CurrentGameState = GameState.Playing;
}
break;
case GameState.Playing: // if true.. load new image...
backGround = Content.Load<Texture2D>("Game Map");
if (movement.Alive == false)
{
CurrentGameState = GameState.GameOver;
}
else if (Keyboard.GetState().IsKeyDown(Keys.E))
{
Inv.Show();
}
else if (Keyboard.GetState().IsKeyDown(Keys.Q))
{
Inv.Hide();
}
break;
case GameState.GameOver: // end game screen
end.Show(); // pop up screen
if (end.retry == true) // if click retry
{
Application.Restart(); // restart program
break;
}
if (end.quit == true) // if click quit
{
this.Exit(); // quit
break;
}
break;
}
if (movement.getAttackSound() == true)
{
charAtkSound.Play();
}
for (int i = 0; i < npc_creation.Length; i++)
{
//checks if character takes damage from being in range of enemy
npc_creation[i].charWithinDamageRange(movement.getCharLocation());
//checks if character is within sight range
npc_creation[i].charWithinRange(movement.getCharLocation());
//calls on monster update method, with the inputs:
npc_creation[i].Update(gameTime, npc_creation[i].withinRangeOrNot(), movement.getCharLocation(), i);
//checks if monster is in range of character attack
npc_creation[i].monsterTakeDamageRange(movement.getAttackRadius());
npc_creation[i].charWithinDamageRange(movement.getCharLocation());
//*************************************************************Added Jan 9th*****************
//checks if monster is dead, and once dead to give character EXP from mob once
if ((npc_creation[i].deadOrAlive() == false)&&(npc_creation[i].getEXPgivenOrNot() == false))
{
//character gains exp determined by returnEXPworth
player1.EXPgained(npc_creation[i].returnEXPworth());
//tells program that exp has been gained by character
npc_creation[i].setEXPgiven();
//*****BELOW PRINTS OUT CURRENT EXP, GAME MUST BE SET TO CONSOLE MODE****
Console.WriteLine("Current char EXP is "+player1.getEXP());
}
//**************************************************************Added Jan 9th****************
if (npc_creation[i].withinDamageRangeOrNot() == true)
{
movement.decreaseCharHealth();
npc_creation[i].charWithinDamageRange(movement.getCharLocation());
npc_creation[i].withinDamageRangeOrNot();
}
while (npc_creation[i].inAttackRadius() == true)
{
npc_creation[i].decreaseMobHealth(item);
movement.resetAttackRadius();
npc_creation[i].monsterTakeDamageRange(movement.getAttackRadius());
npc_creation[i].inAttackRadius();
}
movement.Update(gameTime, map);
}
item.Update(movement.getCharLocation(), Inv);
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);
// do not erase comments! added SUnday
spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, camera.TransformMatrix);
//spriteBatch.Begin();
spriteBatch.Draw(backGround, Vector2.Zero, Color.White);
switch (CurrentGameState)
{
case GameState.MainMenu: // if on main menu... draw button...
btnPlay.Draw(spriteBatch);
break;
case GameState.Playing: // otherwise.. draw the character sprites
movement.Draw(spriteBatch);
player1.checkLevel();
spriteBatch.DrawString(OnScreenLevel, "Current Level: " + player1.getLvL() +"\nUserName: " +charCreate.getInput(), new Vector2(0, 5), Color.White);
for (int i = 0; i < npc_creation.Length; i++)
{
npc_creation[i].Draw(spriteBatch, Color.White);
}
item.Draw(spriteBatch);
break;
}
spriteBatch.End();
// TODO: Add your drawing code here
base.Draw(gameTime);
}
private void TranslateCamera(KeyboardState keyState)
{
Vector2 cameraTranslate = Vector2.Zero;
if (keyState.IsKeyDown(Keys.W))
cameraTranslate.Y =1;
cameraTranslate.X = 0;
if (keyState.IsKeyDown(Keys.A))
cameraTranslate.X =-1;
cameraTranslate.Y = 0;
if (keyState.IsKeyDown(Keys.D))
cameraTranslate.X =1;
cameraTranslate.Y = 0;
if (keyState.IsKeyDown(Keys.S))
cameraTranslate.Y =-1;
cameraTranslate.X = 0;
camera.Position += cameraTranslate;
}
private void StartGame()
{
map = new Map(backGround, movement);
item.spawnLocation();
for (int i = 0; i < npc_creation.Length; i++)
{
npc_creation[i].setSpawnPosition(i);
}
}
答案 0 :(得分:0)
我已经通过您的代码阅读并发现了可能的错误。在Update循环中,只要将状态更改为GameState.charCreate,您实际上就拥有代码charCreate.show();一遍又一遍地跑。这可能是代码的其余部分的问题,具体取决于charCreate函数内部的内容。您应确保此代码仅在每次状态更改时运行一次。