Situatie
Als ontwikkelaar wil je soms wel eens wat nieuws proberen. In mijn situatie ontwikkel ik eigenlijk alleen websites/-applicaties middels HTML/CSS/JS en PHP, altijd stateless dus, op wat werk in Vue (JS) na.
Een tijdje geleden heb ik al eens wat met Unity geprobeerd te maken en later eens een NodeJS server met JS WebGL client. De Unity poging eindigde vooral in frustratie nadat het niet lukte een fatsoenlijke isometrische view te bouwen waarbinnen je (net als in bijv. Age of Empires) over een map kan scrollen. Bij de NodeJS server vond ik het erg lastig te bepalen wat die game-loop nu precies moet doen en de communicatie van server naar JS WebGL client was ook wel even lastig.
Conclusie
Mijn conclusie was dat ik te weinig van de basisconcepten weet, waardoor het aan elkaar knopen van de verschillende onderdelen erg lastig wordt. Ik werk overigens graag gewoon wat uit; een simpel basis principe van wat ik wil doen leert voor mij makkelijker dan het één helemaal uitkauwen en dan verder naar het volgende onderdeel. Nu zou ik graag wat meer weten van enkele principes en welke oplossingen er allemaal zijn.
De vragen
1. Een server in NodeJS bouwen leek me een prima begin, omdat ik wat kan met JS en er genoeg libraries te vinden zijn die aansluiting met bijv. WebSockets op een client heel makkelijk maken. Maar... is een NodeJS server snel genoeg of moet ik überhaupt denken aan het ontwikkelen van een server in een andere taal (Rust bijv.)?
2. De game-loop! Wat doe je allemaal in de game-loop? In mijn probeersel had ik een 'resource', deze 'resouce' wordt gefarmed en daar hangt een getalletje aan, bijv. +3 per minuut. Moet ik dan in de gameloop bepalen (aan de hand van de delta) hoeveel dat per tick is en dat optellen? Zie onderstaande code als simpel voorbeeld.
3. Server -> Client communicatie; stuur ik bij elke server tick een update naar de client?
4. Server -> Client communicatie; Het betreft een multiplayer game, spelers zullen elkaar op bepaalde plekken kunnen zien lopen (oid.). Splits je die 'movement' gegevens op naar een 'publiek' kanaal en bijv. 'resources' naar een 'privé' kanaal?
5. Server persistence; Dingen die je per tick doet, sla je die meteen op in een database? In mijn 'resource' voorbeeld zou dat te gek worden denk ik, zelfs als je een in-memory database gebruikt (Redis oid.).
6. Client -> server events; stel een client verplaatst zijn poppetje naar een andere positie, dan zal ik een event naar de server sturen dat poppetje van A naar B verplaatst moet worden. Maar gaat die server vervolgens in de game-loop een 'movement' update sturen naar alle clients, of stuurt de client die naar alle andere clients?
Tot slot
Wellicht hebben jullie wat aanwijzingen en/of steekwoorden waarop ik verder kan Googlen en dergelijke. Ik heb al wel wat rondgekeken, maar vind nergens een samenhangend verhaal. Daarnaast ben ik ook erg geïnteresseerd met welke verschillende oplossingen jullie komen. Er is nooit één manier om iets te doen, maar bepaalde patronen zullen in ieder geval terugkomen.
Als ontwikkelaar wil je soms wel eens wat nieuws proberen. In mijn situatie ontwikkel ik eigenlijk alleen websites/-applicaties middels HTML/CSS/JS en PHP, altijd stateless dus, op wat werk in Vue (JS) na.
Een tijdje geleden heb ik al eens wat met Unity geprobeerd te maken en later eens een NodeJS server met JS WebGL client. De Unity poging eindigde vooral in frustratie nadat het niet lukte een fatsoenlijke isometrische view te bouwen waarbinnen je (net als in bijv. Age of Empires) over een map kan scrollen. Bij de NodeJS server vond ik het erg lastig te bepalen wat die game-loop nu precies moet doen en de communicatie van server naar JS WebGL client was ook wel even lastig.
Conclusie
Mijn conclusie was dat ik te weinig van de basisconcepten weet, waardoor het aan elkaar knopen van de verschillende onderdelen erg lastig wordt. Ik werk overigens graag gewoon wat uit; een simpel basis principe van wat ik wil doen leert voor mij makkelijker dan het één helemaal uitkauwen en dan verder naar het volgende onderdeel. Nu zou ik graag wat meer weten van enkele principes en welke oplossingen er allemaal zijn.
De vragen
1. Een server in NodeJS bouwen leek me een prima begin, omdat ik wat kan met JS en er genoeg libraries te vinden zijn die aansluiting met bijv. WebSockets op een client heel makkelijk maken. Maar... is een NodeJS server snel genoeg of moet ik überhaupt denken aan het ontwikkelen van een server in een andere taal (Rust bijv.)?
2. De game-loop! Wat doe je allemaal in de game-loop? In mijn probeersel had ik een 'resource', deze 'resouce' wordt gefarmed en daar hangt een getalletje aan, bijv. +3 per minuut. Moet ik dan in de gameloop bepalen (aan de hand van de delta) hoeveel dat per tick is en dat optellen? Zie onderstaande code als simpel voorbeeld.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| const id = gameLoop.setGameLoop(function(delta) { // `delta` is the delta time from the last frame primus.forEach(function (spark, id, connections) { user.resources.water.amount = floor(user.resources.water.amount + (user.resources.water.accumulating * delta), 4); let data = { resources: user.resources, }; spark.write(data); }); }, fps); |
3. Server -> Client communicatie; stuur ik bij elke server tick een update naar de client?
4. Server -> Client communicatie; Het betreft een multiplayer game, spelers zullen elkaar op bepaalde plekken kunnen zien lopen (oid.). Splits je die 'movement' gegevens op naar een 'publiek' kanaal en bijv. 'resources' naar een 'privé' kanaal?
5. Server persistence; Dingen die je per tick doet, sla je die meteen op in een database? In mijn 'resource' voorbeeld zou dat te gek worden denk ik, zelfs als je een in-memory database gebruikt (Redis oid.).
6. Client -> server events; stel een client verplaatst zijn poppetje naar een andere positie, dan zal ik een event naar de server sturen dat poppetje van A naar B verplaatst moet worden. Maar gaat die server vervolgens in de game-loop een 'movement' update sturen naar alle clients, of stuurt de client die naar alle andere clients?
Tot slot
Wellicht hebben jullie wat aanwijzingen en/of steekwoorden waarop ik verder kan Googlen en dergelijke. Ik heb al wel wat rondgekeken, maar vind nergens een samenhangend verhaal. Daarnaast ben ik ook erg geïnteresseerd met welke verschillende oplossingen jullie komen. Er is nooit één manier om iets te doen, maar bepaalde patronen zullen in ieder geval terugkomen.