简体   繁体   English

Xna SpriteBatch Matrix不会将精灵绘制到屏幕上

[英]Xna SpriteBatch Matrix does not draw sprites to screen

I'm currently having an issue with my Xna Game 1 Class. 我的Xna Game 1课程目前有问题。 I've incorporated a 2D camera with it's own separate class, which is called for the usage of the matrix. 我已经将2D相机与自己的单独类合并在一起,这被称为使用矩阵。 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); 我遇到的问题是在draw方法中,在这一点上,我使用了:`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(). 问题发生后,情况发生了,因为case方法更改了绘制的内容,例如似乎未达到Case Main菜单和播放,或者很坦率地将其绘制到了屏幕上。我尝试放置一个单独的SpriteBatch.Begin方法因此,在每种情况下,都使用spriteBatch.end()结束案例本身的每个方法。

I've also tried, not calling the translateCamera class in the update method, but that was also to no avail. 我也试过了,没有在update方法中调用translateCamera类,但这也无济于事。

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(); 在您的Update循环中,一旦将状态更改为GameState.charCreate,您实际上就有了代码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. 对于其余的代码,这可能是个问题,具体取决于charCreate函数内部的内容。 You should make sure this code only run once per state change. 您应该确保此代码在每次状态更改时仅运行一次。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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