
Linkinf22 (Normal User)
Rookie
    
Messaggi: 59
Iscritto: 28/06/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?
|
|

riseofapocalypse (Ex-Member)
Pro
    
Messaggi: 150
Iscritto: 08/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
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2253
Iscritto: 04/05/2008
|
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 |
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 |
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 il 14/07/2009 alle 17:30
|
|

Linkinf22 (Normal User)
Rookie
    
Messaggi: 59
Iscritto: 28/06/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 |
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2253
Iscritto: 04/05/2008
|
Codice sorgente - presumibilmente C# |
//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)) { 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
|
|

Linkinf22 (Normal User)
Rookie
    
Messaggi: 59
Iscritto: 28/06/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...
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2253
Iscritto: 04/05/2008
|
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++ |
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
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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 |
Matrix.CreateTranslation(new Vector3(i, 0, 0))
|
In questo modo, oltre al modello, occupi solo 4 bytes di memoria.
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2253
Iscritto: 04/05/2008
|
( 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
|
|