簡體   English   中英

在 Node.js + websocket 服務器上循環游戲對象?

[英]Looping through game objects on a Node.js + websocket server?

根據我的研究,websockets 是一種在客戶端和服務器之間快速發送數據的可靠方式,因為沒有 HTTP 開銷。

socket.io 示例顯示僅在套接字消息傳遞期間發生的邏輯:

https://github.com/socketio/socket.io/blob/master/examples/chat/index.js

在實時游戲中,邏輯需要發生在套接字連接之外,例如。 移動怪物,射彈,耗盡計時器等。

我想任何適用於 1 個游戲實例的好的解決方案都適用於多個游戲實例。

也許 Node.js async.each()async.parallel()會起作用?

我想保持一致的內部時鍾或“幀”速率來更新游戲邏輯。

在客戶端,我可以使用

loop() {
    this.now = Date.now();
    var delta  = this.now - this.last;
    this.last = this.now;

    this.dt = this.dt + delta;

    if (this.dt < this.rate) {
        window.requestAnimationFrame(this.loop.bind(this));
        return;
    } else {
        this.game.loop();
        this.draw();
        this.dt = this.dt - this.rate;
    }

    this.game.loopKeyboardInput(this.key_pressed_map);

    window.requestAnimationFrame(this.loop.bind(this));
}

用於跟蹤增量時間。

如何在服務器上做類似的事情?

像這樣簡單的事情異步運行游戲循環方法,允許服務器盡快更新游戲狀態(目前我們使用 setImmediate 立即將循環排隊,如果你願意,你可以放松一下),更新中心狀態,將在套接字更新時發送,我們的服務器繼續前進並在套接字 i/o 請求之外更新“游戲狀態”(在這種情況下只是一個循環代碼)。

var express = require('express');
var path = require('path');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);

app.use(express.static(path.join(__dirname, 'public')));
server.listen(3000, function() {
  console.log('listening');
});

io.on('connection', function(socket) {
  console.log('connected');
  socket.on('update', function(data) {
    console.log(data);
    socket.emit('update', state);
  });
});

var loopAsync = function() {
  setImmediate(loop);
}

function loop() {
  gameLoops++;
  var delta = Date.now() - last;
  last = Date.now();
  var currentState = {
    time: Date.now(),
    loopDelta: delta,
    loops: gameLoops
  };

  state = currentState;
  loopAsync();
}

var last = Date.now();
var gameLoops = 0;
var state = { time: Date.now(), loopDelta: 0, loops: gameLoops };
loopAsync();

完整的工作示例可以在這里找到: https : //github.com/StrangeWill/qpexamplecode

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM