Ошибка с - = и веб-работников - PullRequest
0 голосов
/ 01 мая 2018

Я разрабатываю небольшую игру на JS и использую множество веб-работников для управления своими врагами. Вот мой ennemis.js код (это мой веб-работник):

var xEnnemis, nbrEnnemis;
var x=0;
//Seul objectif : calculer les positions des ennemis.
onmessage = function(e) {
    var idEnnemis = String(e.data[0]);
    var recXEnn = String(e.data[1]);




    xEnnemis = recXEnn;
    var recSpeedEnn = String(e.data[2]);
    vitesseEnnemis = recSpeedEnn;

    animationEnnemisInterval = setInterval(calculateEnnemisPos, 120); //60

    function calculateEnnemisPos(){
            if (xEnnemis>0){
                xEnnemis -= vitesseEnnemis;
            }else{
                xEnnemis=0;
            }
        //console.log("Send datas + "+ idEnnemis);
        postMessage([idEnnemis, xEnnemis]);
    } 
}

А вот и мой основной сценарий

if (typeof(Worker) !== "undefined") {console.log("Tu supportes les workers  !")} else {console.log("Sorry bro...");} 
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext('2d');
//ENEMIE
var nbrnnemis = 3; //Math.floor(Math.random() * (3 - 5 + 1) ) + 5;
var ennemie = new Image();
ennemie.src = "media/zombie.png";
var xEnnemisGen = [];
var vitesseEnnemis = [];
var posEnnemisrecue = [];
var ennemisRecu = 0;
var animZombie=0;
for (i=0;i<nbrEnnemis; i++){
    var w = new Worker('ennemis.js');
    xEnnemisGen[i] = 500;
    //xEnnemisGen[i] = Math.floor(Math.random() * (1401 - 1290 + 1) ) + 1281;
    vitesseEnnemis[i] = Math.floor(Math.random() * (4 - 10 + 1) ) + 4;
    //console.log("Envoyé au worker : " +i + " " + xEnnemisGen[i] + " " + vitesseEnnemis[i] );
    w.onmessage = test;
    w.postMessage([i, xEnnemisGen[i], vitesseEnnemis[i]]);
}
console.log("Nombres d'ennemis : " + nbrEnnemis);
//console.log(xEnnemis);
function test(e){
    var id = String(e.data[0]);
    var position = String(e.data[1]);
    //console.log("Just received "+e.data+ " from Worker !"); //fait ramer de ouf
    console.log("Recu la position: "+position+" avec l'id: " +id);
    posEnnemisrecue.push(position);
    ennemisRecu++;
    if (ennemisRecu == nbrEnnemis){
        if (animZombie==23){animZombie=0;}else{animZombie+=1;}
        for (i=0;i<nbrEnnemis;i++){
            ctx.drawImage(ennemie, animZombie*118,0, 118,177, posEnnemisrecue[i], 500, 118,177);
            console.log("c'est dessiné + "+ posEnnemisrecue[i]);
        }
        posEnnemisrecue=[];
        ennemisRecu = 0;
        //ctx.clearRect(0,0,1280, 720);
        ctx.drawImage(ennemie, animZombie*118,0, 118,177, 0, 0, 118,177);
        console.log(animZombie);
        console.log("dessiné " + animZombie);
    }
}

Но иногда значение xEnnemis, отправленное моим веб-работником, не уменьшается; оно даже увеличивается, как мы видим в этом журнале:

dessiné 6
Recu la position: 500 avec l'id: 2
Recu la position: 0 avec l'id: 1
Recu la position: 0 avec l'id: 0
c'est dessiné + 500
c'est dessiné + 0
7
dessiné 7
Recu la position: 500 avec l'id: 2
Recu la position: 0 avec l'id: 1
Recu la position: 0 avec l'id: 0
c'est dessiné + 500
c'est dessiné + 0

У вас есть идеи, почему? Спасибо!

Редактировать: четвертое мая, после испытания версии C.Champagne

Хорошо, только что проверил, кажется, не работает. Строка не была ответом. В любом случае спасибо за вашу помощь!

Новый журнал:

dessiné 15
Recu la position: 0 avec l'id: 0
Recu la position: 2100 avec l'id: 1
Recu la position: 0 avec l'id: 2
c'est dessiné + 0
c'est dessiné + 2100
c'est dessiné + 0
16
dessiné 16
Recu la position: 0 avec l'id: 0
Recu la position: 2101 avec l'id: 1
Recu la position: 0 avec l'id: 2
c'est dessiné + 0
c'est dessiné + 2101
c'est dessiné + 0
17
dessiné 17
Recu la position: 0 avec l'id: 0
Recu la position: 2102 avec l'id: 1
Recu la position: 0 avec l'id: 2
c'est dessiné + 0
c'est dessiné + 2102
c'est dessiné + 0
18

Как видите, оно даже увеличивается. Интересно, не виновата ли моя test(e) функция моего основного скрипта, который вызывается слишком много раз и ничего не делает.

Просто протестировал его в Chrome, чтобы убедиться, что это не ошибка навигатора, и он делает то же самое. Если у вас есть идеи, потому что я застрял. Заранее спасибо!

Редактировать: 7 мая 2018

Хорошо, ребята, только что узнал! это потому что

vitesseEnnemis[i] = Math.floor(Math.random() * (4 - 10 + 1) ) + 4;

возвращает иногда неправильные значения! Я не знаю почему, но вот некоторые результаты

Array [ -1, 0, -1 ]

Как видите, я продолжу свое расследование. Если у вас когда-либо была такая же проблема, пожалуйста, прокомментируйте этот пост!

Заранее спасибо!

Escatrag

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

оооочень, посмотрев более точно об этой строке

vitesseEnnemis[i] = Math.floor(Math.random() * (4 - 10 + 1) ) + 4;

Я решил проверить правильность синтаксиса. MDN link здесь записывает правильный синтаксис. Вместо моей строки мой код должен быть

vitesseEnnemis[i] = Math.floor(Math.random() * (4 - 1 + 1) ) + 1;

Все теперь работает нормально, я передаю вопрос как решенный.

Спасибо за вашу помощь!

0 голосов
/ 02 мая 2018

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

Плохо делать вычисления со строками, и вы можете получить довольно неожиданное поведение (конкатенация вместо сложения ...).

Я изменил инициализацию фоллинга в Рабочем

var idEnnemis = String(e.data[0]);
var recXEnn = String(e.data[1]);

xEnnemis = recXEnn;
var recSpeedEnn = String(e.data[2]);

... по

var idEnnemis = e.data[0];
var recXEnn = e.data[1];

xEnnemis = recXEnn;
var recSpeedEnn = e.data[2];

... и кажется, что все становится лучше.

...