hockey500 Skrevet 4. november 2006 Skrevet 4. november 2006 Jeg har begynt å lage et multiplayer snake-spill (ikke nettverk), noe ala dette: http://www.worldoffreegames.com/factsheet.php?id=79 Problemet mitt er dette: jeg bruker System.Drawing.PointF til å lagre posisjonen til hver snake, og alle posisjonene den har hatt. Jeg har et array på 5 slanger, og hver av dem inneholder en slik liste: List<PointF> positionLog = new List<PointF>(); Dette bruker jeg til å sjekke når en slange kjører inn i en annen. Problemet med dette er at det etter en stund tar fryktelig mye minne, og slangen går etter en stund litt hakkete. Kanskje ikke så rart, med tanke på hvor mange objekter den sjekker sin egen posisjon mot opptil flere ganger i sekundet. Hvis maks antall spillere spiller en vanlig lang runde vil programmet fort vekk bruke over 5000 objekter, og kanskje nærmere 100mb minne. Jeg har funnet ut at dette er en fryktelig tungvint måte å gjøre det på, selv om det funket greit når jeg gjorde det i et tidligere single-player snake-spill jeg lagde, for da ble det ikke på langt nær så mange objekter. Det jeg da lurer på er om noen har et godt forslag til måte å sjekke om en orm krasjer i en annen, uten å lagre hver eneste posisjon til en list, slik jeg gjør nå.
j000rn Skrevet 4. november 2006 Skrevet 4. november 2006 Ved så mange objekter vil det kanskje være bedre med en vanlig array. For å optimize enda mer kan man kanskje bruke int istedenfor Point også. int[] SnakeX = new int[MaxSize]; int[] SnakeY = new int[MaxSize]; En enklere løsning: Evt, om du ikke har et alt for stort brett: int[] Board = new int[1024 * 768]; og bruke denne til kolisjonstesting. Og ha slangene dine i en vanlig List<Point> for å fjerne "pikslene" på Board. Slangene må tegne en piksel på Board[X + Y * 1024] med sin "ID". Når slangen forsvinner tegner den Board[EndX + EndY * 1024] = 0;
hockey500 Skrevet 4. november 2006 Forfatter Skrevet 4. november 2006 ahh, såklart! Det vil vel funke å gjøre noe slikt? bool[,] brett = new bool[800,600]; og hver gang en snake flytter seg setter bare f.eks. for(int i = 0; i < snakes.Count; i++) { if( brett[snakes[i].X, snakes[i].Y] == true ) // Kode for å dø her // continue brett[snakes[i].X, snakes[i].Y] = true; // Mer kode for å tegne her } Slangen skal ikke ha en fast lengde slik at bakenden flytter seg etter slangen, men alltid ha bakenden på samme sted. Så hvis en slange kjører gjennom et punkt, vil det punktet alltid være "opptatt". Det må vel hvertfall være en ganske optimal løsning mtp. minne!
j000rn Skrevet 4. november 2006 Skrevet 4. november 2006 Jo, men tenkte at det kunne vært greit å vite "hvem" man hadde kræsjet i. For poengberegning ellerno? Tror bit blir lagret som 32 bits int i .Net, så hastighet og minne skal ikke være noe forskjell... (kan nok hende jeg tar feil her...)
hockey500 Skrevet 4. november 2006 Forfatter Skrevet 4. november 2006 Hvem du krasjær i har ikke noe å si, det er slik at hvis en krasjer får alle gjenlevende ett poeng. Største problemet jeg støtte på med min måte var å vite fargene til hvert punkt i arrayet, for å tegne riktig
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å