Одноигровые текстуры с несколькими вершинами

#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. Создайте экземпляр эффекта вне кубов и просто передайте его в качестве ссылки. Это должно сработать 🙂