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
- 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
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
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
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
Ultima modifica effettuata da Thejuster 14/07/09 15:30
mire.forumfree.it/ - Mire Engine
C# UI Designer
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
mire.forumfree.it/ - Mire Engine
C# UI Designer
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...
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
così dovrebbe funzionarti
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
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à.
In questo modo, oltre al modello, occupi solo 4 bytes di memoria.
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