Stap 4: Procedurele niveauontwerp
Ontwerpen van niveaus voor games op voorhand oneindig te scrollen is uiteraard onmogelijk. Je moet komen met de algoritme voor het genereren van terrein.
Hier zijn eisen voor mijn algoritme die ik kwam met:
Scherm leeg (met niets anders dan de speler daarop) moet beginnen en obstakels moeten beginnen schuiven vanaf de rechterkant. Elke keer dat scherm schuift, moet een nieuwe belemmering worden toegevoegd. Hieraan kan worden toegevoegd in ofwel de bovenste of de onderste rij maar speler moet kunnen om te voorkomen botsing zodat wanneer obstakel rij van de ene rij naar de andere verschuivingen, een lege kolom moet worden weergegeven. Omdat we willen de speler direct reageren, is hij altijd slechts één cel van tijd om te gaan dus niet meer dan één lege kolom moet worden weergegeven achter elkaar gegeven.
Ik gecodeerd eerst dit algoritme in python want het is heel gemakkelijk om te zuiveren en veel gemakkelijker te begrijpen wanneer vergeleken bij de C-code. Bovendien als u hoe en waarom het werkt in python begrijpen, kun je het in C als goed.
import random last = 0 skipped = 0 sym=[" ","X"] a="" b="" for i in range(100): if skipped: a+=sym[last] b+=sym[not(last)] skipped = 0 elif random.randint(0,10)%2 != last: last = not(last) skipped = 1 a+=" " b+=" " else: a+=sym[last] b+=sym[not(last)] print(a) print(b)
Als u niet weet wat boven python script doet, probeer het en zie wat er gebeurt. Het is eenvoudig en u moet zitten kundig voor postuur op uiterlijk snel.
Ik vervolgens vertaald deze code C en sommige bit operaties gebruikt als optimalisatie. U hoeft niet te gebruiken, kunt u gemakkelijk weglaten die en stok met matrix operaties.
unsignedint last = 0; bool skipped = 0; unsignedint a = 0b0000000000000000; unsignedint b = 0b0000000000000000; a = a << 1; b = b << 1; //this moves averything one place to the leftif(skipped){ a = a | last; b = b | !last; skipped = 0; } else{ randomSeed(millis()); if (random(10)%2){ last = !last; skipped = 1; //a = a<<1;//b = b<<1 } else{ a = a | last; b = b | !last; }
Dat is het wat betreft niveau generatie. Deze functie (zonder variabelen declareren) wordt aangeroepen telkens scherm wordt geschoven. Na terrein generatie scherm opnieuw getekend.