2017-02-08 9 views
2

Я использую Nodejs с Socket.io, чтобы сделать пошаговую игру.Проходя повороты с socket.io и Nodejs в пошаговой игре

Каждый поворот должен заканчиваться при нажатии кнопки «Pass» или через 5 секунд после начала поворота. В любом случае, сначала необходимо инициировать событие «Pass».

Мой текущий счетчик просто продолжает цикл, даже если его текущий игрок не поворачивается, и в определенных условиях он заканчивает поворот преждевременно.

У меня возникают проблемы с тем, какую логику я должен использовать, чтобы мои повороты работали правильно.

Мой клиент сторона этой функции

//Pressing "Pass" button 
$('#pass_turn').on('click', function(){ 
    socket.emit('pass_turn'); 

    $('#your_turn').hide(); 
    $('#not_turn').show(); 
}); 

//This runs everytime the server tells the player its their turn 
socket.on('your_turn', function() { 
    $('#your_turn').show(); 
    $('#not_turn').hide(); 

    var counter = 0; 
    var interval = setInterval(function() { 
     counter++; 

     if (counter == 5) { 
      console.log('pass_turn'); 
      clearInterval(interval); 
      $('#pass_turn').trigger("click"); 
     } 
    }, 1000); 
}); 

Это мой код на стороне сервера:

socket.on('pass_turn', function() { 
    var room = socket.rooms; 

    for(var item in socket.rooms){ 
     if(item.substring(0, 7) == 'room_0.'){ 
      //if conditions met, emit turn to opponent 
      socket.broadcast.to(item).emit('your_turn'); 
     } 
    } 
}); 

ответ

2

Я реализовал свою логику на моем пути.
У меня есть массив для хранения всех подключенных игроков (сокет)
Это будет использоваться для отслеживания текущего игрока и передачи события игроку.

стороне сервера

let players = []; 
    let current_turn = 0; 
    let timeOut; 
    let _turn = 0; 
    const MAX_WAITING = 5000; 

    function next_turn(){ 
     _turn = current_turn++ % players.length; 
     players[_turn].emit('your_turn'); 
     console.log("next turn triggered " , _turn); 
     triggerTimeout(); 
    } 

    function triggerTimeout(){ 
    timeOut = setTimeout(()=>{ 
     next_turn(); 
    },MAX_WAITING); 
    } 

    function resetTimeOut(){ 
     if(typeof timeOut === 'object'){ 
     console.log("timeout reset"); 
     clearTimeout(timeOut); 
     } 
    } 

io.on('connection', function(socket){ 
    console.log('A player connected'); 

    players.push(socket); 
    socket.on('pass_turn',function(){ 
    if(players[_turn] == socket){ 
     resetTimeOut(); 
     next_turn(); 
    } 
    }) 

    socket.on('disconnect', function(){ 
    console.log('A player disconnected'); 
    players.splice(players.indexOf(socket),1); 
    _turn--; 
    console.log("A number of players now ",players.length); 
    }); 
}); 
  1. После игроки подключаются к серверу, я толкаю их в массив, а только игра может быть запущена с запросом первого подключенного проигрывателя, нажав на кнопку в стороне клиента (вы можете изменить это).

  2. Если посмотреть на pass_turn случае, только текущий игрок может вызвать события, что означает, другие игроки блокированы в течение 5 секунд,

  3. если игрок отсоединяется, мы удалим его из массива и снижение индекса также.

  4. Функция next_turn запускается, если прошло 5 секунд или игрок нажимает кнопку на стороне клиента.

  5. Функция triggerTimeout используется для подсчета 5 секунд, через 5 секунд она запускает функцию next_turn, чтобы включить следующего игрока.

  6. Функция resetTimeout запускается, когда текущий игрок нажат кнопку на стороне клиента. время сброса и включения следующего игрока сразу

Client

<button type="button" id="turn" name="button">Next Turn</button> 
$("#turn").on("click",function(e){ 
    socket.emit('pass_turn'); 
}) 

Включите ваш сервер, откройте 3 ~ 4 браузеры и попробовать его

удачи :)

 Смежные вопросы

  • Нет связанных вопросов^_^