Member 13755707 Ответов: 0

Игры XNA ФПС "функции съемки, врагах добавить"


Эй, мне нужно знать, как добавить функцию для моей игры fps xna, чтобы моя модель пистолета могла стрелять, и мне нужна функция для добавления монстров в игру, чтобы стрелять с собственным здоровьем...

мой основной файл game.cs

using System;
using System.Collections.Generic;
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.Input.Touch;
using Microsoft.Xna.Framework.Media;
using FirstPersonCameraWindows.Models;

namespace FirstPersonCameraWindows
{
    /// <summary>
    /// The game motor.
    /// Handles the player controls and updates the camera and the world.
    /// </summary>
    public class Game : Microsoft.Xna.Framework.Game
    {
        // Constants
        private const float G = 9.81f;
        private const float RotationSpeed = MathHelper.Pi / 300f;
        private const float InitRunA = MathHelper.Pi * 6f;
        private const float InitRunDecelerateA = MathHelper.Pi * 4f;
        private const float InitRunVmax = MathHelper.Pi * 1.2f;
        private const float InitJumpV = MathHelper.Pi;
        private const float InitForwardSpeed = MathHelper.Pi / 1.5f;
        private const float EndOfTheWorld = -2000; // The y coordinate for reseting the avatar state
        private readonly Vector3 StartPosition = new Vector3(0, 80, 0);

        // The world model.
        private BaseWorldModel model;

        // The camera
        private Camera camera;
        
        // Avatar bounding sphere radius
        private const float avatarBsR = 8;

        // Avatar moving-related variables
        private Vector3 velocity;
        private Vector3? groundNormal;
        private float currentYaw;
        private float currentPitch;
        
        private float runA = InitRunA;
        private float runDecelerateA = InitRunDecelerateA;
        private float runVmax = InitRunVmax;
        private float jumpV = InitJumpV;
        private float forwardSpeed = InitForwardSpeed;
        private bool isInAir = false;
        private bool isCrouching = false;
        
        // Control states
        private KeyboardState prevKeyboardState;
        private MouseState prevMouseState;

        // The graphics manager
        private GraphicsDeviceManager graphics;

        /// <summary>
        /// Initializes a new instance of the <see cref="Game"/> class.
        /// </summary>
        public Game()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth = 2560;
            graphics.PreferredBackBufferHeight = 1080;
            Content.RootDirectory = "Content";
            this.Window.Title = "First-person shooter";
        }

        /// <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()
        {
            camera = new Camera(StartPosition, graphics.GraphicsDevice.Viewport.AspectRatio);

            Mouse.SetPosition(Window.ClientBounds.Width / 2, Window.ClientBounds.Height / 2);
            prevMouseState = Mouse.GetState();

            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()
        {
            model = new WorldModel(Content, GraphicsDevice);
            model.SetProjectionMatrix(camera.ProjectionMatrix);

            GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
        }

        /// <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 (Keyboard.GetState().IsKeyDown(Keys.Escape))
            {
                this.Exit();
            }
            
            UpdateCamera(gameTime);
            model.update(gameTime, camera);

            base.Update(gameTime);
        }

        /// <summary>
        /// Updates the position and direction of the camera.
        /// </summary>
        private void UpdateCamera(GameTime gameTime)
        {
            KeyboardState keyboardState = Keyboard.GetState();
            MouseState mouseState = Mouse.GetState();

            handleKeyboardAndMouse(keyboardState, mouseState);

            prevKeyboardState = keyboardState;
            prevMouseState = mouseState;

            // Moving direction
            float? moveAngle = getMoveDirection(keyboardState);

            // The elapsed game time.
            float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;   

            // Calculate the current velocity by the move direction.
            if (moveAngle != null)
            {
                Vector3 moveDirection = Vector3.Transform(Vector3.Backward, Matrix.CreateRotationY(moveAngle.Value) * Matrix.CreateRotationY(currentYaw)) * forwardSpeed;
                Vector3 newVelocity = velocity + moveDirection * runA * elapsed;
                if (newVelocity.Length() <= runVmax)
                {
                    velocity = newVelocity;
                }
            }

            // Jumping
            if (!isInAir && !isCrouching && keyboardState.IsKeyDown(Keys.Space))
            {
                velocity.Y += jumpV;
            }

            // Gravity
            velocity.Y -= G * elapsed;
            
            // Movement deceleration
            if (!isInAir)
            {
                float factor = 1f - runDecelerateA * elapsed;
                velocity *= new Vector3(factor, 1, factor);
                if (Math.Abs(velocity.X) < 0.01) velocity.X = 0;
                if (Math.Abs(velocity.Z) < 0.01) velocity.Z = 0;
            }

            // Camera offset
            Vector3 offset = camera.Position + velocity;
            
            // Construct bounding spheres
            int bsCount = isCrouching ? 2 : 3;
            BoundingSphere[] bss = new BoundingSphere[bsCount];
            bss[bsCount - 1] = new BoundingSphere(offset, avatarBsR);
            bss[bsCount - 2] = new BoundingSphere(offset + new Vector3(0, -2f * avatarBsR, 0), avatarBsR);
            if (!isCrouching) bss[bsCount - 3] = new BoundingSphere(offset + new Vector3(0, -4f * avatarBsR, 0), avatarBsR);

            // Collition tests
            groundNormal = model.CollitionTest(bss, ref velocity);
            
            // Update the camera
            camera.Update(velocity, currentYaw, currentPitch);

            isInAir = groundNormal == null;

            // Falling off the world?
            if (camera.Position.Y < EndOfTheWorld)
            {
                ResetAvatar();
            }
        }

