Rendere la logica del server indipendente dall'interazione del client

1

Sto cercando di creare un gioco in multiplayer in tempo reale su node.js con framework espresso e libreria socket.io. Ma non riesco a rendere la mia logica lato server indipendente dalle interazioni con il client. Voglio che il client interagisca solo quando io (logica lato server) voglio ma non riesco a essere in grado di farlo. Ad esempio:

Voglio 2 utenti a inizia a giocare. Devo innanzitutto inizializzare il gioco, come impostare l'ambiente, le variabili e tutto il resto .. tutto in un separato, chiamiamolo: The Game Logic. Solo allora posso "consentire" ai client di interagire.

Ma come dovrei continuare con la mia logica di gioco quando il mio evento socket.on sta "chiamando i colpi"? Con socket.io devi definire trigger come

io.sockets.on('connection', function(socket) {
    socket.on('event', function(data) {
        //supposed this is fired when client hits an "interact with X" button
    }); 
}

Tutta la mia logica sembra dipendere da questi trigger. Volevo solo che il client fosse in grado di attivare quell'evento quando voglio (dopo aver impostato il gioco env etc), ma definendolo in questo modo, separato dalla mia logica di gioco, crea problemi come come faccio a trasferire il controllo di esecuzione da socket alla mia logica di gioco ? E anche se ci riuscissi, c'è tutto il problema del "chiamare i colpi" del cliente. Non ho quindi alcun controllo quando il cliente potrebbe voler interagire.

Qualche consiglio che dovrei fare?

    
posta laggingreflex 17.03.2014 - 12:28
fonte

2 risposte

1

Il tuo oggetto di gioco sarebbe in genere una funzione di prototipo separata (classe). Potrebbe assomigliare a questo:

Game = function() {
  var sockets = [];
  var pendingEvents = [];
  var interval = 500; // Process every 0.5s

  var init = function() {
    // Do game initialization stuff here

    // Start the game timer
    setInterval(function() {
      gameLoop();
    });
  };

  // Do the actual game loop
  gameLoop = function() {
     // Do some work

     // Handle user events, starting with the oldest
     var message = pendingEvents.shift();
     while ( null != message ) {
         handleMessage(message.socket, message.data);
         var message = pendingEvents.shift();
     }

     // Do other stuff
  };

  // Process a player's message event
  handleMessage = function(socket, data) {
  };

  addSocket = function(socket) {
      sockets.push(socket);
  };

  queueEvent = function(event) {
      pendingEvents.queue(event);
  };

  return {
    queueEvent: queueEvent,
    addSocket: addSocket
  };
}

Questa classe di gioco ti offre uno scheletro che contiene tutti i socket connessi (loop through per inviare un messaggio a tutti) e fa qualche logica di gioco ogni 500ms. Durante il ciclo di gioco, guarda nella coda dei messaggi per gli eventi giocatore che deve gestire.

Ora tornando al tuo codice sorgente originale, puoi inserire eventi giocatore nel gioco in questo modo:

// This happens anywhere
var gameInstance = new Game();

// Now watch for sockets
io.sockets.on('connection', function(socket) {
  // Add the socket to the game
  gameInstance.addSocket(socket);

  socket.on('event', function(data) {
    // Push the client event to the game, game will handle it on its own terms
    gameInstance.queueEvent({
      socket: socket,
      data: data
    });
  }); 
}
    
risposta data 20.06.2014 - 02:04
fonte
0

Devi rendere disponibile il client per ricevere una chiamata.

"Spingi" sample / source o configurazione un "client-server" sample / source

Un'altra opzione potrebbe essere quella di far chiamare il client al server a un'ora pianificata (come ogni 15 minuti) e se c'è qualcosa che vuoi "dire / fai" succede allora.

    
risposta data 17.03.2014 - 13:19
fonte