Jag jobbar lite med ett spel i XNA, och har lite funderingar kring rättigheter mellan klasser i C#. Notera att det är ett runtimefel. Felet betyder helt enkelt att pekaren m_Background (det är en pekare, men det behöver du aldrig bry dig om) inte pekar på ett object, dvs. den är "null" (jag är inte hundra på om den faktiskt är null eller inte, men det hör inte till saken.) Problemet är att m_Background aldrig är satt till någonting, så.. har LoadContent körts? Ja, jag kan använda m_Background från GamePlay-klassen och där har jag använt LoadContent, Hm.. Gör du någonting sådant här: Nej, inte riktigt. <b>>Det är bara det att jag vill att alla objekt under GamePlayScreen ska kunna nås från dess underobjekt som den skapat.</b> Titta på hur XNA Framework implementerar och använder Services som ett sätt att dela information mellan separata delar av applikationen. I korthet går det ut på att en komponent kan registrera sig som en tjänst som implementerar ett specifikt interface och att andra komponenter sedan kan fråga efter tjänsten om implementerar just det interfacet. Ett praktexempel på det är exempelvis en 3D-kamera som exponerar i sitt interface de publika egenskaperna ViewMatrix och ProjectionMatrix som är det som primärt behövs för att kunna rendera i en 3D-miljö. Om det fungerar som det verkar, så är det något i stil med det som jag precis behöver! Tack så mycket för den hjälpen!Rättigheter och sånt? XNA
Det finns en klass som driver själva spelet framåt (GamePlayScreen) som i sin tur har diverse klasser för att rita ut bakgrund, sprites mm.
Men jag har alltid haft krångligt att få dem att använda varandras värden. Hur är bästa sättet att lösa det?
Se nedbantat exempel:
public class GamePlayScreen : GameScreen
{
public TileEngine m_Background; //bakgrunden
public Vir;
public override void LoadContent()
{
m_Background = new TileEngine(content);
s_Vir = new Vir(content);
}
}
public class Vir : GamePlayScreen
{
public void Refresh()
{
//Här kommer koden att klaga:
if (m_Background.TileWidth == 1)
{ }
}
}
Felet jag får är förstås "Object reference not set to an instance of an object.", men jag känner att jag är alldeles för dålig på det här med hur objekt i olika klasser ska få prata med varandra.
Jag vill förstås komma åt samma m_Background i båda klasserna.
Någon som vill hjälpa mig?
Sv: Rättigheter och sånt? XNA
Sv:Rättigheter och sånt? XNA
m_Background = new TileEngine(content);
, men inte från Vir. Jag skulle vilja dela med mig av samma m_Background så att bl.a. Vir eller andra klasser når den.
Men att bara använda sig av Public gör förstås ingen större nytta. Och om jag använder samma kod i LoadContent på Vir, så skapas det väl en ny TileEngine, och det är inte vad jag är ute efter.
Hoppas att jag inte är för luddig.
Frågan är egentligen ganska enkel. Hur delar jag med mig av samma objekt till olika klasser på bästa sätt?
Sv: Rättigheter och sånt? XNA
GamePlayScreen g = new GamePlayScreen();
Vir v = new Vir();
g.LoadContent();
v.Refresh(); //Här blir det error?Sv:Rättigheter och sånt? XNA
Det är bara det att jag vill att alla objekt under GamePlayScreen ska kunna nås från dess underobjekt som den skapat.
Så Vir, ska nå alla andra objekt under GamePlayScreen.Sv: Rättigheter och sånt? XNA
<b>>Så Vir, ska nå alla andra objekt under GamePlayScreen.</b>
Exakt vad menar du med "underobjekt" här?
För det du har här är ett arv, som betyder "en Vir är en GamePlayScreen". Är det sant?
Om det egentligen är så att "en GamePlayScreen består av en massa grejer, t.ex. en vir, och några foo:s, och vir måste komma åt alla foo:s", då har du gjort rätt fel.Sv:Rättigheter och sånt? XNA
Jag skrev en kort notis om hur detta kan gå till på min blogg: http://blogs.msdn.com/johanl/archive/2008/11/07/services-i-xna-framework-hur-anv-nder-jag-dem.aspxSv: Rättigheter och sånt? XNA
Ska kolla in det imorgon!