简体   繁体   中英

Xna SpriteBatch Matrix does not draw sprites to screen

I'm currently having an issue with my Xna Game 1 Class. I've incorporated a 2D camera with it's own separate class, which is called for the usage of the matrix. the problem I'm having is in the draw method, to the point of which I use the : `spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, camera.TransformMatrix);

The problem occurs after it as the case methods change what is drawn, for example the Case Main menu and playing don't seem to be reached, or quite frankly drawn to the screen.I've tried to put an individual SpriteBatch.Begin method in each case, consequently, ending each method in the case itself with spriteBatch.end().

I've also tried, not calling the translateCamera class in the update method, but that was also to no avail.

Any Help would be much appreciated!

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);
            }
        }

I've read trough your code and found a possible error. In your Update loop, as soon as you change state to GameState.charCreate you actually have the code charCreate.show(); running over and over again. That could be a problem to the rest of your code depending on what is inside charCreate function. You should make sure this code only run once per state change.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM