Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C# XNA] creare infinitamente modelli 3D
Forum - C# / VB.NET - [C# XNA] creare infinitamente modelli 3D

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 16:22
Martedì, 14/07/2009
Questo topic è stato chiuso dal moderatore

Ciao!

Sto cercando di fare un gioco in cui alla pressione di un tasto compare un modello, quando viene ripremuto ne deve fare un' altro uguale al precedente ma in un' altra posizione e così via, praticamente deve crearmi più volte un modello quante sono le pressioni del tasto.

Facciamo finta che sto facendo un videogioco in cui alla pressione del tasto P spunta una pallina, poi lo ripremo 20 volte e devono spuntare altre palline distanti di 50 pixel da quella precedente (le palline si devono spostare sull' asse X).

Come potrei fare?

PM
Avatar
riseofapocalypse (Ex-Member)
Pro


Messaggi: 150
Iscritto: 08/07/2009

Segnala al moderatore
Postato alle 17:07
Martedì, 14/07/2009
Non ho mai utilizzato XNA, soltanto OpenTK, comunque non credo sia poi così diverso! In OpenTK si procederebbe così:
- Creo la classe Palla con le proprietà (Grandezza, Posizione) ed i metodi (Costruttore, Render) necessari;
- Dichiaro una List di Palla chiamata Palle inizialmente vuota;
- All'Update del Frame della finestra principale, controllo se è premuto il tasto P: se si, aggiungo un nuovo oggetto di classe Palla in Palle (con Posizione.X uguale alla Posizione.X dell'ultima palla più 50);
- Al Render del Frame della finestra principale, chiamo il metodo Render di ogni palla in Palle.
Spero di essere stato d'aiuto :k:

PM
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2253
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:27
Martedì, 14/07/2009
Testo quotato

Postato originariamente da riseofapocalypse:

Non ho mai utilizzato XNA, soltanto OpenTK, comunque non credo sia poi così diverso! In OpenTK si procederebbe così:
- Creo la classe Palla con le proprietà (Grandezza, Posizione) ed i metodi (Costruttore, Render) necessari;
- Dichiaro una List di Palla chiamata Palle inizialmente vuota;
- All'Update del Frame della finestra principale, controllo se è premuto il tasto P: se si, aggiungo un nuovo oggetto di classe Palla in Palle (con Posizione.X uguale alla Posizione.X dell'ultima palla più 50);
- Al Render del Frame della finestra principale, chiamo il metodo Render di ogni palla in Palle.
Spero di essere stato d'aiuto :k:



No XNA Funziona tutto in un'altro modo. :)


Per fare quello che intendi hai bisogno di una struttura di dati che contiene Vector3 e un Modello per fare un semplice esempio



List<Ball> Palline = new List<Ball>();

public struct Ball {

public Vector3 Posizione;
public Model Modello;

}




Alla pressione di un tasto quando vuoi che venga inserita
basta fare



//Nel Load Content

Model Modello = Content.Load<Model>(@"Modello");


//Nel tasto esempio Invio

BL = new Ball();

BL.Modello = Modello;
BL.Posizione = new Vector3(0f,0f,0f);

Palline.Add(BL);




//Nel Draw


int indice = 0;


for (i=0; i < Palline.Count; i++) {

//foreach del modello
//e lo stampi ricavando la posizione dall'indice
// esempio


}


Codice sorgente - presumibilmente C# / VB.NET

  1. posizione Mesh in 3DSpace
  2.  
  3.  
  4.  
  5. Palline[i].Modello va nel ciclo Foreach per identificare il modello
  6.  
  7. Palline[i].Posizione  và nel drawing delle cordinate



e questo piccolo ciclo ti permette di recuperare tutte le palline contenute nella lista
disegnandotele tutte a schermo.

ovviamente puoi modificarne la sua posizione eseguendo un nuovo foreach sul modello :k:

Ultima modifica effettuata da Thejuster il 14/07/2009 alle 17:30


PM
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 18:45
Martedì, 14/07/2009
Non ho capito come fare a stamparlo ricavando la posizione dall' indice :(

