JeuWeb - Crée ton jeu par navigateur
[Node.js] Utilisation de Socket.IO - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Node.js] Utilisation de Socket.IO (/showthread.php?tid=5897)

Pages : 1 2 3 4 5


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 02-01-2012

(02-01-2012, 05:55 PM)Maks a écrit : - Ce qui serait bien c'est d'avoir un évènement déconnexion pour que je puisse fermer la connexion à MySQL, que je mette à jour la table joueurs et que je retire le joueur qui vient de se déconnecter du Array des joueurs ^^

Il ne faut pas fermer la connexion au SQL pour chaque client ! Sinon pour les autres clients tu ne pourras pas faire de requête. Il faut fermer la connexion au serveur SQL seulement quand ton serveur va être éteint. Après pour savoir quand un utilisateur se déconnecte, il y a un événement qui se nomme "disconnect" sur la socket client.

(02-01-2012, 05:55 PM)Maks a écrit : - J'avais pas encore croisé de code aussi complet, mais si on peut utiliser prototype dans Node.JS c'est tout bon alors me reste qu'à faire comme d'habitude Smile
En plusieurs fichiers ça serait le top ouais, avec require ça doit le faire en effet.

Oui tu peux bien faire des classes avec des prototypes, par contre c'est assez spécial dans les fichiers appelés avec require. Mais tout est expliqué dans la doc'.

(02-01-2012, 05:55 PM)Maks a écrit : Pour l'héritage dans Node.JS me semble avoir croisé un code avec un extends.
Sinon de mémoire c'est myClass.prototype = new Object(); ce qui reste assez spécial d'ailleurs.

http://nodejs.org/docs/latest/api/util.html#util.inherits

(02-01-2012, 05:55 PM)Maks a écrit : Sinon j'ai un autre problème qui se pose : Sur ma map, côté client, j'ai un évènement qui fait bouger mes bots avec un setInterval(); selon un random.
Seulement comme c'est coté client personne ne verra les bots bouger de la même façon.
Comment je peux faire pour uniformiser ça ? Mettre un évènement côté serveur plutôt ?

Il faut faire ça du côté serveur, et envoyer un événement aux clients lorsque tu bouges un PNJ. Wink


RE: [Node.js] Utilisation de Socket.IO - Maks - 02-01-2012

Je vais essayer avec disconnect alors Smile

Pour require visiblement il faut utiliser exports.myClass pour récupérer les données : http://nodejs.org/docs/latest/api/modules.html#modules

Sinon tu fais un jeu toi aussi Quentin ? Parce que t'en connais un rayon sur Node.JS là Big Grin

PS : Disconnect c'est un évènement appelé automatique ou je dois faire côté client un window.onunload pour l'appeler ?


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 02-01-2012

Effectivement il faut utiliser exports pour exporter une classe ou bien une variable Wink
L'événement "disconnect" se fait côté serveur sur la socket client :


// ...

io.sockets.on('connection', function (socket) {
// ...

socket.on('disconnect', function() {
// Ce que tu fais quand le client se déconnecte ( Celui ci n'a pas besoin d'envoyer un événement )
}

// ...
});

// ...

Sinon pour ta question sur moi, effectivement je fais un jeu web. Enfin plus précisément, je fais partie de l'équipe de création d'un jeu web mais je développe surtout un moteur de jeu qui sera utilisé dans ce projet. D'ailleurs je ne connais pas tant que ça Node.JS, pour t'aider je suis aller voir pleins de fois dans la doc' pour savoir comment répondre à telle ou telle question, pour celle sur "disconnect" ( que je ne connaissais pas avant car j'en avais encore jamais eu besoin ), j'ai demandé à un ami qui connait mieux Node.JS et Socket.IO. Et oui ça casse le mystère, je ne sais pas par coeur les noms de méthodes / d'événements dans Node.JS et Socket.IO ! Après bon j'en connais quand même assez pour être à l'aise avec cette techno' Wink


RE: [Node.js] Utilisation de Socket.IO - Maks - 02-01-2012

Héhé vous devez faire un truc vachement costaud alors si vous êtes toute une équipe ^^

Si jamais t'as besoin d'aide pour Canvas je me ferais un plaisir de t'aider, parce que tu m'as bien dépanné là Wink


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 02-01-2012

