forloRn_
Legacy Member
Ik en een klasgenoot van me zijn bezig aan een projectje: een online versie van het gekende spelprogramma Blokken.
De netwerkverbinding is al tot stand gebracht via RMI (Remote Method Invocation) en de Tetris-module (mijn gedeelte) is ook bijna afgewerkt.
De Tetris bestaat natuurlijk uit een tweedimensionale array (20 rijen op 10 kolommen) van integers, waarbij een 0 staat voor een leeg vakje, en een 1 en een 2 staan voor een vakje dat bezet is door een tegeltje van respectievelijk speler 1 en speler 2. Als er twee blokjes gevallen zijn kan de array er dus zo uitzien:
Een vallend blokje kan gemanipuleerd worden met behulp van bepaalde methodes: requestMoveLeft(), requestMoveRight(), requestMoveDown() en requestTurn(). Hiermee wordt de array dus effectief aangepast. Ik heb de methodes request... genoemd omdat niet elke beweging op elk moment mogelijk is. Als er bijvoorbeeld rechts geen plaats is, kan het blokje niet naar rechts bewegen. De methodes canMoveLeft(), canMoveRight(), ... leveren true op als de overeenkomstige beweging mogelijk is.
Tot zover geen enkel probleem, en de single player-versie werkt dan ook perfect. De problemen treden pas op wanneer twee spelers tegen elkaar spelen over het internet.
Beide spelers hebben elk lokaal een JPanel ter beschikking dat hun keypresses registreert met behulp van een KeyListener. Die KeyListener roept dan de bovenstaande requests op.
Met het oog op snelheid denk ik dat het beter is dat er geen gemeenschappelijke Tetris-array gebruikt wordt, maar wel voor elke speler één (identieke) lokale. Een keypress van een speler moet namelijk onmiddellijk gevolgd worden door een aktie op de array, en geen omweg maken via het internet, wat zorgt voor vertraging.
Probleem: speler 2 moet op zijn scherm evenwel in real time (of toch bijna) kunnen volgen wat speler 1 doet, zonder dat speler 1 er zelf last van heeft!
Nu had ik gedacht aan het volgende: lokaal een soort van event-queue maken, die alle bewegingen van speler 1 opneemt, en een nieuwe thread creëren die de bewegingen in de queue asynchroon doorgeeft aan speler 2, en dus zijn array aanpast.
Is dit een goede manier of maak ik het veel te moeilijk? Ik ben niet op zoek naar code (die kan ik zelf wel produceren), maar wel naar een werkwijze.
Dankuwel.
De netwerkverbinding is al tot stand gebracht via RMI (Remote Method Invocation) en de Tetris-module (mijn gedeelte) is ook bijna afgewerkt.
De Tetris bestaat natuurlijk uit een tweedimensionale array (20 rijen op 10 kolommen) van integers, waarbij een 0 staat voor een leeg vakje, en een 1 en een 2 staan voor een vakje dat bezet is door een tegeltje van respectievelijk speler 1 en speler 2. Als er twee blokjes gevallen zijn kan de array er dus zo uitzien:
Code:
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0100002200
0111002200
Een vallend blokje kan gemanipuleerd worden met behulp van bepaalde methodes: requestMoveLeft(), requestMoveRight(), requestMoveDown() en requestTurn(). Hiermee wordt de array dus effectief aangepast. Ik heb de methodes request... genoemd omdat niet elke beweging op elk moment mogelijk is. Als er bijvoorbeeld rechts geen plaats is, kan het blokje niet naar rechts bewegen. De methodes canMoveLeft(), canMoveRight(), ... leveren true op als de overeenkomstige beweging mogelijk is.
Tot zover geen enkel probleem, en de single player-versie werkt dan ook perfect. De problemen treden pas op wanneer twee spelers tegen elkaar spelen over het internet.
Beide spelers hebben elk lokaal een JPanel ter beschikking dat hun keypresses registreert met behulp van een KeyListener. Die KeyListener roept dan de bovenstaande requests op.
Met het oog op snelheid denk ik dat het beter is dat er geen gemeenschappelijke Tetris-array gebruikt wordt, maar wel voor elke speler één (identieke) lokale. Een keypress van een speler moet namelijk onmiddellijk gevolgd worden door een aktie op de array, en geen omweg maken via het internet, wat zorgt voor vertraging.
Probleem: speler 2 moet op zijn scherm evenwel in real time (of toch bijna) kunnen volgen wat speler 1 doet, zonder dat speler 1 er zelf last van heeft!
Nu had ik gedacht aan het volgende: lokaal een soort van event-queue maken, die alle bewegingen van speler 1 opneemt, en een nieuwe thread creëren die de bewegingen in de queue asynchroon doorgeeft aan speler 2, en dus zijn array aanpast.
Is dit een goede manier of maak ik het veel te moeilijk? Ik ben niet op zoek naar code (die kan ik zelf wel produceren), maar wel naar een werkwijze.
Dankuwel.