NodeJS と websockets を使用して、オンライン ゲーム サーバーを実装しようとしています。乗数ゲーム用に、人々がお互いを見ることができるように動き回っていますが、サーバーが新しい敵を生成したときに、接続されているすべてのクライアントにメッセージを送信します。
ただし、クライアントが最初にサーバーにメッセージを送信することはありません。
例 - ゲームは敵を生成し、すべてのクライアントに情報を送信します。
これまでの私のコード:
/**************************************************
** NODE.JS REQUIREMENTS
**************************************************/
var util = require("util"),
// Utility resources (logging, object inspection, etc)
io = require("socket.io"),
// Socket.IO
Player = require("./Player").Player, // Player class
Zombie = require("./Zombie").Zombie;
// Socket controller
var socket,
// Array of connected players
players,
zombies;
var level = 1,
score = 0,
levelling = false;
function init() {
// Create an empty array to store players
players = [];
zombies = [];
// Set up Socket.IO to listen on port 8000
socket = io.listen(8000);
// Configure Socket.IO
socket.configure(function() {
// Only use WebSockets
socket.set("transports", ["websocket"]);
// Restrict log output
socket.set("log level", 2);
});
// Start listening for events
setEventHandlers();
};
何とか何とか何とか -- tl;dr -- ゲーム ループ:
function mainLoop(){
//Main loop for the server. Called 60 times a second. May be modified for game
speed.
//setTimeout(mainLoop, 1000/5000);
this.broadcast.emit("update");
//THIS broadcast.emit line is where the error is being thrown. I need to know how
to broadcast here without the client initializing first.
};
socket.broadcast.emit("update"); といういくつかのことを試しましたが、成功しませんでした。
現在既知のユーザーをループして「this.emit」を使用しようとしましたが、常に「未定義のメソッドを呼び出すことができません」というメッセージが表示されるので、非常に面倒です。
しかし、クライアントに最初にメッセージを送信させると、たとえば、クライアントが移動したときにサーバーに情報が送信され、サーバーは次のように反応します。
function onSocketConnection(client) {
util.log("New player has connected: " + client.id);
// Listen for client disconnected
client.on("disconnect", onClientDisconnect);
// Listen for new player message
client.on("new player", onNewPlayer);
// Listen for move player message
client.on("move player", onMovePlayer);
//listen for deaths
client.on("death", onPlayerDeath);
//listen for not moved message, to stop sprite animation
client.on("not moved", notMoved);
};
// Player has moved
function onMovePlayer(data) {
// Find player in array
var movePlayer = playerById(this.id);
// Player not found
if (!movePlayer) {
util.log("Player not found: "+this.id + " when asking if moved");
return;
};
// Update player position
movePlayer.setX(data.x);
movePlayer.setY(data.y);
movePlayer.setDir(data.dir);
// Broadcast updated position to connected socket clients
this.broadcast.emit("move player", {id: movePlayer.id, x:
movePlayer.getX(), y:movePlayer.getY(), dir: movePlayer.getDir()});
};
そして、「this.broadcast.emit」には問題はありません。エラーをスローせずに。