Создание массива с помощью socket.io - PullRequest
0 голосов
/ 20 февраля 2020

Для школьного проекта я создаю многопользовательскую игру-змею с socket.io. Я попытался синхронизировать c тело змеи, которую вы играете (snake1, который является массивом с векторами в качестве местоположения. Змеи сами по себе являются объектами) и отправить его с socket.io другому игроку. Для отправки тела я использую socket.emit('snakeBody', snake1.body). Но когда я загружаю страницу, я получаю ошибку «Uncaught RangeError: Превышен максимальный размер стека вызовов». Сначала я подумал, что это массив, но когда я пытаюсь синхронизировать c нормальную переменную с вектором, я все равно получаю ошибку (когда я синхронизирую c нормальные переменные или массивы, без вектора в нем, это работает). Мой вопрос: возможно ли синхронизировать c массив с векторами в качестве значений, используя socket.io.

Файл index. js (файл, в котором происходят все события сокетов):

var express = require('express');
var app = express();

var server = app.listen(3000);
app.use(express.static('public'));

console.log("The server is live");

var socket = require('socket.io');
var io = socket(server);

io.sockets.on('connection', newConnection);

function newConnection(socket) {
  socket.on('snakeBody', body);

  function body(data) {
    socket.broadcast.emit('testBody', data);
  }
}

Файл игры. js (основа игры. Где сокет отправляет и получает)

//Defines both snakes
var snake1;
var snake2;

var socket;

function setup() {
  //The canvas for p5js to show something
  createCanvas(400, 400);

  //The starting location for the snakes (the snakes are objects in a class)
  snake1 = new Snake(200, 200);
  snake2 = new Snake(150, 250);

  //Socket server ip
  socket = io.connect('https://myIP.com');
  socket.on('snakeBody', newSnake);
}

function draw() {
  background(0);

  snake1.loop(255, 0, 0, 1, 340);

  //Sends all the players data to the server to be send to the other player
  socket.emit('snakeBody', snake1.body);
}


function newSnake(newSnake) {
  //The function that will do thing when it receives something from the socket
}

Класс змеи: Возможно, он вызовет функцию, которая не существует в этой части, но это потому, что я удалил их, потому что они не были непосредственно важны для этого вопроса.

class Snake {

  //----------------------------------------------//
  //                 Snake Setup:                 //
  //----------------------------------------------//

  //Contains all building info
  constructor(x, y) {
    //Snake elements:
    this.body = [];
    this.body[0] = createVector(x, y);
    this.head = '';
    this.part = '';

    //Game elements:
    //Dimension
    this.dim = 10;
    //Direction 
    this.x = 0;
    this.y = 0;
    //Speed 
    this.s = 2;
    //Score
    this.scoreLeng = 0;
  }

  //Contains all functions that needs to be looped
  loop(r, g, b, p, t) {
    //Move and update
    this.move(p);
    this.update();

    //If snake is dead
    if (this.gameOver()) {
      //Respawn
      this.respawn(p);
    }

    //If snake eat
    if (this.eat(food)) {
      //Grow
      this.grow();
      //Update food location
      food.update();
      //Play eat sound
      // eatSound.play();
    }
    //Show snake
    this.show(r, g, b, t);
  }

  //----------------------------------------------//
  //            All snake functions:              //
  //----------------------------------------------//

  show(r, g, b, t) {
    //Loop thru every body part of array
    for (var i = 0; i < this.body.length; i++) {
      //Rectangle with rgb color:
      fill(r, g, b);
      noStroke();
      rect(this.body[i].x, this.body[i].y, this.dim, this.dim);
    }
    //Score text:
    textSize(17);
    text("score:" + this.scoreLeng, t, 395);
  }

  dir(x, y) {
    //Directions:
    this.x = x;
    this.y = y;
  }

  update() {
    //Copy of the last element of the array:
    this.head = this.body[this.body.length - 1].copy();
    //Shift the array
    this.body.shift();

    //Add direction to snake location
    this.head.x += this.x;
    this.head.y += this.y;

    //Push head to end of array
    this.body.push(this.head);
  }

  gameOver() {
    //If snake is outside play area 
    if (this.head.x == 400 || this.head.y == 400 || this.head.x < 0 || this.head.y < 0) {
      return true;
    }

    //Loop thru body parts in array
    for (var i = 0; i < this.body.length - 1; i++) {
      //Alle body parts in part variable
      this.part = this.body[i];
      //If head of snake hits part
      if (this.part.x == this.head.x && this.part.y == this.head.y) {
        return true;
      }
    }

    //Loop thru body array
    for (var j = 0; j < this.body.length - 1; j++) {
      //If snake 1 or snake 2 head hits parts of other snake
      if (snake1.head.x == this.body[j].x && snake1.head.y == this.body[j].y) {
        console.log("snake 1 is dead");
      }
      if (snake2.head.x == this.body[j].x && snake2.head.y == this.body[j].y) {
        console.log("snake 2 is dead");
      }
    }

    return false;
  }
}

1 Ответ

0 голосов
/ 20 февраля 2020

Когда вы получаете сообщение об ошибке «Максимальный размер стека вызовов превышен», это означает, что где-то в вашем коде вы вызываете функцию, которая в свою очередь вызывает другую функцию и т. Д., Пока вы не достигнете предела стека вызовов. не уверен, как это применимо в вашем случае здесь, вы не много делитесь.

Я бы посоветовал вам отправить ваши данные в виде строки:

socket.emit('snakeBody', JSON.stringify(snake1.body))

Затем на другой конец, разбери его:

const snakeBody = JSON.parse(snakeBody)
...