2013-07-23 3 views
0

Я работаю над игрой, и у меня есть список доступных символов каждый игрок выбирает из, каждый символ содержит (3D) Модель и Texture2D значок, который был загружен в через Контентный трубопровод.XNA - Копирование модели

Проблема в том, что я хочу, чтобы более одного игрока выбирали один и тот же символ, но player1Char = charDatabase[choosenChar]; по ссылке, поэтому любые повторные варианты будут относиться к одной и той же модели.

Вот конструктор класса символов, который я пытаюсь скопировать, класс CModel - это всего лишь модель с позициями, поворотными и масштабными значениями для этой модели.

public Character(CModel model, string name, int HP, Vector2 iconPositionOnSheet) 

Я думаю, что хочу сделать глубокую копию этого класса, но класс Model не сериализуем. Единственный способ, которым я могу это сделать, - загрузить одну и ту же модель из своего файла с Content.Load, если выбран повтор, но мне интересно, есть ли способ просто скопировать класс символов и, следовательно, модель, потому что это будет легче для меня.

+0

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

ответ

0

Вместо передачи объекта Model конструктору передайте объект ContentManager (содержимое) и строку имени файла модели. Затем в теле конструктора вызовите Content.Load<Model>(filename). Затем, если вы хотите дать ему альтернативный цвет или текстуру, клонируйте basicEffect и сбросьте его с помощью текстуры/цвета, которые вы хотите, чтобы этот символ был установлен, и вы настроены.

Теперь новый объект модели будет выделен в другой части кучи (созданной экземпляром) из другой подобной модели, чтобы оба игрока могли иметь уникальный объект.

Одним из умных вещей, которые делает менеджер контента, является повторное использование ресурсов графического процессора, если они уже загружены. Поэтому, если вы загрузите модель во второй раз, хотя она дает вам эту уникальную ссылку на кучу для вашего C#, оба объекта модели будут использовать одни и те же вершинные буферы и эффекты, чтобы их не нужно было создавать дважды.

+0

Спасибо Стив, это лучше, чем я бы сделал, но это не совсем то, что я ищу, потому что на этом этапе я уже создал всех своих персонажей, я создаю каждого персонажа, помещаю их в список, потому что все они отображаются на экране выбора персонажа перед воспроизведением. Итак, было бы проще просто сделать что-то вроде 'player1Char = characterList [selected]' в качестве глубокой копии, но я не уверен, что такое возможно даже с моделью. – user1693188

+0

Я не думаю, что положение, масштаб, вращение принадлежат классу Cmodel. эти атрибуты уникальны для игрока, а не для модели. Например, вот пример двух игроков, использующих одну и ту же модель, но с разными текстурами, масштабом, положением и поворотами. Класс игры: http://pastebin.com/phNbCELH, и вот класс игрока: http://pastebin.com/FSb09tp1. Хотя и bill & joe используют одну и ту же ссылку на модель, ее рисуют в разных местах сцены с разными текстуры и избегать использования ресурсов, чем это необходимо. –

+0

Ок, я этого не знал, я предполагал, что это похоже на Текстуры, которые не работают так, я не думаю. Зная, что я могу справиться с этим таким образом, который чувствует себя намного чище, спасибо большое! – user1693188

Смежные вопросы