2011-06-05 11 views
17

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

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(){ 

    }) 

}); 

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

मुझे सवाल है कि असली मल्टी प्लेयर कैसे बनाएं? कुछ ऐसा: तीन क्लाइंट खोलें और पहले क्लाइंट को rect1, दूसरा rect2 और अंतिम rect3 प्राप्त करें। पहला ग्राहक केवल rect1 को स्थानांतरित कर सकता है, क्लाइंट तीसरा केवल rect3 को स्थानांतरित कर सकता है।

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

मेरी अंग्रेजी भाषा के लिए खेद है।

उत्तर

14

सबसे पहले, बाहर की जाँच http://www.google.com/events/io/2011/sessions/super-browser-2-turbo-hd-remix-introduction-to-html5-game-development.html

यह बताते हैं अन्य बातों के अलावा requestAnimationFrame का उपयोग कैसे करें।

दूसरा, गेम स्थिति सर्वर पर मौजूद होना चाहिए और ग्राहकों पर प्रतिबिंबित होना चाहिए।

जब कोई खिलाड़ी क्लिक करता है, तो ग्राहक को केवल एक संदेश भेजना चाहिए। सर्वर को उस क्लाइंट समेत सभी क्लाइंट्स को एक संदेश भेजना चाहिए जो कार्रवाई करते थे।

प्रत्येक खिलाड़ी सर्वर पर किसी ऑब्जेक्ट के रूप में मौजूद होना चाहिए। जब कोई खिलाड़ी लॉग इन करता है तो उसे पहले से ही सर्वर पर प्रत्येक खिलाड़ी की स्थिति के बारे में अद्यतित किया जाना चाहिए।

संशोधित ग्राहक कोड: http://codr.cc/s/d0154536/js

संशोधित सर्वर कोड: http://codr.cc/s/f96ce1d2/js

+1

एचटीएमएल 5 खेल के विकास के लिए सुपर ब्राउज़र 2 टर्बो एच.डी. रीमिक्स परिचय भयानक है में से एक हूँ! उत्तर के लिए धन्यवाद! जनरलहेनरी, मैं आपके संशोधित क्लाइंट/सर्वर कोड का प्रयास करता हूं लेकिन मेरे काम नहीं करता है। लेकिन मल्टी प्लेयर को समझने में मेरी सहायता के लिए धन्यवाद! – rhavd

+1

मैंने अपने संशोधित कोड का परीक्षण नहीं किया है, इसलिए कुछ बग्स हैं, लेकिन आपको विचार मिलता है^_^ – generalhenry

+1

सभी लिंक वर्तमान में इस उत्तर से मर चुके हैं। –

11

ग्लेन फिएद्लेर के What every programmer needs to know about game networking -article किसी को जो खेल नेटवर्किंग में मिल चाहता है के लिए अच्छा पढ़ा है। यह मूल बातें बहुत उच्च स्तर में बताता है ताकि यह जेएस और सॉकेट.ओओ के अनुकूल हो।

+0

शानदार संसाधन। धन्यवाद :) –

0

अगर किसी के पास इस सवाल के बारे में कोई समस्या नहीं है, तो मैं अभी this link as an example जोड़ना चाहता हूं।

मैं कई महीनों पहले ओप के समान पथ का अनुसरण कर रहा था और आधिकारिक सर्वर मॉडल (जिसे @ एपेली द्वारा उत्तर में संदर्भित एक सहित) में प्राप्त किया गया था, और नोडजेस/सॉकेटियो के साथ इसे कैसे कार्यान्वित किया जा सकता है, ।

मेरे शोध का नतीजा ऊपर दिए गए लिंक पर स्थित गितब परियोजना में प्रकट हुआ (यहां एक लाइव डेमो भी है)। उम्मीद है कि यह किसी की मदद करता है।

0

अब एक खुला स्रोत मल्टीप्लेयर वास्तविक समय जावास्क्रिप्ट सर्वर (और क्लाइंट लाइब्रेरी) Lance.gg कहा जाता है, जो प्रदान करता है, के रूप में आप कहते हैं, कोई वास्तविक अनुभव प्रस्तुत

यह क्लाइंट साइड भविष्यवाणी संभालती है, कदम बहाव , झुकने, और बुनियादी भौतिकी।

अस्वीकरण: मैं योगदानकर्ताओं