Среда, 18 Декабря 2024, 20:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
XNA Основы3D: Урок 2 "Классы Camera, LoadModel"
Alexandr2Дата: Четверг, 18 Августа 2011, 15:23 | Сообщение # 1
частый гость
Сейчас нет на сайте
И так в первом уроке мы рассмотрели базовые принципы вывода моделей на экран,как я уже говорил для реальных игр такой подход не подойдет,проще будет создать отдельный класс состоящий из полей и пару методов по загрузки моделей,
после этого загружая каждую модель нам всего на всего надо будет создавать экземпляры класса.

1.Итак запускаем студию и создаем проект XNA. Далее нам надо добавить новый класс в проект для этого в обозреватели решений правой кнопкой мыши вызовите меню добавить->класс И назовите его LoadModelGame

Созданный класс не имеет ссылки на XNA для этого просто скопируйте их из класса Game1 и замените. Теперь в теле класса LoadModelGame объявим поля. Ну например нам необходимо знать позицию объекта по-этому поля Position создадим с модификатором public это нам поможет обращатся к нему из других классов.Затем нам надо ссылку на модель Model model; Потом мы создадим ссылку на ContentManager Content; она нам нужна для загрузки моделей.

В КОМЕНТАРИЯХ ВСЕ НАПИСАННО

ПОЛЯ

Code

               public Vector3 Position;//открытое поле для позиции        
               Model model;//сама модель
               ContentManager Content;//ссылка на контент проекта


КОНСТРУКТОР

Code

                  
              //конструктор класса  внем мы предаем наш контент по загрузки модели
               public LoadModelGame(ContentManager Content)
               {
                   this.Content = Content;
               }


МЕТОД ПО ЗАГРУЗКИ МОДЕЛИ

Code

                  
               //метод загрузки передаем в параметрах строку
               //на файл который будем загружать
               public void Load(string fileName)
               {
                   model = Content.Load<Model>(fileName);
               }


МЕТОД Draw

Code

                  
//в методк Draw мы выводим модель на экран в параметрах передаем матрицы вида и проекции
               //матрица трансформациии здесь.Если нам нужно поменять координаты модели есть открытое свойство Position
               public void Draw(Matrix view, Matrix project)
               {
                   foreach (ModelMesh mesh in model.Meshes)
                   {
                       foreach (BasicEffect effect in mesh.Effects)
                       {
                           effect.EnableDefaultLighting();
                           effect.World = Matrix.CreateTranslation(Position);
                           effect.View = view;
                           effect.Projection = project;
                       }
                       mesh.Draw();
                   }
               }


полный код класса LoadModelGame

Code

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.Media;
namespace LoadModel
{
           class LoadModelGame
           {
               public Vector3 Position;//открытое поле для позиции        
               Model model;//сама модель
               ContentManager Content;//ссылка на контент проекта

               //конструктор класса  внем мы предаем наш контент по загрузки модели
               public LoadModelGame(ContentManager Content)
               {
                   this.Content = Content;
               }
               //метод загрузки передаем в параметрах строку
               //на файл который будем загружать
               public void Load(string fileName)
               {
                   model = Content.Load<Model>(fileName);
               }
               //в методк Draw мы выводим модель на экран в параметрах передаем матрицы вида и проекции
               //матрица трансформациии здесь.Если нам нужно поменять координаты модели есть открытое свойство Position
               public void Draw(Matrix view, Matrix project)
               {
                   foreach (ModelMesh mesh in model.Meshes)
                   {
                       foreach (BasicEffect effect in mesh.Effects)
                       {
                           effect.EnableDefaultLighting();
                           effect.World = Matrix.CreateTranslation(Position);
                           effect.View = view;
                           effect.Projection = project;
                       }
                       mesh.Draw();
                   }
               }

           }
}


Вот и создан класс по загрузки модели,первая часть пройдена теперь нам необходимо создать класс камеры.Проделаем такую же операцию как добавлять новый класс назовите его Camera и скопируйте необходимые ссылки.

Вот полный класс Camera

Code

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.Media;

namespace LoadModel
{
     class Camera
     {
         public Vector3 Position;//отрытое свойство позиции
         Game1 game;

         public Matrix view;//матрица вида
         public Matrix projectoion;//матрица проекции

         public Camera(Game1 game)
         {
             this.game = game;
         }
         public void Render()
         {
             view = Matrix.CreateLookAt(Position, Vector3.Zero, Vector3.Up);

             projectoion = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
                 game.GraphicsDevice.Viewport.Width / game.GraphicsDevice.Viewport.Height,
                 0.10f, 1000.0f);
         }

     }
}


Полный класс Game1

Code

          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.Media;

namespace LoadModel
{
           /// <summary>
           /// This is the main type for your game
           /// </summary>
           public class Game1 : Microsoft.Xna.Framework.Game
           {
               GraphicsDeviceManager graphics;
               SpriteBatch spriteBatch;

               //создаем экземпляры камеры и модели
               LoadModelGame model;
               Camera camera;
               public Game1()
               {
                   graphics = new GraphicsDeviceManager(this);
                   Content.RootDirectory = "Content";

                   //устанавливаем разрешение
                   graphics.PreferredBackBufferWidth = 800;
                   graphics.PreferredBackBufferHeight = 600;

                   //создаем их с помощью new  и передаем то что мы объявили в конструкторе
                   model = new LoadModelGame(this.Content);//ключивое слово this указывает что использовать ЭТОТ..        
                   //в данном случае контент
                   camera = new Camera(this);
                   camera.Position = new Vector3(0, 5, 260);
               }

               /// <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

                   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);
                   //грузим объекты
                   model.Load("Models\\teraport");
               }

               /// <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

                   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);
                   //вызываем метод камеры        
                   camera.Render();
                   //здесь в параметрах camera.view, camera.projectoion
                   //это то что мы в классе камеры хделали открытые свойство        
                   //Matrix view;Matrix projec
                   model.Draw(camera.view, camera.projectoion);

                   // TODO: Add your drawing code here

                   base.Draw(gameTime);
               }
           }
}


Вообще как выводить модель в игре личное но все же есть рамки которых надо придерживатся .

полный пример




Сообщение отредактировал Alexandr2 - Четверг, 18 Августа 2011, 20:06
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг