Question

Ok gars, celui-ci tue littéralement mon esprit, comme je l'ai pu rendre des modèles juste bien (En fait, je devais faire tester mon appareil photo).

Cependant, maintenant que j'essaie de dessiner un cube à partir d'un tampon de sommet et d'index, cela ne fonctionnera tout simplement pas. (J'ai été capable de dessiner des triangles et tels, mais jamais de leur propre classe).

Mon objectif final est de pouvoir construire des régions de 64x64x8 cubes pour créer le monde du jeu. (Pas un clone Minecraft, en fait un RTS - cela aura une sensation de "2D" dans ce que le monde du jeu lui-même ne sera jamais de 8 cubes, mais je me digresse).

de regarder par-dessus les différents tutoriels d'index et de sommet sur le Web, il me semble que cela devrait fonctionner. Voici un code .....

jeu.cs

    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
        float timeDifference = (float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
        cam.Update(timeDifference);
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        // TODO: Add your drawing code here

        cube = new CubeShape(Color.Black, new Vector3(0, 0, 0), GraphicsDevice);


        RasterizerState rasterizerState = new RasterizerState();
        rasterizerState.CullMode = CullMode.None;
        GraphicsDevice.RasterizerState = rasterizerState;

        cube.Render(cam.viewMatrix,cam.projectionMatrix);
        base.Draw(gameTime);
    }
}

Et mon cube (celui-ci est un peu long, désolé)

class CubeShape
{
    //Transform later to have static v and i buffers.
    private VertexBuffer vBuffer;
    public VertexBuffer VBuffer
    { get { return vBuffer; } set { vBuffer = value; } }

    private IndexBuffer iBuffer;
    public IndexBuffer IBuffer
    { get { return iBuffer; } set { iBuffer = value; } }

    private BasicEffect bEffect;
    public BasicEffect BEffect
    { get { return bEffect; } set { bEffect = value; } }

    private Matrix world;
    public Matrix World
    { get { return world; } set { world = value; } }

    private Matrix view;
    public Matrix View
    { get { return view; } set { view = value; } }

    private Matrix projection;
    private Matrix Projection
    { get { return projection; } set { projection = value; } }

    private Color color;
    public Color Color
    { get { return color; } set { color = value; } }

    private Vector3 position;
    public Vector3 Position
    { get { return position; } set { position = value; } }

    //Need to change this eventually to use textures.
    private VertexPositionColor[] vertices;
    byte[] indices;


    private GraphicsDevice device;
    //constructors!
    public CubeShape(Color inColor,Vector3 inPosition,GraphicsDevice inDevice)
    {
        device = inDevice;


        this.color = inColor;
        this.position = inPosition;
        SetUpVertices();
        SetUpIndices();
        //world = Matrix.CreateTranslation(position);
        world = Matrix.CreateTranslation(0, 0, 0);
        bEffect = new BasicEffect(device);
        bEffect.World = world;
        bEffect.VertexColorEnabled = true;
    }
    //end constructors!