Ultima modifica effettuata da Linkinf22 il 14/07/2009 alle 18:46
PM
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2253
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 19:13
Martedì, 14/07/2009

Codice sorgente - presumibilmente C#

  1. //Modello della Palla
  2. Model Palla;
  3.  
  4. List<Ball> Palline = new List<Ball>();
  5.  
  6. public struct Ball {
  7.  
  8. public Model Modello;
  9. public Vector3 Posizione;
  10.  
  11. }
  12.  
  13.  
  14.  
  15.  
  16. protected override void LoadContent()
  17.         {
  18.            
  19. Palla = Content.Load<Model>(@"Modelli\\Palla");
  20.  
  21.    
  22.         }
  23.  
  24.  
  25.  if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Enter))
  26.    {
  27.  
  28.    Ball P = new Ball();
  29.    
  30.    P.Modello = Palla;
  31.    P.Posizione = new Vector3(0,0,0); //oppure una tua posizione a piacere
  32.    
  33.    Palline.Add(P);
  34.  
  35.    }
  36.  
  37.  
  38.    protected override void Draw(GameTime gameTime)
  39.         {
  40. int i = 0;
  41.  
  42.             for (i = 0; i < Palline.Count; i++)
  43.             {
  44.  
  45.                 Matrix[] boneTransforms = new Matrix[Palline[i].Modello.Bones.Count];
  46.                 modello.CopyAbsoluteBoneTransformsTo(boneTransforms);
  47.  
  48.                 foreach (ModelMesh mesh in Palline[i].Modello.Meshes)
  49.                 {
  50.  
  51.                     Matrix World = boneTransforms[mesh.ParentBone.Index] *
  52.                                  
  53.                                    Matrix.CreateTranslation(Palline[i].Posizione);
  54.  
  55.  
  56.                     foreach (BasicEffect basiceffect in mesh.Effects)
  57.                     {
  58.  
  59.                         basiceffect.TextureEnabled = true;
  60.                         basiceffect.Texture = modelTexture;
  61.  
  62.                         basiceffect.EnableDefaultLighting();
  63.                         basiceffect.Projection = camera.mProjection;
  64.                         basiceffect.View = camera.mView;
  65.                         basiceffect.World = World;
  66.                     }
  67.                     mesh.Draw();
  68.                 }
  69.  
  70.  
  71.             }
  72.  
  73.            
  74.  
  75.             base.Draw(gameTime);
  76.         }
  77.  
  78.  
  79. }




PS:
Non l'ho testato ma la logica dovrebbe essere questa
fatti piu o meno un resoconto sull'esempio della struttura e dalla lista utilizzata
consentendo al Cilco For ed al ciclo Foreach la localizzazione del modello nella lista
Tramide l'indice i che si incrementa  :k:


PM
Avatar
Linkinf22 (Normal User)
Rookie


Messaggi: 59
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 21:54
Martedì, 14/07/2009
Non mi funziona... mi appare una volta poi non mi appare più

namespace Domino
{
    public class Principale : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        KeyboardState StatoDellaTastiera;
        List<ListDomino> NDomino = new List<ListDomino>();
        Model Modello;
        int i;
        int AumentoPosizioneDomino;

        public Principale()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        protected override void Initialize()
        {
            Window.Title = "Domino";
            graphics.PreferredBackBufferWidth = Convert.ToInt32("1024");
            graphics.PreferredBackBufferHeight = Convert.ToInt32("768");
            graphics.ToggleFullScreen();
            Cursor.Show();
            base.Initialize();
        }

        protected override void LoadContent()
        {
            Modello = Content.Load<Model>("Modelli/ModelloDomino");
        }

        protected override void UnloadContent()
        {

        }

