Как для socket.emit 2x массивов через socket.io? - PullRequest
0 голосов
/ 30 сентября 2018

Возникли проблемы с передачей 2 массивов клиенту.У меня есть 2 объекта, и все экземпляры создаются на стороне сервера.Socket.emit взят из того, что я понял, сделано на сервере 25s / s и для каждого сокета, которые существуют.Теперь я создал пули на каждом корабле и хочу передать их клиенту.То, что вызывает у меня головную боль, так это то, что я жду на стороне Клиента с socket.on на корабль, который составляет 1: 1 на каждый испущенный сокет от сервера.А теперь по 1: n на каждый сокет на сервере, который стреляет пулями.Могу ли я на самом деле испускать 2 массива с 2 выпусками выполнения или нужно ли ohne излучать из каждого сокета со всеми данными в одном массиве?Моя проблема в том, что пуля массива не существует на стороне клиента!

Так что мои значения корабля находятся на стороне клиента, так или иначе, у меня нет массива пули на стороне клиента, я протестировал его с ничьей в фиксированном хи у

for (var i in bullet){
        ctx.fillText("X",100,100);
        }

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

Ценю любую помощь

App.js

for(var q in SOCKET_LIST){
 var socket = SOCKET_LIST[q];
 var f =0;
 for(var k = 0;k<allbullets.length;k++)
 {
 if (allbullets[k].user_id === q)
 {
 packbul= {
        x:allbullets[k].xtype.x,
        y:allbullets[k].xtype.y,
        userid:allbullets[k].user_id,
    }// array end
}
    f++;
 } //end for
 socket.broadcast.emit('newBullet',packbul);
 if (allobjects[q] === undefined) 
 {
 }
 else{
 console.log("q:"+q);
  pack[q] = {
        x:allobjects[q].xtype.x,
        y:allobjects[q].xtype.y,
        userid:q,
    }// array end

 socket.broadcast.emit('newClientship',pack[q]);
   } // else end 
 } // For ebf.

},1000/25); // Set Interval End

Клиент

var ship = Array();
var bullet = Array();
socket.on('newClientship',function(data){
   ship[data.userid]= data;
     });
    socket.on('newBullet',function(data){
   bullet= data;
     });
     var previous;  // var for renderworld
    renderWorld = function(timestamp){
    //setInterval(function(){
    if (!previous) previous = timestamp;
    elapsed = timestamp - previous;
    updateFps();
    ctx.font="150px Arial"; 
    ctx.fillStyle = "white";
ctx.clearRect(0,0,canvas.width,canvas.height);
      for ( var i in ship){ ctx.fillText(ship[i].userid,ship[i].x,ship[i].y);       
        }
        if (bullet.length > 10)
        {
        alert("ted");
        }
        for (var i in bullet){
        ctx.fillText("X",100,100);
        }
    drawFps(200,20) ; 
    previous = timestamp;
window.requestAnimationFrame(renderWorld);
    //},1000/25);

    }

Только что обнаружил, что цикл for на стороне сервера не работает

Это дает мне «неопределенное», если я console.log (allbullets.length)

Если я делаю console.log (allbullets), он показывает, что он существует.

Bulletobj {
  user_id: 47,
  type: 'Bullet',
  radius: 2,
  basespeed: 1,
  speed: 1,
  velX: 0.2979165941720021,
  velY: 0.9545919038609927,
  targetX: 863,
  targetY: 2429,
  xtype: Obj { x: 153, y: 154, radius: 3, selected: 0 },
  angleDeg: 1.268286927738952,
  realAngle: 72.66748817105554 }

Теперь нашел формулу для подсчета предметов объекта

console.log("length:"+Object.keys(allbullets).length);

Но даже этоучитывает только предметы в одном из объектов и всегда показывает 12

Я хотел бы получить количество всех пуль, имеющих экземпляр

К вашему сведению На моем корабле есть процедура, которая создает новую пулю

ClientObj.prototype.fire =function (x,y){  
allbullets  = new Bulletobj(this.xtype.x,this.xtype.y,x,y,1,1, this.user_id);
}

// поместили эту переменную вне внешних функций для глобальных

allbullets = Array(); 

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Решено !!!через 3 дня разочарования OMG

снова спасибо за толчок без него я был бы потерян

Проблема заключалась в смешении массива объектов и стандартного массива.Например, var x = {} -> массив объектов var x = [].-> Стандартный массив

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

Может быть, кто-нибудь подскажет, что я излучаю, когда помещаю массив объектов в стандартный массив на стороне сервера.Это объект или стандартный массив?Включены ли в этот массив, который я посылаю клиенту, заголовки объектов, которые создают проблемы с производительностью (это то, что где-то читается)?Я имею в виду, что на стороне клиента я получаю массив, но в цикле for с помощью ctx у меня снова есть массив объектов, который был внутри стандартного массива

