Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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 :p 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 :D

Lenke til kommentar
  • 1 måned senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...