ผู้เล่นหลายคน HTML5, Node.js, Socket.IO [ปิด]


13

ฉันพยายามสร้างผู้เล่นหลายคนแบบง่าย ๆ ด้วย HTML5 Canvas, JavaScript (เช่นกันโดยใช้ไลบรารี Inheritance ง่าย ๆ ของ John Resig) และ Node.js ด้วย Socket.IO รหัสลูกค้าของฉัน:

var canvas = document.getElementById ('เกม');
var context = canvas.getContext ('2d');
var socket = new io.Socket ('127.0.0.1', {พอร์ต: 8080});

ผู้เล่น var = null;

var UP = 'UP'
    LEFT = 'LEFT'
    ลง = 'ลง',
    RIGHT = 'RIGHT';

socket.connect ();

socket.on ('เชื่อมต่อ', ฟังก์ชั่น () {socket.send ();
    console.log (Connected! ');
    ผู้เล่น = ผู้เล่นใหม่ (50, 50);
});

socket.on ('ข้อความ', ฟังก์ชั่น (msg) {
    ถ้า (msg == 'UP') {
        player.moveUP ();
    } อื่นถ้า (msg == 'LEFT') {
        player.moveLEFT ();
    } อื่นถ้า (msg == 'ลง') {
        player.moveDOWN ();
    } อื่นถ้า (msg == 'RIGHT') {
        player.moveRIGHT ();
    } อื่น {

    }
});

socket.on ('ยกเลิกการเชื่อมต่อ' ฟังก์ชั่น () {
    console.log ( 'ตัดการเชื่อมต่อ!');
});

var Player = Class.extend ({
    init: ฟังก์ชั่น (x, y) {
        this.x = x;
        this.y = y;
    }
    setX: function (x) {
        this.x = x;
    }
    getX: function () {
        คืนค่า this.x;
    }
    setY: ฟังก์ชัน (y) {
        this.y = y;
    }
    getY: function () {
        กลับมานี้
    }
    draw: function () {
        context.clearRect (0, 0, 350, 150);
        context.fillRect (this.x, this.y, 15, 15);
    }
    ย้าย: function () {
        this.x + = 1;
        this.y + = 1;
    }
    moveUP: function () {
        this.y--;
    }
    moveLEFT: function () {
        this.x--;
    }
    moveDOWN: function () {
        this.y ++;
    }
    moveRIGHT: function () {
        this.x ++;
    }
});

ฟังก์ชัน checkKeyCode (เหตุการณ์) {
    var keyCode;
    if (event == null) {
        keyCode = window.event.keyCode;
    } อื่น {
        keyCode = event.keyCode;
    }

    สวิตช์ (keyCode) {
        เคส 38: // UP
            player.moveUP ();
            socket.send (UP);
        หยุดพัก;
        กรณีที่ 37: // ซ้าย
            player.moveLEFT ();
            socket.send (ซ้าย);
        หยุดพัก;
        กรณีที่ 40: // DOWN
            player.moveDOWN ();
            socket.send (ลดลง);
        หยุดพัก;
        กรณีที่ 39: // RIGHT
            player.moveRIGHT ();
            socket.send (ขวา);
        หยุดพัก;
        ค่าเริ่มต้น:
        หยุดพัก;

    }

}

การปรับปรุงฟังก์ชั่น () {
    player.draw ();
}

var FPS = 30;
setInterval (ฟังก์ชั่น () {
    อัปเดต ();
    player.draw ();
}, 1,000 / FPS);

ฟังก์ชั่น init () {
    document.onkeydown = checkKeyCode;
}

ในนั้น();

และรหัสเซิร์ฟเวอร์:

var http = ต้องการ ('http')
    io = ต้องการ ('socket.io'),
    buffer = new Array ()

server = http.createServer (ฟังก์ชั่น (req, res) {
    res.writeHead (200, {'ประเภทเนื้อหา': 'ข้อความ / html'});
    ส่งซ้ำ('

สวัสดีชาวโลก

'); }); server.listen (8080); var socket = io.listen (เซิร์ฟเวอร์); socket.on ('การเชื่อมต่อ' ฟังก์ชั่น (ลูกค้า) { client.on ('ข้อความ', ฟังก์ชั่น (ข้อความ) { console.log (ข้อความ); client.broadcast (ข้อความ); }) client.on ('ยกเลิกการเชื่อมต่อ' ฟังก์ชั่น () { }) });

และเมื่อฉันเรียกใช้ไคลเอนต์ที่สองของฉันกับไคลเอนต์แรกสามารถย้ายไคลเอนต์ที่สอง Rect และกับไคลเอนต์ที่สองย้ายแรกไคลเอนต์ rect และสิ่งเช่นไคลเอนต์ที่สามสามารถย้ายแรกและที่สองของไคลเอ็นต์ rect

ฉันมีคำถามว่าจะสร้างผู้เล่นหลายคนได้อย่างไร สิ่งที่ต้องการ: เปิดไคลเอ็นต์ของสามและไคลเอ็นต์แรกรับ rect1, rect2 ที่สองและ rect3 ล่าสุด ลูกค้ารายแรกเท่านั้นที่สามารถย้าย rect1 ลูกค้าคนที่สามสามารถย้าย rect3 เท่านั้น

อาจมีใครมีความคิด? ฉันค้นหาใน Google แต่ไม่พบคำตอบ

ขอโทษสำหรับภาษาอังกฤษของฉันขอบคุณ

คำตอบ:


15

ฉันได้สร้างเฟรมเวิร์กสำหรับการสร้างเกมแบบเรียลไทม์ผู้เล่นหลายคนโดยใช้ HTML5 โดยยึดตามรูปแบบไคลเอนต์ / เซิร์ฟเวอร์ ในรุ่นนี้ผู้เล่นจะส่งเฉพาะอินพุตไปยังเซิร์ฟเวอร์ (กดปุ่ม) - และเกมเกิดขึ้นบนเซิร์ฟเวอร์

เซิร์ฟเวอร์ส่งสแนปชอตโลกที่หมดเวลาไปยังไคลเอนต์ทั้งหมดและลูกค้าทำให้ตัวเองพูดว่า 75 ms ย้อนเวลากลับไปจากเวลาปัจจุบันโดยการค้นหาโลกทั้งสองรู้จักกันปรับปรุงการแสดงผลของพวกเขาตกอยู่ระหว่าง

ที่เก็บ (มี 3 การสาธิต)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

วิดีโอสาธิตการทำงานของ Box2D:
http://vimeo.com/24149718

สไลด์จาก JSConf 2011:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-multiplayergameswithnodejs-7868336

มันขึ้นอยู่กับเอกสารอ้างอิงของ Quakeworld และ Source ของ Valve:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


ขอแสดงความยินดีกับ Framework นี้!
MrYoshiji

ใช่นั่นคือวิธีที่ฉันวางแผนที่จะวิ่งเล่นเกมของฉันมันสมเหตุสมผลแล้วที่จะส่งอินพุต!
Nikos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.