И так в первом уроке мы рассмотрели базовые принципы вывода моделей на экран,как я уже говорил для реальных игр такой подход не подойдет,проще будет создать отдельный класс состоящий из полей и пару методов по загрузки моделей,
после этого загружая каждую модель нам всего на всего надо будет создавать экземпляры класса.
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);
}
}
}
Вообще как выводить модель в игре личное но все же есть рамки которых надо придерживатся .
полный пример