1

J'essaie de créer un jeu multijoueur en utilisant JS.Set Les contrôles ne fonctionnent pas pour une instance d'objet mais fonctionnent pour d'autres

function EvilBall(player,color) 
{ 
    EvilCircle.call(this,this.size,this.velY,this.velX); 
    this.color=color; 
    this.score =0; 
    this.player=player; 

} 

EvilBall.prototype=Object.create(EvilCircle.prototype); 
EvilBall.prototype.constructor =EvilBall; 

    EvilBall.prototype.setControls=function(left,right,down,up){ 
     var _this = this; 
     window.onkeydown = function(e) { 
      console.log(e.keyCode); 
      if (e.keyCode === left) { 
       _this.x -= _this.velX; 
      } else if (e.keyCode === right) { 
       _this.x += _this.velX; 
      } else if (e.keyCode === down) { 
       _this.y -= _this.velY; 
      } else if (e.keyCode === up) { 
       _this.y += _this.velY; 
      } 
     } 
    } 

après que je crée deux instances de EvilBall et réglage, il contrôle en utilisant la fonction de setControls qui a la fonction de gestionnaire d'événements à l'intérieur.

var evilBall = new EvilBall('p1','white'); 
var evilBall2 = new EvilBall('p2','yellow'); 
evilBall2.setControls(65,68,87,83); 
evilBall.setControls(37,39,38,40); 

Seulement evilBall exemple avec la clé 37,39,38 et 40 fonctionne lorsque les touches sont enfoncées. J'ai pensé que depuis evilBall est mentionné ci-dessous evilBall2, cela fonctionne bien. Si un gestionnaire d'événements fonctionne correctement sur une instance, pourquoi ne travaille-t-il pas sur l'autre? Comment pouvons-nous développer des jeux multi-joueurs dans JS lorsque le gestionnaire d'événements sur une seule instance fonctionne? Quelqu'un peut-il m'expliquer s'il vous plaît. Est-ce que j'ai râté quelque chose?

+0

EvilCircle.call (ce, this.size, this.velY, this.velX); this.size etc n'est pas défini? –

+0

use window.addEventListener ("keydown" –

+0

J'ai défini toutes les fonctions dépendantes.Voyez le fichier main.js pour le code entier https://github.com/karanjariwala/Bouncing-Ball-Game.git –

Répondre

1

fenêtre onkeydown est une propriété:

window.onkeydown =()=>alert("one"); 
window.onkeydown =()=>alert("two");//will override the first 
window.onkeydown(); 

Il faut donc utiliser window.addEventListner à la place:

window.addEventListener("keydown",function(event){ 
... 
}); 

Dans l'ensemble, il pourrait être préférable d'avoir un seul écouteur d'événement:

var keylisteners=[]; 
window.onkeydown=function(e){ 
(keylisteners.find(el=>el.key==e.keyCode)||{callback:function(){}}).callback(); 
}; 

Utilisez comme ceci:

keylisteners.push({ 
key:42, 
callback:function(){} 
}); 

Par ailleurs, votre fonction ne prend pas la forme des arguments:

Shape.call(this); //will do the job too 
+0

ils ne fonctionnent toujours pas simultanément et comme prévu Démo: https://karanjariwala.github.io/Bouncing-Ball-Game/ Lien vers le main.js: https://github.com/karanjariwala/Bouncing-Ball -Game/blob/master/main.js –

+1

@KaranJariwala ils fonctionnent bien pour moi ... –

+0

"ASDW" Touches et "haut, bas, gauche, droite" Les touches sont de contrôler les boules blanches et jaunes. pour que les deux gestionnaires d'événements travaillent simultanément pour créer un jeu à 2 joueurs: Exemple: si j'appuie longuement sur la touche "A", la balle jaune pourrait bouger déplacer même si vous appuyez sur la touche "haut, bas, droite ou gauche". Merci pour votre temps à l'avance! –