Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
14/07/09 14:22
Linkinf22
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?
aaa
14/07/09 15:07
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:
aaa
14/07/09 15:27
Thejuster
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


}



posizione Mesh in 3DSpace



Palline[i].Modello va nel ciclo Foreach per identificare il modello

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 14/07/09 15:30
mire.forumfree.it/ - Mire Engine
C# UI Designer
14/07/09 16:45
Linkinf22
Non ho capito come fare a stamparlo ricavando la posizione dall' indice :(
Ultima modifica effettuata da Linkinf22 14/07/09 16:46
aaa
14/07/09 17:13
Thejuster


//Modello della Palla
Model Palla;

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

public struct Ball {

public Model Modello;
public Vector3 Posizione;

}




protected override void LoadContent()
        {
            
Palla = Content.Load<Model>(@"Modelli\Palla");

   
        }


 if (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Enter))
   {

   Ball P = new Ball();
   
   P.Modello = Palla;
   P.Posizione = new Vector3(0,0,0); //oppure una tua posizione a piacere
   
   Palline.Add(P);

   }


   protected override void Draw(GameTime gameTime)
        {
int i = 0;

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

                Matrix[] boneTransforms = new Matrix[Palline[i].Modello.Bones.Count];
                modello.CopyAbsoluteBoneTransformsTo(boneTransforms);

                foreach (ModelMesh mesh in Palline[i].Modello.Meshes)
                {

                    Matrix World = boneTransforms[mesh.ParentBone.Index] *
                                 
                                   Matrix.CreateTranslation(Palline[i].Posizione);


                    foreach (BasicEffect basiceffect in mesh.Effects)
                    {

                        basiceffect.TextureEnabled = true;
                        basiceffect.Texture = modelTexture;

                        basiceffect.EnableDefaultLighting();
                        basiceffect.Projection = camera.mProjection;
                        basiceffect.View = camera.mView;
                        basiceffect.World = World;
                    }
                    mesh.Draw();
                }


            }

           

            base.Draw(gameTime);
        }


}




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:
mire.forumfree.it/ - Mire Engine
C# UI Designer
14/07/09 19:54
Linkinf22
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[i].ModelloDomino.Bones.Count];
Modello.CopyAbsoluteBoneTransformsTo(boneTrasforms);

foreach (ModelMesh mesh in NDomino[i].ModelloDomino.Meshes)
{
Matrix World = boneTrasforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(NDomino[i].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[i].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...
aaa
14/07/09 22:00
Thejuster
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


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

            } 



così dovrebbe funzionarti :)
mire.forumfree.it/ - Mire Engine
C# UI Designer
15/07/09 7:38
Il Totem
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à.
Matrix.CreateTranslation(new Vector3(i, 0, 0))

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