Fantastica la storia dei palloncini e della contraerea.
Valeva la pena avere questi dubbi.... me la sono scritta nel manuale di C#.
Per inciso, dando un'occhiata al tuo codice mi sembra ci sia una certa confusione su static e compagnia - nello specifico, inizializzi variabili static dentro al costruttore d'istanza in linea di massima nella tua classe non credo ci dovrebbe essere alcunché di static.
Detto tra noi, il programma funziona alla grande ma molte cose le ho scritte per intuito. E' da poco tempo che studio il C# (figurati Xna) e non scherzavo quando dicevo che molte cose le uso anche se non le ho capite a fondo. In particolare le "public static" della classe My, scritta nel file My.cs, se non fossero static, non sarebbero accessibili alle varie strutture dei mondi ognuna delle quali è scritta in un file xxx.cs a parte. Faccio un esempio.
Se mi avvicino troppo ad un oggetto SphWorld questo deve trasformarsi in un oggetto SphHWorld dove 'H' sta per Heightmap (SphWorld invece descrive una "palla da golf", piccola, leggera, nuda e cruda.
Si, ma di quanto mi devo avvicinare? Ogni tipo di "mondo" ha la sua distanza critica detta EHorizon (orizzonte degli eventi). Ecco la parte iniziale della struttura SphWorld, scritta nel file SphWorld.cs:
codice:
public struct SphWorld
{
//campi di coerenza
public Color Color;
public float Density;
public Texture2D HeightmapN, HeightmapE, HeightmapS;
public float Hfactor;
public Vector3 Inclination;
public bool IsComa;
public Vector3 Location;
public float LocalGFactor;
public Vector3 Rotation;
public float Size;
public Texture2D Texture;
public Vector3 Velocity;
//campi derivati
public VertexPositionNormalColor[] vertices, AbsV;
#if OLD16
public System.Int16[] indices;
#else
public int[] indices;
#endif
public float Ehorizon;
public float FarD;
public float Mass;
public float GuardianIndex;
public float RemoteIndex;
public static int n, Tv, Tn;
public static float Hmod;
public SphWorld(Color C, float D, float F, Texture2D HN, Texture2D HE, Texture2D HS, float Hf, Vector3 I, bool IC, Vector3 L, Vector3 R, float S, Texture2D T, Vector3 V)
{
Color = C;
Density = D;
HeightmapN = HN;
HeightmapE = HE;
HeightmapS = HS;
Hfactor = Hf;
Inclination = I;
IsComa = IC;
Location = L;
LocalGFactor = F;
Rotation = R;
Size = S;
Texture = T;
Velocity = V;
Ehorizon = My.Efactor * S;
......
Come si vede ci sono campi "di coerenza" (questa definizione è legata ad un aspetto molto complesso del programma, ma in sintesi sono i parametri che compaiono nel costruttore) e "campi derivati" (non presenti nella firma del costruttore ma che vengono calcolati dai campi coerenti). In particolare l'EHorizon di un oggetto SphWorld è precisamente il suo Size moltiplicato per un fattore che voglio impostare dal file principale My.cs. Questo fattore è dichiarato insieme al suo valore all'inizio della classe My:
codice:
public class My : Microsoft.Xna.Framework.Game
{
//Generals
public static GraphicsDeviceManager Graphicsdevicemanager;
#if WIDE
public static int RisX, RisY;
#else
public static int RisX = 1350;
public static int RisY = 650;
#endif
public static Effect ShaderColor, ShaderLightColor, ShaderLightTexture, ShaderTexture;
public static Matrix View, Projection, World = Matrix.Identity;
public static Vector3 LightDirection;
public static SpriteBatch Spritebatch;
public static Texture2D Background;
public static SpriteFont Spritefont;
public static Random Rnd = new Random((int)DateTime.Now.Ticks);
public static RasterizerState Rasterizerstate; //per il billboarding
//BUFFERS
public static VertexBuffer Vertexbuffer;
public static IndexBuffer Indexbuffer;
//System Gravity
public static float D = 1f;
public static float Gfactor = 0.001f;//attenuatore gravità locale su Discovery (default: 0.001f)
#if S
public static float R = 60000f;
public static int n = 4;
public static float Vn = 100f;
//-------------Derived----------------
public static float G;
public static float M;
#elif T
public static int n = 2;
public static float Pn = 5f;
public static float Vn = 80f;
//-------------Derived----------------
public static float G;
public static float R;
public static float M;
#endif
//Factors & Constants
public static float Q1 = 100f;
public static float Q2 = -100f;
public static int MaxIC = 65535;
public static string ColorMode = "Reverse";//Color - Scale - Reverse
public static int g0 = 0;//Min. black
public static int Efactor = 2;
......
Una dichiarazione inizialmente scritta così:
codice:
public int Efactor = 2;
non era visibile dalla struttura SphWorld!
!