        /// <summary>
        /// Handles the keyboard and mouse controls
        /// </summary>
        /// <param name="curKeyboardState">The current keyboard state.</param>
        /// <param name="curMouseState">The current mouse state.</param>
        private void handleKeyboardAndMouse(KeyboardState curKeyboardState, MouseState curMouseState)
        {
            // Mouse zoom
            if (curMouseState.RightButton == ButtonState.Pressed && prevMouseState.RightButton == ButtonState.Released)
            {
                camera.setViewAngle(MathHelper.Pi / 16);
                model.SetProjectionMatrix(camera.ProjectionMatrix);
            }
            else if (curMouseState.RightButton == ButtonState.Released && prevMouseState.RightButton == ButtonState.Pressed)
            {
                camera.setViewAngle(Camera.initViewAngle);
                model.SetProjectionMatrix(camera.ProjectionMatrix);
            }

            // Sneaking
            if (curKeyboardState.IsKeyDown(Keys.LeftShift) && !prevKeyboardState.IsKeyDown(Keys.LeftShift))
            {
                runA = MathHelper.Pi * 5f / 2f;
                runVmax = MathHelper.PiOver2;
            }
            else if (!curKeyboardState.IsKeyDown(Keys.LeftShift) && prevKeyboardState.IsKeyDown(Keys.LeftShift))
            {
                runA = InitRunA;
                runVmax = InitRunVmax;
            }

            // Crouching
            if (curKeyboardState.IsKeyDown(Keys.LeftControl) && !prevKeyboardState.IsKeyDown(Keys.LeftControl))
            {
                runA = MathHelper.Pi * 5f / 2f;
                runVmax = MathHelper.PiOver2;
                isCrouching = true;
                camera.Update(new Vector3(0, -2f * avatarBsR, 0), currentYaw, currentPitch);
            }
            else if (!curKeyboardState.IsKeyDown(Keys.LeftControl) && prevKeyboardState.IsKeyDown(Keys.LeftControl))
            {
                runA = InitRunA;
                runVmax = InitRunVmax;
                isCrouching = false;
                camera.Update(new Vector3(0, 2 * avatarBsR, 0), currentYaw, currentPitch);
            }

            // Looking direction
            currentYaw -= RotationSpeed * (curMouseState.X - prevMouseState.X);
            if (currentYaw < 0)
            {
                currentYaw += 2f * MathHelper.Pi;
            }
            else if (currentYaw > 2f * MathHelper.Pi)
            {
                currentYaw -= 2f * MathHelper.Pi;
            }

            currentPitch += RotationSpeed * (curMouseState.Y - prevMouseState.Y);
            if (currentPitch < -0.45f * MathHelper.Pi)
            {
                currentPitch = -0.45f * MathHelper.Pi;
            }
            else if (currentPitch > 0.45f * MathHelper.Pi)
            {
                currentPitch = 0.45f * MathHelper.Pi;
            }
        }

        /// <summary>
        /// Gets the current move direction by the pressed buttons.
        /// </summary>
        /// <param name="keyboardState">State of the keyboard.</param>
        /// <returns>The move direction. Null, if no direction.</returns>
        private float? getMoveDirection(KeyboardState keyboardState)
        {
            float? moveAngle = null;

            if (!isInAir)
            {
                if (keyboardState.IsKeyDown(Keys.W)) moveAngle = MathHelper.Pi;
                if (keyboardState.IsKeyDown(Keys.A)) moveAngle = 1.5f * MathHelper.Pi;
                if (keyboardState.IsKeyDown(Keys.S)) moveAngle = 0;
                if (keyboardState.IsKeyDown(Keys.D)) moveAngle = MathHelper.PiOver2;
                if (keyboardState.IsKeyDown(Keys.W) && keyboardState.IsKeyDown(Keys.A)) moveAngle = 1.25f * MathHelper.Pi;
                if (keyboardState.IsKeyDown(Keys.W) && keyboardState.IsKeyDown(Keys.D)) moveAngle = 0.75f * MathHelper.Pi;
                if (keyboardState.IsKeyDown(Keys.A) && keyboardState.IsKeyDown(Keys.S)) moveAngle = 1.75f * MathHelper.Pi;
                if (keyboardState.IsKeyDown(Keys.S) && keyboardState.IsKeyDown(Keys.D)) moveAngle = MathHelper.PiOver4;
            }

            return moveAngle;
        }

        /// <summary>
        /// Resets the avatar state to the initial position.
        /// </summary>
        private void ResetAvatar()
        {
            velocity = Vector3.Zero;
            currentPitch = 0;
            currentYaw = 0;
            camera.Position = StartPosition;
        }

        /// <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)
        {
            graphics.GraphicsDevice.Clear(Color.DarkRed);

            model.Draw(camera.ViewMatrix);

            base.Draw(gameTime);
        }
    }
}


Что я уже пробовал:

До сих пор я ничего не пробовал мне нужен совет здесь Спасибо

0 Ответов