मल्टीप्लेयर HTML5, Node.js, सॉकेट .IO [बंद]


13

मैं एचटीएमएल 5 कैनवस, जावास्क्रिप्ट के साथ सरल मल्टी-प्लेयर बनाने की कोशिश कर रहा हूं (जॉन रेजिग सिंपल इनहेरिटेंस लाइब्रेरी का उपयोग करके) और सॉकेट के साथ Node.js। मेरा ग्राहक कोड:

var कैनवस = document.getElementById ('गेम');
var संदर्भ = कैनवस.गुटनटेक्स्ट ('2 डी');
var सॉकेट = नया io.Socket ('127.0.0.1', {पोर्ट: 8080});

var खिलाड़ी = अशक्त;

var UP = 'UP',
    LEFT = 'LEFT',
    DOWN = 'DOWN',
    अधिकार = 'अधिकार';

socket.connect ();

सॉकेट.ऑन ('कनेक्ट', फंक्शन () {सॉकेट.सेंड ();
    console.log ( 'कनेक्ट हो गया!');
    खिलाड़ी = नया खिलाड़ी (50, 50);
});

socket.on ('संदेश', फ़ंक्शन (संदेश) {
    अगर (संदेश == 'यूपी') {
        player.moveUP ();
    } और अगर (msg == 'LEFT') {
        player.moveLEFT ();
    } और अगर (संदेश == 'नीचे') {
        player.moveDOWN ();
    } और अगर (संदेश == 'अधिकार') {
        player.moveRIGHT ();
    } अन्य {

    }
});

सॉकेट.ऑन ('डिस्कनेक्ट', फंक्शन () {
    console.log ( 'डिस्कनेक्टेड!');
});

var खिलाड़ी = Class.extend ({
    init: फ़ंक्शन (x, y) {
        this.x = x;
        this.y = y;
    },
    setX: फ़ंक्शन (x) {
        this.x = x;
    },
    getX: फ़ंक्शन () {
        इसे वापस करें। x;
    },
    setY: फ़ंक्शन (y) {
        this.y = y;
    },
    getY: फ़ंक्शन () {
        इसे वापस करो। मैं;
    },
    ड्रा: फ़ंक्शन () {
        संदर्भ। क्लियरकट (0, 0, 350, 150);
        संदर्भ.फिल्टरक्ट (यह। x, यह। 15, 15);
    },
    चाल: समारोह () {
        this.x + = 1;
        this.y + = 1;
    },
    MoveUP: फ़ंक्शन () {
        this.y--;
    },
    MoveLEFT: फ़ंक्शन () {
        this.x--;
    },
    MoveDOWN: फ़ंक्शन () {
        this.y ++;
    },
    चाल: समारोह () {
        this.x ++;
    }
});

समारोह checkKeyCode (घटना) {
    var कीकोड;
    अगर (घटना == अशक्त) {
        keyCode = window.event.keyCode;
    } अन्य {
        keyCode = event.keyCode;
    }

    स्विच (कीकोड) {
        केस 38: // यूपी
            player.moveUP ();
            socket.send (उत्तर प्रदेश);
        टूटना;
        केस 37: // LEFT
            player.moveLEFT ();
            socket.send (बाएं);
        टूटना;
        मामला 40: // डाउनलोड करें
            player.moveDOWN ();
            socket.send (नीचे);
        टूटना;
        केस 39: // राइट
            player.moveRIGHT ();
            socket.send (दाएं);
        टूटना;
        चूक:
        टूटना;

    }

}

फ़ंक्शन अपडेट () {
    player.draw ();
}

var एफपीएस = 30;
सेटइंटरवल (फ़ंक्शन () {
    अपडेट करें();
    player.draw ();
}, 1000 / एफपीएस);

समारोह init () {
    document.onkeydown = checkKeyCode;
}

इस में();

और सर्वर कोड:

var http = की आवश्यकता है ('http'),
    io = की आवश्यकता ('सॉकेट.आईओ'),
    बफर = नया ऐरे (),

सर्वर = http.createServer (फ़ंक्शन (req, res) {
    res.writeHead (200, {'सामग्री-प्रकार': 'पाठ / html'});
    res.end ( '

नमस्ते दुनिया

'); }); server.listen (8080); var सॉकेट = io.listen (सर्वर); सॉकेट.ऑन ('कनेक्शन', फंक्शन (क्लाइंट) { client.on ('संदेश', फ़ंक्शन (संदेश) { console.log (संदेश); client.broadcast (संदेश); }) client.on ('डिस्कनेक्ट', फ़ंक्शन () { }) });

और जब मैं दो क्लाइंट के I को पहले क्लाइंट के साथ चलाता हूं तो दूसरे क्लाइंट को स्थानांतरित कर सकता हूं और दूसरे क्लाइंट के साथ पहला क्लाइंट रीले और तीसरे क्लाइंट के साथ कुछ ऐसा हो सकता है जो पहले और दूसरे क्लाइंट के रेक्ट को स्थानांतरित कर सकता है।

मेरा सवाल है कि असली मल्टी प्लेयर कैसे बनाएं? ऐसा कुछ: ओपन थ्री क्लाइंट और फर्स्ट क्लाइंट को रेक्ट 1, सेकेंड रेक्ट 2 और लास्ट रेक्ट 3 मिलता है। पहला क्लाइंट केवल rect1 को स्थानांतरित कर सकता है, क्लाइंट तीसरा केवल rect3 को स्थानांतरित कर सकता है।

शायद किसी के पास विचार है? मैं Google में खोज करता हूं लेकिन उत्तर नहीं मिलता है।

मेरी अंग्रेजी भाषा के लिए क्षमा करें, धन्यवाद।

जवाबों:


15

मैंने क्लाइंट / सर्वर मॉडल के आधार पर HTML5 रियलटाइम मल्टीप्लेयर गेम बनाने के लिए विशेष रूप से एक रूपरेखा तैयार की है। इस मॉडल में, खिलाड़ी सर्वर पर केवल इनपुट भेजते हैं (चाबियाँ दबाए जा रहे हैं) - और गेम सर्वर पर होता है।

सर्वर सभी ग्राहकों को समय पर विश्व-स्नैपशॉट भेजता है, और ग्राहक खुद को प्रस्तुत करते हैं कहते हैं कि वर्तमान समय से 75 एमएस वापस समय पर दो ज्ञात दुनिया अपडेट पाकर उनके बीच का समय खराब हो जाता है।

रिपोजिटरी (जिसमें 3 डेमो होते हैं)
https://github.com/onedayitwillmake/RealtimeMultback.ode/s

एक्शन में वीडियो बॉक्स 2 डी डेमो:
http://vimeo.com/24149718

JSConf 2011 से स्लाइड:
http://www.slideshare.net/MarioGonzalez15/realtime-html5-mult-5gameswithnodejs-7868336

यह क्वाकेवर्ल्ड और वाल्व के स्रोत इंजन व्हाइटपेपर पर आधारित है:
http://fabiensanglard.net/quakeSource/index.php http://developer.valvesoftware.com/wiki/Source_MultICE_Networking


इस फ्रेमवर्क के लिए बधाई!
मृत्युंजय

हाँ, कैसे मैं अपने खेल को चलाने की योजना बना रहा हूँ, सिर्फ इनपुट भेजने के लिए समझ में आता है!
निकोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.