Çok oyunculu HTML5, Node.js, Socket.IO [kapalı]


13

Socket.IO ile HTML5 Canvas, JavaScript (John Resig basit Kalıtım kütüphanesini kullanarak) ve Node.js ile basit Çok oyunculu oluşturmaya çalışıyorum. Müşteri kodum:

var canvas = document.getElementById ('oyun');
var context = canvas.getContext ('2d');
var socket = yeni io.Socket ('127.0.0.1', {bağlantı noktası: 8080});

var oyuncu = null;

var UP = 'UP',
    SOL = 'SOL',
    AŞAĞI = 'AŞAĞI',
    SAĞ = 'SAĞ';

Socket.connect ();

socket.on ('bağlan', function () {socket.send ();
    console.log ( 'bağlandı!');
    oyuncu = yeni Oyuncu (50, 50);
});

socket.on ('mesaj', işlev (msg) {
    if (msg == 'UP') {
        player.moveUP ();
    } else if (msg == 'SOL') {
        player.moveLEFT ();
    } else if (msg == 'AŞAĞI') {
        player.moveDOWN ();
    } else if (msg == 'SAĞ') {
        player.moveRIGHT ();
    } Başka {

    }
});

socket.on ('bağlantıyı kes', işlev () {
    console.log ( 'Bağlantı kesildi!');
});

var Player = Class.extend ({
    init: işlev (x, y) {
        this.x = x;
        this.y = y;
    },
    setX: fonksiyon (x) {
        this.x = x;
    },
    getX: function () {
        bunu döndür. x;
    },
    setY: fonksiyon (y) {
        this.y = y;
    },
    getY: function () {
        bunu döndür. y;
    },
    draw: function () {
        context.clearRect (0, 0, 350, 150);
        context.fillRect (this.x, this.y, 15, 15);
    },
    move: function () {
        this.x + = 1;
        bu. y + = 1;
    },
    moveUP: function () {
        this.y--;
    },
    moveLEFT: function () {
        Bu x--;
    },
    moveDOWN: function () {
        ++ this.y;
    },
    moveRIGHT: function () {
        this.x ++;
    }
});

function checkKeyCode (event) {
    var keyCode;
    if (event == null) {
        keyCode = window.event.keyCode;
    } Başka {
        keyCode = event.keyCode;
    }

    switch (keyCode) {
        vaka 38: // YUKARI
            player.moveUP ();
            socket.send (UP);
        break;
        vaka 37: // SOL
            player.moveLEFT ();
            socket.send (SOL);
        break;
        durum 40: // AŞAĞI
            player.moveDOWN ();
            socket.send (aşağı);
        break;
        durum 39: // SAĞ
            player.moveRIGHT ();
            socket.send (SAĞ);
        break;
        varsayılan:
        break;

    }

}

işlev güncellemesi () {
    ) (Player.draw;
}

var FPS = 30;
setInterval (function () {
    Güncelleme();
    ) (Player.draw;
}, 1000 / FPS);

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

içinde();

Ve sunucu kodu:

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

server = http.createServer (işlev (req, res) {
    res.writeHead (200, {'Content-Type': 'text / html'});
    Yeniden gönder('

Selam Dünya

'); }); server.listen (8080); var socket = io.listen (sunucu); socket.on ('bağlantı', işlev (istemci) { client.on ('mesaj', işlev (mesaj) { console.log (mesaj); client.broadcast (mesaj); }) client.on ('bağlantıyı kes', işlev () { }) });

Ve ben iki müşteri çalıştırdığımda ben ilk müşteri ile ikinci müşteri Rect hareket edebilir ve ikinci müşteri ile ilk müşteri rect hareket ve üçüncü müşteri gibi bir şey birinci ve ikinci müşteri rect hareket edebilir.

Gerçek Çok Oyunculu'yu nasıl oluşturacağım? şuna benzer: Açık üç müşteri ve ilk müşteri rect1, ikinci rect2 ve son rect3 olsun. İlk istemci sadece rect1 taşıyabilir, üçüncü istemci sadece rect3 taşıyabilir.

Belki bir fikriniz var mı? Google'da arama yapıyorum ama cevap bulamıyorum.

İngilizce dilim için özür dilerim, teşekkürler.

Yanıtlar:


15

İstemci / Sunucu modeline dayalı olarak HTML5 gerçek zamanlı çok oyunculu oyunlar oluşturmak için özel bir çerçeve oluşturdum. Bu modelde, oyuncular sunucuya yalnızca girdi gönderir (tuşlara basıldığında) - ve oyun sunucuda gerçekleşir.

Sunucu, tüm istemcilere zamanlanmış dünya anlık görüntüleri gönderir ve istemciler, geçerli zaman aralıkları arasında bilinen iki dünya güncellemesini bularak zamandan 75 msn geri çağrırırlar.

Havuz (3 demo içerir)
https://github.com/onedayitwillmake/RealtimeMultiplayerNodeJs

Video Box2D demosu iş başında:
http://vimeo.com/24149718

JSConf 2011'den slaytlar:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-multiplayergameswithnodejs-7868336

Quakeworld ve Valve'in Kaynak motoru teknik raporlarına dayanmaktadır:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


Bu Çerçeve için tebrikler!
MrYoshiji

evet bu benim oyun çalıştırmak için nasıl planlıyorum, sadece giriş göndermek için mantıklı!
Nikos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.