if(allbullets[k].user_id == q)
 {
 packbul= {
        x:allbullets[k].xtype.x,
        y:allbullets[k].xtype.y,
        userid:allbullets[k].user_id,
    }// array end
 packbularray.push(packbul);
 } // if end 

Index.html

var ship = Array();
var bullet= Array();
var bulletdata =Array();

 socket.on('newClientship',function(data){
   ship[data.userid]= data;
   //ship.x = data.x;
   //ship.y = data.y;
   //ship.user = data.userid;
     });
    socket.on('newBullet',function(data){
   bullet= data;
   //bulletdata.push(bullet);
   //ship.x = data.x;
   //ship.y = data.y;
   //ship.user = data.userid;
     });
0 голосов
/ 01 октября 2018

App.js

var allbullets = [];
Bulletobj = function(x,y,targetX,targetY,shipid,speed,user_id){
this.user_id = user_id;
this.type = 'Bullet';
this.radius = 2;
this.basespeed = speed;
this.speed = 4;
this.velX = 0;
this.velY = 0;
this.targetX = targetX;
this.targetY = targetY;
this.xtype = new Obj(x,y,3);
w.objects.push(this);

Bulletobj.prototype.update =function (){  

tx = this.targetX - this.xtype.x;
ty = this.targetY - this.xtype.y;
dist = Math.sqrt(tx * tx + ty * ty);
this.angleDeg =  Math.atan2(ty,tx)  ;  
this.realAngle = (Math.atan2(ty,tx)  * 180/Math.PI + 360 ) % 360 ; 
this.velX = (tx / dist) * this.speed ;
this.velY = (ty / dist) * this.speed ;
if (parseInt(dist) > parseInt(this.radius / 2)) {
this.xtype.x += parseInt(this.velX);
this.xtype.y += parseInt(this.velY);

}    // if distance schleife end
} // Bulletobj update end
}    // Bulletobj end

setInterval(function(){
 var pack = Array();
 var packbul = Array();
 var packbularray = Array();
 var spliceArray = Array();
  objcnt = w.objects.length;
 var i=0;  
 while (i < objcnt)  
 {
 w.objects[i].update();
 if(w.objects[i].hitpoints <= 0 )
 spliceArray.push(i);           
 i++;
 } // endwhile
for(var k = 0;k<spliceArray.length;k++) 
 {
w.objects.splice(spliceArray[k],1);
 }

for(var q in SOCKET_LIST){

 var socket = SOCKET_LIST[q];

 if (allbullets === undefined) 
 {
 }
 else {
 for(var k = 0;k<allbullets.length;k++) 
 {
    if(allbullets[k].user_id == q)
 {
 packbul= {
        x:allbullets[k].xtype.x,
        y:allbullets[k].xtype.y,
        userid:allbullets[k].user_id,
    }// array end
 } // if end 
  //obj end
 } // end else undefined objects
} //end for 
console.log(packbul);
socket.emit('newBullet',packbul);
if (allobjects[q] === undefined) 
 {
 }
 else{
 console.log("q:"+q);
  pack[q] = {
        x:allobjects[q].xtype.x,
        y:allobjects[q].xtype.y,
        userid:q,
    }// array end

 socket.broadcast.emit('newClientship',pack[q]);

 } // else end 
 } // For socket
 },1000/25); // Set Interval End

Index.html

var ship = Array();
var bullet= Array();
var bulletdata =Array();

 socket.on('newClientship',function(data){
   ship[data.userid]= data;
     });
    socket.on('newBullet',function(data){
;
   bulletdata.push(data);
});
        var previous;  // var for renderworld

    renderWorld = function(timestamp){
    if (!previous) previous = timestamp;
    elapsed = timestamp - previous;
    updateFps();
    ctx.font="150px Arial"; 
    ctx.fillStyle = "white";
    ctx.clearRect(0,0,canvas.width,canvas.height);
    for ( var i in ship){   ctx.fillText(ship[i].userid,ship[i].x,ship[i].y);       
        }

        for (var i in bulletdata){
        ctx.fillText(".",bulletdata[i].x,bulletdata[i].y);
        }
    bulletdata = [];
    drawFps(200,20) ; 
    previous = timestamp;
    window.requestAnimationFrame(renderWorld);

    }

Так что мне удалось передать одну пулю клиенту.Проблема теперь в том, что каждый раз, когда игрок стреляет в пулю, старая пуля исчезает, и новый старт начинается с другого клиента.1-й клиент стреляет.Если второй клиент начинает стрелять, пуля игрока 1 удаляется.Обычно я хотел, чтобы у каждого клиента были свои маркеры и все маркеры, созданные как объекты на стороне сервера, для рисования на клиентах.Корабли работают отлично, но пуля как-то мерцает и не вписывается в полотно ? Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...