2011-06-05 21 views
17

私はSocket.IOとHTML5のキャンバスは、JavaScript(あまりにもジョンResig氏、単純な継承ライブラリを使用して)とのNode.jsとシンプルなマルチプレイを作成しようとしています。 私のクライアントコード:マルチプレイHTML5、Node.jsの、Socket.IO

var canvas = document.getElementById('game'); 
var context = canvas.getContext('2d'); 
var socket = new io.Socket('127.0.0.1', {port: 8080}); 

var player = null; 

var UP = 'UP', 
    LEFT = 'LEFT', 
    DOWN = 'DOWN', 
    RIGHT = 'RIGHT'; 

socket.connect(); 

socket.on('connect', function() {socket.send(); 
    console.log('Connected!'); 
    player = new Player(50, 50); 
}); 

socket.on('message', function(msg) { 
    if(msg == 'UP') { 
     player.moveUP(); 
    } else if(msg == 'LEFT') { 
     player.moveLEFT(); 
    } else if(msg == 'DOWN') { 
     player.moveDOWN(); 
    } else if(msg == 'RIGHT') { 
     player.moveRIGHT(); 
    } else { 

    } 
}); 

socket.on('disconnect', function() { 
    console.log('Disconnected!'); 
}); 

var Player = Class.extend({ 
    init : function(x, y) { 
     this.x = x; 
     this.y = y; 
    }, 
    setX : function(x){ 
     this.x = x; 
    }, 
    getX : function(){ 
     return this.x; 
    }, 
    setY : function(y){ 
     this.y = y; 
    }, 
    getY : function(){ 
     return this.y; 
    }, 
    draw : function(){ 
     context.clearRect(0, 0, 350, 150); 
     context.fillRect(this.x, this.y, 15, 15); 
    }, 
    move : function() { 
     this.x += 1; 
     this.y += 1; 
    }, 
    moveUP : function() { 
     this.y--; 
    }, 
    moveLEFT : function() { 
     this.x--; 
    }, 
    moveDOWN : function() { 
     this.y++; 
    }, 
    moveRIGHT : function() { 
     this.x++; 
    } 
}); 

function checkKeyCode(event) { 
    var keyCode; 
    if(event == null) { 
     keyCode = window.event.keyCode; 
    } else { 
     keyCode = event.keyCode; 
    } 

    switch(keyCode) { 
     case 38: // UP 
      player.moveUP(); 
      socket.send(UP); 
     break; 
     case 37: // LEFT 
      player.moveLEFT(); 
      socket.send(LEFT); 
     break; 
     case 40: //DOWN 
      player.moveDOWN(); 
      socket.send(DOWN); 
     break; 
     case 39: // RIGHT 
      player.moveRIGHT(); 
      socket.send(RIGHT); 
     break; 
     default: 
     break; 

    } 

} 

function update() { 
    player.draw(); 
} 

var FPS = 30; 
setInterval(function() { 
    update(); 
    player.draw(); 
}, 1000/FPS); 

function init() { 
    document.onkeydown = checkKeyCode; 
} 

init(); 

とサーバコード:

var http = require('http'), 
io = require('socket.io'), 
buffer = new Array(), 

server = http.createServer(function(req, res){ 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end('<h1>Hello world</h1>'); 
}); 
server.listen(8080); 

var socket = io.listen(server); 

socket.on('connection', function(client){ 

    client.on('message', function(message){ 
     console.log(message); 
     client.broadcast(message); 
    }) 
    client.on('disconnect', function(){ 

    }) 

}); 

そして、私は2番目のクライアントのRectを移動することができます最初のクライアントを持つ2つのクライアントのIを実行したときに2番目のクライアントに持つように最初のクライアントRECTと何かを動かします第3のクライアントは、第1および第2のクライアント・レットを移動することができる。

実際のマルチプレーヤーの作成方法について質問がありますか?次のようなものがあります。 3つのクライアントと1つ目のクライアントは、rect1、2番目のrect2、3番目のrect3を開きます。最初のクライアントはrect1だけを動かすことができ、クライアントの3番目はrect3だけ動かすことができます。

多分誰もが知っていますか?私はGoogleで検索しますが、答えは見つかりません。

私の英語のために申し訳ありません。

答えて

14

まず、http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html

をチェックアウトすることは、とりわけrequestAnimationFrameの使用方法について説明します。

第2に、ゲームの状態がサーバー上に存在し、クライアント上にミラー化される必要があります。

プレーヤーがクリックすると、クライアントはメッセージを送信するだけです。次に、サーバーは、アクションを実行したクライアントを含むすべてのクライアントにメッセージを送信します。

各プレーヤーはサーバー上にオブジェクトとして存在する必要があります。プレーヤーがログインするときには、すでにサーバー上にある各プレーヤーのステータスについて最新の情報に更新する必要があります。

修正クライアントコード:http://codr.cc/s/d0154536/js

修正サーバコード:http://codr.cc/s/f96ce1d2/js

+1

HTML5ゲーム開発へのスーパーブラウザ2 turbo HDリミックスの紹介は素晴らしいです! ありがとうございます! generalhenry、私はあなたのmodifiedクライアント/サーバーコードを試してみますが、私のためには動作しません。 マルチプレイヤーを理解してくれてありがとう! – rhavd

+1

私は変更されたコードをテストしなかったので、いくつかのバグがあるかもしれませんが、あなたは考えを得ます^ _^ – generalhenry

+1

すべてのリンクは現在この回答から死んでいます。 –

11

グレン・フィードラーのWhat every programmer needs to know about game networking -articleはゲームネットワーキング入るたい人のための良い読み物です。それは、JSとSocket.ioに適応できるように、非常に高いレベルの基礎を説明します。私はちょうど今、私はthis link as an exampleを追加したいと思っていたよう

+0

素晴らしいリソース。ありがとう:) –

0

場合は誰もがこの質問を越えつまずきます。

私は数か月前にopと同じ方法で、正式なサーバーモデル(@Epeliの回答で参照されているものを含む)で見つけられるすべての記事を読んで、nodejs/socketio 。

私の研究の結果は、(ライブデモもある)上記のリンクにあるgithubのプロジェクトで自分自身を明らかに。これが誰かを助けることを望みます。

0

あなたが言うように、提供するサーバ(およびクライアントライブラリは)Lance.ggと呼ばれるJavaScriptのオープンソースのマルチリアルタイムは、今あり、 本物のマルチプレイヤー体験

これは、クライアント側の予測を扱う、ステップドリフト、曲げ、および基本的な物理学。

免責事項:私は貢献者の1人です

関連する問題