Wedvich Skrevet 12. mars 2009 Del Skrevet 12. mars 2009 Heisann, jeg fant ut at jeg ville prøve meg på spillprogrammering. Sjekket litt rundt og fant ut at XNA var et fint alternativ til å begynne å knote med C++ og DirectX SDK'en, så nå sitter jeg og diller med C#. Jeg fant fort ut at jeg trenger en slags "state manager" ("states" som i f.eks. hovedmeny, loading-skjerm, selve spillet osv.) for å få god flyt i spillet (og koden ikke minst), og dette er det jeg har i Game classen min som har med det å gjøre foreløpig: private delegate bool State(GameTime gameTime); private Stack<State> states; private State DrawState; protected override void Update(GameTime gameTime) { if (states.Count > 0) { if (states.Peek()(gameTime)) states.Pop(); } else this.Exit(); } protected override void Draw(GameTime gameTime) { if (states.Count > 0) DrawState(gameTime); } Så har hver state en egen funksjon på følgende form: protected bool EnEllerAnnenUpdateFunksjon(GameTime gameTime) { // input og lyd og utregninger og sånn her // return true; - når staten er ferdig DrawState = SettInnDrawFunksjonHer; // skjønner? return false; } Og for å sette i gang den staten bruker jeg bare states.Push(EnEllerAnnenUpdateFunksjon); I hvertfall, dette funker jo for meg, men det skal nevnes at jeg er skikkelig nybegynner i C#, eller C-språk generelt, egentlig, så jeg har fint lite peiling på hva som er "rett" og hva som er "feil" å gjøre. Pluss at det er en eller annen stemme bak i hodet mitt som sier at det finnes garantert en mye enklere, gjerne helt åpenbar metode å gjøre dette på, som også er mer effektiv. Eller? Er det "greit" å gjøre det på den måten jeg har gjort det, eller burde jeg forsøke å gjøre det på en annen måte? Som sagt er jeg helt fersk i C#; jeg vet egentlig ikke hvordan delegates eller generics og alt det der fungerer engang, men jeg fant ut at det funket i dette tilfellet. Men er det noen som har noen forslag til hvordan dette kan gjøres bedre/annerledes? Sier ja takk til alt av relevante tips og forslag og lesestoff Lenke til kommentar
GeirGrusom Skrevet 12. mars 2009 Del Skrevet 12. mars 2009 Nå tror jeg at jeg har en litt annen design idé enn deg, men jeg bruker ihvertfall virtual functions for dette istedet for delegates, men det er jo opp til deg class Node { List<Node> Children{ get; }; Node Parent { get; } public virtual void Render(GraphicsDevice dev); public virtual void Process(float frametime) { foreach(Node nd in Children) nd.Process(frametime); } // etc. } class Game { List<Node> GameScene { get; } public void Process(float frametime) { foreach(Node nd in GameScene) nd.Process(frametime); } // etc. } Jeg har en egen funksjon som heter Process som kjører fysikk simulasjon og spill-dynamikk, og en for å rendre. planen er å legge disse i hver sin tråd, men foreløpig kjører de bare etter hverandre. Om dette er beste metoden vites ikke, men det er ihvertfall sånn jeg gjør det Lenke til kommentar
Wedvich Skrevet 12. mars 2009 Forfatter Del Skrevet 12. mars 2009 Hehe, jeg hadde faktisk omtrent samme fremgangsmåte som deg i begynnelsen, med en abstract class som utgangspunkt, og en implementering av den for hver state. Men jeg møtte fort veggen med den siden jeg måtte ha tilgang til diverse ting i Game classen som jeg hadde satt som private. Når vi er inne på det, er det egentlig en "ulempe" i et sånt spill om alle variablene er public? Har bare fått det for meg at det er "bad practice" å ha public variabler i classes. For i så fall har jeg egentlig mer lyst å bruke den fremgangsmåten, siden Game classen min kommer til å bli sinnsykt diger etter hvert som det begynner å bli mange states (nå har jeg den riktignok som partial class så jeg kan ha hver state i en egen fil, men likevel). Er det også en dårlig ting, egentlig? Vet ikke så mye om hva som er "good/bad practice," så like greit å komme seg inn i gode rutiner nå når jeg er i læringsfasen. Men i hvertfall, det du har gjort ligner litt mer på det jeg har tenkt å gjøre inni selve Update/Draw funksjonene da (kjøre gjennom lyd, fysikk, input og alt det der) - sånne ting som gjøres for hver frame. Jeg ser mer for meg et LIFO system for selve statene sånn at du bare kan schmokke på ting etter hvert som de kommer, så de alltid havner øverst og dermed forsvinner først, og... bleh, jeg er dårlig å forklare Skulle lært meg UML eller noe, det hadde vært saker! Men je, takk for svar uansett, alltid fint med litt alternativer så det går an å trikse og mikse litt Lenke til kommentar
GeirGrusom Skrevet 13. mars 2009 Del Skrevet 13. mars 2009 Bruk protected dersom dersom du skal endre variabler innen klassene. Ellers så bruker en ikke public felt fordi klassen skal alltid ha kontroll over hva som skjer med de interne variablene. Lenke til kommentar
MrLeftfield Skrevet 26. april 2009 Del Skrevet 26. april 2009 sånn som jeg har gjort det er: Draw() { if(state == 1) { //draw main menu } if(state == 2) { //draw options } if(state == 3) { //draw gameLoop } } Update() { if(KeyBoard.getKeyboardstate() ett eller annet Key) { state++; } if(KeyBoard.getKeyboardstate() ett eller annet Key) { state--; } } Dette er da pseudokode'ish. Du må også sjekke for at state ikke er mindre enn 0 eller mer enn <antall states>. Du kan også lage "int states[] = {0,1,2,3,4,5,6,7,8,9};" og bruke dette. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå