#c# #xna #monogame
#c# #xna #моногейм
Вопрос:
Я пытаюсь преобразовать 2D-игру в 3D, и у меня возникли некоторые проблемы с текстурами. Вся игра состоит из кубов, поэтому я использую вершины для создания куба и вызываю его из метода draw . Однако, кажется, я могу раскрасить все кубы только одной текстурой, используя базовый эффект. Я предполагаю, что мне нужно использовать какой-то другой эффект, чтобы я мог выбрать текстуру для каждого куба, но не совсем уверен, что делать. Любая помощь приветствуется
Было бы использовать цикл, подобный следующему, чтобы нарисовать кубы на экране. Каким-то образом нужно, чтобы текстура была разной для каждого куба
foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
{
pass.Apply();
for (int i=0;i<mapsize;i )
{
vertices = createCubeTexture(-1.0f, 0.5f);
device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
}
}
Комментарии:
1. Нам понадобится код, чтобы глубже оценить проблему. Прямо сейчас, похоже, вы просто рисуете столько кубов, сколько вы сохранили в списке. Очевидно, что это будет проблемой, если вы не загружаете отдельную текстуру для каждого куба, который вы рисуете. Но покажите какой-нибудь код.
2. Добавлен приведенный выше код, надеюсь, это поможет
Ответ №1:
Видишь ли, вот в чем твоя проблема:
for (int i=0;i<mapsize;i )
{
vertices = createCubeTexture(-1.0f, 0.5f);
device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
}
Вы перебираете всю карту, создавая куб с текстурой, каждый раз, когда вы перебираете mapsize (предположительно, int). Это здорово, но проблема заключается в том, что метод создаст одинаковую текстуру для всех кубов. То, что вам нужно будет сделать, это что-то вроде этого:
public class Cube
{
public Vector3 Position { get; set; }
public Texture2D Texture { get; set; }
public Cube(Vector3 position, Texture2D texture)
{
Position = position;
Texture = texture;
}
public void Draw(GraphicsDevice device)
{
var vertices = createCubeTexture(position);
device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
}
}
Обратите внимание, что я уже довольно давно не работал с ручным рисованием кубов, поэтому я не помню, ТОЧНО ли это так, но если нет, то это очень похоже. Просто перебирайте каждый куб и вызывайте метод Draw .
А затем, когда вы создаете экземпляр кубов, вы передаете другую текстуру, в зависимости от того, какой куб вы создаете 🙂
Комментарии:
1. Это имеет смысл, поэтому мне понадобился бы другой эффект для каждой текстуры, и будет ли эффект проходить снова и снова для каждого куба отдельно? Я думал, что был бы способ использовать только один эффект, но с несколькими текстурами..
2. Создайте экземпляр эффекта вне кубов и просто передайте его в качестве ссылки. Это должно сработать 🙂