    // >.<
    public void Render(Matrix view,Matrix projection)
    {
        bEffect.View = view;
        bEffect.Projection = projection;


        device.SetVertexBuffer(vBuffer);
        device.Indices = IBuffer;

        foreach(EffectPass pass in bEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
            device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 8, 0, 12);
        }
    }

    /// <summary>
    /// Sets up the vertices for a cube using 8 unique vertices.
    /// Build order is front to back, left to up to right to down.
    /// </summary>
    private void SetUpVertices()
    {
        vertices = new VertexPositionColor[8];

        //front left bottom corner
        vertices[0] = new VertexPositionColor(new Vector3(0, 0, 0), color);
        //front left upper corner
        vertices[1] = new VertexPositionColor(new Vector3(0, 100, 0), color);
        //front right upper corner
        vertices[2] = new VertexPositionColor(new Vector3(100, 100, 0), color);
        //front lower right corner
        vertices[3] = new VertexPositionColor(new Vector3(100, 0, 0), color);
        //back left lower corner
        vertices[4] = new VertexPositionColor(new Vector3(0, 0, -100), color);
        //back left upper corner
        vertices[5] = new VertexPositionColor(new Vector3(0, 100, -100), color);
        //back right upper corner
        vertices[6] = new VertexPositionColor(new Vector3(100, 100, -100), color);
        //back right lower corner
        vertices[7] = new VertexPositionColor(new Vector3(100, 0, -100), color);

        vBuffer = new VertexBuffer(device, typeof(VertexPositionColor), 8, BufferUsage.WriteOnly);
        vBuffer.SetData<VertexPositionColor>(vertices);
    }

    /// <summary>
    /// Sets up the indices for a cube. Has 36 positions that match up
    /// to the element numbers of the vertices created earlier.
    /// Valid range is 0-7 for each value.
    /// </summary>
    private void SetUpIndices()
    {
        indices = new byte[36];

        //Front face
        //bottom right triangle
        indices[0] = 0;
        indices[1] = 3;
        indices[2] = 2;
        //top left triangle
        indices[3] = 2;
        indices[4] = 1;
        indices[5] = 0;
        //back face
        //bottom right triangle
        indices[6] = 4;
        indices[7] = 7;
        indices[8] = 6;
        //top left triangle
        indices[9] = 6;
        indices[10] = 5;
        indices[11] = 4;
        //Top face
        //bottom right triangle
        indices[12] = 1;
        indices[13] = 2;
        indices[14] = 6;
        //top left triangle
        indices[15] = 6;
        indices[16] = 5;
        indices[17] = 1;
        //bottom face
        //bottom right triangle
        indices[18] = 4;
        indices[19] = 7;
        indices[20] = 3;
        //top left triangle
        indices[21] = 3;
        indices[22] = 0;
        indices[23] = 4;
        //left face
        //bottom right triangle
        indices[24] = 4;
        indices[25] = 0;
        indices[26] = 1;
        //top left triangle
        indices[27] = 1;
        indices[28] = 5;
        indices[29] = 4;
        //right face
        //bottom right triangle
        indices[30] = 3;
        indices[31] = 7;
        indices[32] = 6;
        //top left triangle
        indices[33] = 6;
        indices[34] = 2;
        indices[35] = 3;

        iBuffer = new IndexBuffer(device, typeof(short), 36, BufferUsage.WriteOnly);
        iBuffer.SetData(indices);
    }
}

Je n'ai vraiment aucune idée de la raison pour laquelle cela ne fonctionne pas. Probablement parce que j'ai un STOTEDOWN avec le code des 4 dernières heures>. <

Oh, la caméra commence à 0,0,50 et est confrontée à 0,0,0. Cela me permet également de se déplacer avec la souris et le clavier (comme n'importe quelle came RTS) avec rotation (bouton de la souris moyen tenu). J'ai cherché partout pour m'assurer que mon cube n'était pas quelque part en dehors de ma plage de vue, mais tout ce que je vois est bleu>. <

J'apprécierais toute aide ici.

P.s. En tant que question secondaire, toute astuce sur la façon de partager des tampons entre cubes? Je lis cela que puisque la géométrie d'un cube ne change jamais, qu'il est plus efficace de partager des tampons, mais je ne sais pas comment y aller ... Créez un tampon décemment et remplissez-le de cubes d'une sorte de classe de liste qui Peut contenir tous les cubes qui doivent être rendus peut-être? pas même sûr où commencer à chercher. Encore une fois, merci beaucoup pour toute entrée / conseil.

Était-ce utile?

La solution

On dirait que vous avez des problèmes de frappe.Je l'ai eu pour fonctionner en modifiant le code suivant:

//byte[] indices;
short[] indices;

//indices = new byte[36];
indices = new short[36];

//iBuffer = new IndexBuffer(device, typeof(short), 36, BufferUsage.WriteOnly);
iBuffer = new IndexBuffer(device, IndexElementSize.SixteenBits, sizeof(short) * indices.Length, BufferUsage.WriteOnly);

Si cela ne fonctionne toujours pas, criez-moi et je vérifierai pour que je ne manquais rien.Gardez à l'esprit, j'ai dû utiliser l'une de mes propres cours de caméra puisque vous n'avez pas inclus le vôtre.

Je ne sais pas comment répondre à votre deuxième question.Vous voudrez peut-être poser une question comme une question distincte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top