동영상
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.set('view engine', 'ejs'); // 렌더링 엔진 모드를 ejs로 설정
app.set('views', __dirname + '/views'); // ejs이 있는 폴더를 지정
const { initGame, gameLoop, UpdateMovement } = require('./game');
app.get('/', (req, res) => {
res.render('index'); // index.ejs을 사용자에게 전달
})
const state = {};
const clientRooms = {};
io.on('connection', client => {
client.on('keydown', handleKeydown); //핸들러 선언문
client.on('newGame', handleNewGame);
client.on('joinGame', handleJoinGame);
function handleJoinGame(roomName)
{
const room = io.sockets.adapter.rooms.get(roomName); //adapter를 통하여 room 정보를 가져옴
let numClients = 0;
if(room === undefined)
{
client.emit('unknownCode');
return;
}
numClients = room.size; // room 안에 몇명이 있는지 알아오는 변수
if(numClients === 0)
{
client.emit('unknownCode');
return;
}
else if(numClients > 1)
{
client.emit('tooManyPlayers');
return;
}
clientRooms[client.id] = roomName;
client.join(roomName);
client.number = 2;
client.emit('init' , 2);
startGameInterval(roomName);
}
function handleNewGame(){ //게임 방을 만드는 함수 핸들러
let roomName = makeid(5);
clientRooms[client.id] = roomName;
client.emit('gameCode' , roomName);
state[roomName] = initGame();
client.join(roomName);
client.number = 1;
client.emit('init' , 1);
}
function handleKeydown(keyCode) {
const roomName = clientRooms[client.id];
if (!roomName) {
return;
}
try {
keyCode = parseInt(keyCode);
} catch(e) {
console.error(e);
return;
}
UpdateMovement(state[roomName], client.number , keyCode);
}
});
function startGameInterval(roomName) //게임에 Join 이 되었을 룸을 시작 할 수 있게 제작
{
const intervalId = setInterval(() =>{
const winner = gameLoop(state[roomName]);
if(!winner)
{
emitGameState(roomName , state[roomName]);
}
else
{
emitGameOver(roomName , winner);
state[roomName] = null;
clearInterval(intervalId); //intervalId 인터벌을 종료
}
}, 1000 / 30);
}
function emitGameState(room , gameState){
io.sockets.in(room).emit('gameState' , JSON.stringify(gameState));
}
function emitGameOver(room , gameState){
io.sockets.in(room).emit('gameOver' , JSON.stringify({winner}));
}
function makeid(length) {
let result = '';
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
for (let i = 0; i < length; i++) {
result += characters.charAt(
Math.floor(Math.random() * characters.length));
}
return result;
}
server.listen(3000 , function() {
console.log("3000 포트 대기중 ");
});