07. marts 2007 - 17:01Der er
13 kommentarer og 1 løsning
LAN i 3D spil?
Hejsa
Jeg har lavet et 3D spil der kører i XNA framework. Spillet fungere fint og kører godt, men jeg vil gerne lave så man kan spille over lan i det. Jeg har tænkt lidt over det og kan ikke lige komme på hvordan man gør det bedst. Jeg har lavet et server-client system via TCP, som fungere fint til chat, men problemet kommer når jeg vil sende større ting som f.eks. en opdatering fra serveren når der spilles.
Den måde jeg bruger nu er hvor, når der trykkes start på serveren, så sender serveren den bane der er lavet til clienten, som så gør den klar. Bagefter og hver gang mit gameloop kører så sender jeg alle objecters posision til alle clienter og de skal så tegne dem. Det går alt for langsomt, men jeg kan ikke lige komme på hvordan det ellers skal gøres.
Når et object sendes, så er det kun typen og posisionen der sendes.
eksempel: line += "o"; foreach (Player a in game.players) line += "x" + a.Felt.X + "y" + a.Felt.Y + "z" + a.Felt.Z + "r" + a.Vinkel + "|";
Det modtager clienten så og laver om til et nyt player object og tegner det.
Det jeg mangler er altså en idé til hvordan det skal gøres. Hvis i ikke forstår hvad jeg mener, så sig til så poster jeg mere kode.
Banen som jeg sender er meget lille så det gør ingen forskel hvis jeg kun sendte navnet.. Den skal jo også kun sendes én gang. Der er også nogle ting i banen som laves random, så serveren skal lave den så det bliver den samme bane alle clienter får. Jeg sender bare min opdatering som string: WriteLine. Gør det virklig en stor forskelv hvis jeg sendte det som byte istedet? Jeg kan ikke gøre så jeg sender et "player move" da spillere ikke er de eneste objecter der kan flytte sig, der er f.eks. gravity på næsten alle objecter.
dette siger pakkens totalle størelse er 14 bytes, 01 = flyt object
objectets id er 00000000, flyt til x 1010, y2020, z3030, angle 40
bare et eksempel.
jeg bruger disse pakker til ALT der kan flytte sig.
hver "ting" med AI, f.eks spillere, objecter osv har hver deres "knownObjects".
så, f.eks en spiller flytter sig..
foreach(Spiller a in this.KnownSpillere) { a.send(new packet(alt data)); }
og så er der noget distance calculation til at fjerne og indsætte nye spiller (spillere behøver ikke objecter, for alle objecter har deres egen array af kendte spillere).
men det er lidt svært når jeg ikke ved hvor komplex du vil have det, og hvor komplex det er nødvendigt at være.
Jeg synes det lyder som en god løsning. Jeg prøvede pakker først, men kunne ikke få det til at virke. Jeg prøver lige igen i aften og ser om jeg kan få det til at virke nu..
Hvordan skal jeg så gøre hvis jeg vil sende byte? Kan det ikke komme til at blive tolket som noget andet hvis nu en byte står for et bogstav? Jeg vil self. læse bytes direkte fra min NetworkStream og ikke igennem en StreamReader, men det er jo samme Stream? Jeg jo f.eks. også en ping der kører i sit eget loop og den kan vel godt smutte ind imellem to pakker og så ødelægge noget? Håber du haren idé der gør at jeg ikke skal skrive det hele om ;)
Det skal lige siges at det både er mit første 3D spil og mit første forsøg på at lave noget der kører via TCP, så undskyld hvis jeg ikke fatter det helt :P
det du vil bruge er nok en binaryreader, jeg smider lige lidt eksempler op på hvordan du kan gøre det lidt senere (med noget mere kode), arbejdet kalder :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.