Je n'ai pas précisé un truc, on est toute une équipe mais je suis le seul développeur Wink
Concernant Canvas, je n'ai pas spécialement besoin d'aide, l'affichage c'est pas vraiment le plus compliqué :-°
Mais merci quand même Wink


RE: [Node.js] Utilisation de Socket.IO - Maks - 05-03-2012

Petit up si jamais Quentin passe par ici ou si quelqu'un à une petite idée à ce nouveau problème Smile

Lorsqu'un joueur change d'onglet, le navigateur bloque tout mise à jour dans mon jeu. Ainsi, si Node envoie des sockets signifiant le déplacement d'un joueur (ou une action ect) elle n'est pas reçue dans le jeu car on n'a pas le focus sur l'onglet.
Du coup quand on revient sur l'onglet, tout est décalé :-(

Quelqu'un a été confronté au problème ?


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 06-03-2012

C'est le navigateur qui met en pause le Javascript de la page web lorsque l'onglet n'est plus actif mais je n'en ai jamais tenu compte du fait que pour mon jeu ce n'était pas un problème. Par contre si toi ça te pose problème, il y a moyen d'y remedier. La seule solution que je vois est de detecter quand l'utilisateur change d'onglet. Pour ça il faut detecter si la page web perd le focus de cette manière :


if(document.all) { // IE
document.onfocusin = focusActive;
document.onfocusout = focusDesactive;
} else { // Autre navigateurs
document.onfocus = focusActive;
document.onblur = focusDesactive;
}

function focusActive() {
// La page récupére le focus
}

function focusDesactive() {
// La page perd le focus
}

Il te suffit ensuite d'intégrer un système fait main qui corrige le tir lorsque le focus revient sur la page.

Bon c'est bourrin mais c'est la seule possibilité que je vois avec ce que je sais. Il y a surement moyen de faire mieux, suffit de voir l'onglet Facebook qui se raffraichit même si on est pas dessus, mais je ne sais pas comment ils font pour que le Javascript ne se mette pas en pause.


RE: [Node.js] Utilisation de Socket.IO - atra27 - 06-03-2012

c'est marrant mais quand je faisait des comptes à rebours (fonction avec timeout), le compte continuait meme sans le focus

c'est pas plutot le dessin du canvas qui se bloque et bloque la réception?


RE: [Node.js] Utilisation de Socket.IO - quentin01 - 06-03-2012

Effectivement je viens de tester et un compteur marche avec setTimeout et ça marche aussi avec setInterval ... Le problème vient donc d'ailleurs. Je vais essayer de faire des tests d'affichages dans un canvas pour voir si ça bloque ou non.

Edit : Et bien non, le dessin sur un canvas ne bloque pas quand on change d'onglet, j'ai utilisé ce code pour tester :


<canvas id="canvas" width="200" height="200"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');


var i = 0;

function compte() {
ctx.fillStyle = "white";
ctx.fillRect(0, 0, 200, 200);
ctx.fillStyle = "black";
ctx.fillText(i++, 10, 60);
}

setInterval(compte, 1000);
</script>

J'ai aussi essayé avec setTimeout ... Je ne vois pas d'où vient le problème. Pourtant chez moi aussi l'affichage ne se mettait pas à jour, ou plus précisement le compte des fps ne se faisaient plus dans la console.


RE: [Node.js] Utilisation de Socket.IO - Maks - 06-03-2012

Je pense que ce qui ne se fait plus ça n'est pas le dessin du canvas (quoique si tu utilises requestAnimationFrame en théorie ça bloque tout), mais bien la réception des sockets ?

Même si depuis que j'ai Firefox 10, j'ai l'impression qu'il bloque le dessin en changeant d'onglet contrairement à avant.

En fait je crois que j'ai eu ce problème lorsque j'ai voulu testé mon jeu avec deux navigateurs en même temps. Sachant qu'il consomme pas mal de CPU, j'ai du avoir un ralentissement qui a créé un décalage.

Sinon ta solution semble cool Quentin, j'enregistre un time au moment où l'utilisateur perd le focus et j'enregistre une pile des dernières actions que je restitue lorsque l'utilisateur revient.