        protected override void Update(GameTime gameTime)
        {
            StatoDellaTastiera = Keyboard.GetState();

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape))
            {
                Exit();
            }

            if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A))
            {
                ListDomino DMN = new ListDomino();
                DMN.ModelloDomino = Modello;
                DMN.Posizione = new Vector3(0, 0, 0);
                NDomino.Add(DMN);
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
            int i = 0;

            for (i = 0; i < NDomino.Count; i++)
            {
                Matrix[] boneTrasforms = new Matrix[NDomino.ModelloDomino.Bones.Count];
                Modello.CopyAbsoluteBoneTransformsTo(boneTrasforms);

                foreach (ModelMesh mesh in NDomino.ModelloDomino.Meshes)
                {
                    Matrix World = boneTrasforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(NDomino.Posizione);

                    foreach (BasicEffect effect in mesh.Effects)
                    {
                        effect.TextureEnabled = true;
                        effect.EnableDefaultLighting();
                        effect.Projection = Matrix.CreatePerspectiveFieldOfView(1, 1.33f, 10, 10000);
                        effect.View = Matrix.CreateLookAt(new Vector3(100, 150, 200), NDomino.Posizione, Vector3.Up);
                    }
                    mesh.Draw(SaveStateMode.SaveState);
                }
            }
            base.Draw(gameTime);
        }

        public struct ListDomino
        {
            public Vector3 Posizione;
            public Model ModelloDomino;
        }
    }
}

Scusatemi ma ho iniziato ad utilizzare XNA solo da tre giorni...

PM
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2253
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 0:00
Mercoledì, 15/07/2009
Bhe mi sembra logico che ti appaia una volta sola :)
difatti non hai detto che alla pressione del tasto ti vada ad aggiungiere un'altra pallina in un'altra posizione

ma hai detto che alla pressione del tasto A ti crea una nuova pallina allo stesso punto 0,0,0

prova ad inserire un incrementatore del tipo dichiari in alto

Vector3 Incrementatore = new Vector3(0,0,0);

ed alla pressione del tasto

Codice sorgente - presumibilmente C++

  1. if (StatoDellaTastiera.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A))
  2.             {
  3.                 ListDomino DMN = new ListDomino();
  4.                 DMN.ModelloDomino = Modello;
  5.                 DMN.Posizione = new Vector3(Incrementatore);
  6.                 NDomino.Add(DMN);
  7.                 Incrementatore = new Vector3(Incrementatore.X + 0.5f,0,0);
  8.  
  9.             }



così dovrebbe funzionarti :)


PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:38
Mercoledì, 15/07/2009
La soluzione di riseofapocalypse non era sbagliata. Anzi, è anche migliore: infatti tu crei tante strutture quante sono le pressioni, ma con esse crei altrettanti modelli. E questo è del tutto inutile dato che il modello è sempre lo stesso: basta averne uno che si disegna tante volte.
Anzi, senza neppure usare una struttura, potresti tenere come dato un solo numero che ti dice quante palline ci sono. Poi, è sufficiente motiplicare la matrice World per una matrice traslazione che sposta su X di i unità.
Codice sorgente - presumibilmente Plain Text

  1. Matrix.CreateTranslation(new Vector3(i, 0, 0))


In questo modo, oltre al modello, occupi solo 4 bytes di memoria.

PM
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2253
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:07
Mercoledì, 15/07/2009
( Andando un secondo OT ovviamente una semplice discussione tra programmatori
senza disguidi. )

bhe si, però la cosa cambia
quando si tenta di gestire uno dei tanti modelli disegnati.

prendi esempio 300 palline.
se serve solo un semplice Draw va benissimo così.

ma penso che se stia facendo un domino abbia la necessità di controllare ogni oggetto della scena e questo e possibile farlo solo tramide una lista e un indice per identificarli. non credi?

per le risorse non sò quale sia la differenza tra una lista e una varabile
questo esempio e un mio progetto basato sul TEngine.


http://www.youtube.com/watch?v=LXammFSCUK0


l'engine e strutturato tutto sulle liste.
ed in una scena come quella esempio arrivo a 74fps
un dispendio di risorse minimo gestito tutto tra liste.

Ultima modifica effettuata da Thejuster il 15/07/2009 alle 10:40


PM
Pagine: [ 1 2 ] Precedente | Prossimo