Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

MVC и камера
Просмотров: 2985 - Заполнять: Chort - 14.06.2011 16:17:01
 
Читая примеры с create.msdn.com и натыкаясь на реализации камер, заметил одну особенность - взаимодействие с камерой и ее поведение описано прямо в классе камеры. Такое положение дел я посчитал неприемлемым в виду некоторых минусов, как например то что при изменении поведения камеры надо везде менять экземпляр камеры (да и в реалии камера не движется сама, ею управляет человек). Поэтому советую применять тут (ну насколько можно) "патерн" MVC, где камера - модель, нарисованная сцена с использованием камеры - представление, поведение - поведение. Примеры :

Реализация камеры
GeSHi: C#
  1. class Camera
  2. {
  3. public Matrix View { get; private set; }
  4. public Matrix Projection { get; private set; }
  5.  
  6. public Vector3 Position { get; set; }
  7. public Vector3 Direction { get; set; }
  8. public Vector3 Up { get; set; }
  9. public Vector3 Right { get; private set; }
  10.  
  11. public float FieldOfView { get; set; }
  12. public float Near { get; set; }
  13. public float Far { get; set; }
  14.  
  15. public Game Game { get; private set; }
  16.  
  17. public Camera(Game game)
  18. {
  19. this.Game = game;
  20. }
  21.  
  22. public void Update()
  23. {
  24. this.View = Matrix.CreateLookAt(this.Position, this.Position + this.Direction, this.Up);
  25. this.Projection = Matrix.CreatePerspectiveFieldOfView(this.FieldOfView,
  26. this.Game.GraphicsDevice.Viewport.AspectRatio, this.Near, this.Far);
  27. this.Right = Vector3.Normalize(Vector3.Cross(this.Direction, this.Up));
  28. }
  29. }
Добавлено за 0.008 секунд, используя GeSHi 1.0.8.2


Абстрактный "контролер"
GeSHi: C#
  1. abstract class AbsCameraController
  2. {
  3. public Camera Camera { get; set; }
  4.  
  5. public AbsCameraController(Camera camera)
  6. {
  7. this.Camera = camera;
  8. }
  9.  
  10. public abstract void Update(float seconds);
  11. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2


"контролер" следящий за точной Target на растоянии Distance
GeSHi: C#
  1. class TargetCameraController : AbsCameraController
  2. {
  3. public Vector3 Target { get; set; }
  4. public float Distance { get; set; }
  5.  
  6. public TargetCameraController(Camera camera)
  7. : base(camera)
  8. {
  9. }
  10.  
  11. public override void Update(float seconds)
  12. {
  13. this.Camera.Position = this.Target - this.Distance * this.Camera.Direction;
  14. }
  15. }
Добавлено за 0.005 секунд, используя GeSHi 1.0.8.2


"контролер" для управления камерой клавишами
GeSHi: C#
  1. class KeyboardCameraController : AbsCameraController
  2. {
  3. public float Velocity { get; set; }
  4.  
  5. public KeyboardCameraController(Camera camera)
  6. : base(camera)
  7. {
  8. }
  9.  
  10. public override void Update(float seconds)
  11. {
  12. KeyboardState kState = Keyboard.GetState();
  13.  
  14. if (kState.IsKeyDown(Keys.Up))
  15. this.Camera.Position += this.Velocity * this.Camera.Direction;
  16. if (kState.IsKeyDown(Keys.Down))
  17. this.Camera.Position -= this.Velocity * this.Camera.Direction;
  18. if (kState.IsKeyDown(Keys.Right))
  19. this.Camera.Position += this.Velocity * this.Camera.Right;
  20. if (kState.IsKeyDown(Keys.Left))
  21. this.Camera.Position -= this.Velocity * this.Camera.Right;
  22. }
  23. }
Добавлено за 0.007 секунд, используя GeSHi 1.0.8.2
Комментарии
#1 | Mafey 23.06.2011 18:46:30
Вообще этот паттерн можно применять ко всему практически. Он очень "читабельный".
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.

© 2007 - 2008 by Elactos
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,29 секунд 8,711,921 уникальных посетителей