Ho trascritto i tuoi suggerimenti nel codice del mio progetto Albireo. Questa è la "vecchia" procedura che fa muovere la Discovery, implementata all'interno della struttura Discovery. In pratica quando l'astronave è lontana da ogni mondo risente solo del campo gravitazionale della stella (binaria) Albireo. Ma quando entra nell'orizzonte degli eventi di un qualche mondo allora risente ANCHE (e soprattutto) del suo campo gravitazionale. Questa nuova forza aggiunta dipende da due delle tante proprietà che ogni oggetto del sistema (mondo) espone: la sua massa e la sua posizione (riferita a "Location" in quanto "Position" è quella della Discovery):
codice:
public void Move()
{
Vector3 V = Go * Speed;
if (This != "")
{
if (My.Planets[This].GetType().ToString() == My.SphHType)
{
SphHWorld x = (SphHWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHTType)
{
SphHTWorld x = (SphHTWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphH64Type)
{
SphHWorld64 x = (SphHWorld64)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHT64Type)
{
SphHTWorld64 x = (SphHTWorld64)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHSType)
{
SphHSWorld x = (SphHSWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHTSType)
{
SphHTSWorld x = (SphHTSWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHBType)
{
SphHBWorld x = (SphHBWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphHTBType)
{
SphHTBWorld x = (SphHTBWorld)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
else if (My.Planets[This].GetType().ToString() == My.SphT3Type)
{
SphT3World x = (SphT3World)My.Planets[This];
V += My.Gfactor * My.G * x.Mass * Vector3.Normalize(x.Location - Position) / (x.Location - Position).LengthSquared();
}
Go = Vector3.Normalize(V);
Speed = V.Length();
AZI = azif(Go);
ALT = altf(Go);
}
...........
}
A quanto ho capito il nuovo codice di Move sarebbe (dovrebbe essere) questo:
codice:
public void Move()
{
Vector3 V = Go * Speed;
if (This != "")
{
PropertyInfo p1 = My.Planets[This].GetType().GetProperty("Mass");
float M = (float)p1.GetValue(My.Planets[This], null);
PropertyInfo p2 = My.Planets[This].GetType().GetProperty("Location");
Vector3 L = (Vector3)p2.GetValue(My.Planets[This], null);
V += My.Gfactor * My.G * M * Vector3.Normalize(L - Position) / (L - Position).LengthSquared();
Go = Vector3.Normalize(V);
Speed = V.Length();
AZI = azif(Go);
ALT = altf(Go);
}
...........
}
....ma mi dà questo errore:
"! NullReferenceException non è stata gestita. !"
"Riferimento a un oggetto non impostato su un'istanza di oggetto."
in questa riga:
codice:
float M = (float)p1.GetValue(My.Planets[This], null);
This è proprio la key del pianeta giusto, ma p1 mi risulta null. Ho controllato il metodo GetValue e la sintassi è corretta, anche il "null" come secondo parametro in quanto le proprietà degli oggetti del sistema non sono indicizzate.
Ho provato a vedere se per caso non dipende dal fatto che Mass è un campo derivato (non fa parte dei parametri del costruttore) ed è calcolato a partire dalla densità e dal Size, mettendo "//" alle prime 2 righe ma l'errore si ripete anche per la proprietà Location che invece compare nella firma del costruttore.
Allora?