Il y a un clone du jeu disponible sur Github Il peut toutefois être modifié par rapport au jeu original. Il est indiqué dans la description que le vrai jeu est à source fermée et que ce clone est destiné aux personnes qui souhaitent jouer à leur propre version du jeu avec les modifications qu'elles souhaitent y apporter. Ceci étant dit, je n'ai aucune raison de penser que quelqu'un aurait modifié cette portion du code ci-dessous pour changer le fonctionnement des collisions.
Il existe une fonction appelée collisionCheck
Je pense qu'il s'agit de la section du code qui contrôle si vous serez consommé ou non par un autre utilisateur. En le regardant, il effectue quelques calculs en utilisant les coordonnées X et Y des deux utilisateurs, puis vérifie également si le rayon de l'utilisateur est plus grand que les autres.
function collisionCheck(collision) {
if (collision.aUser.mass > collision.bUser.mass * 1.1 && collision.aUser.radius > Math.sqrt(Math.pow(collision.aUser.x - collision.bUser.x, 2) + Math.pow(collision.aUser.y - collision.bUser.y, 2))*1.75) {
console.log('[DEBUG] Killing user: ' + collision.bUser.id);
console.log('[DEBUG] Collision info:');
console.log(collision);
var numUser = util.findIndex(users, collision.bUser.id);
if (numUser > -1) {
if(users[numUser].cells.length > 1) {
users[numUser].massTotal -= collision.bUser.mass;
users[numUser].cells.splice(collision.bUser.num, 1);
} else {
users.splice(numUser, 1);
io.emit('playerDied', { name: collision.bUser.name });
sockets[collision.bUser.id].emit('RIP');
}
}
currentPlayer.massTotal += collision.bUser.mass;
collision.aUser.mass += collision.bUser.mass;
}
}
Ce que nous voulons examiner de plus près, c'est le if
en haut de la page :
if (collision.aUser.mass > collision.bUser.mass * 1.1 && collision.aUser.radius > Math.sqrt(Math.pow(collision.aUser.x - collision.bUser.x, 2) + Math.pow(collision.aUser.y - collision.bUser.y, 2))*1.75)
Ce que cela veut dire, c'est que :
- Si la masse de l'utilisateur A est supérieure à la masse de l'utilisateur B multipliée par 1,1 (110% de la masse de l'utilisateur B)
ET
- Le rayon de l'utilisateur A est supérieur à la racine carrée de la coordonnée X de l'utilisateur A moins la coordonnée X de l'utilisateur B à la puissance 2 plus la coordonnée Y de l'utilisateur A moins la coordonnée Y de l'utilisateur B à la puissance 2 multipliée par 1,75.
Je pense que ce qui vous intéresse avant tout, c'est la deuxième partie de l'article. if
(la partie après le &&
), puisque vous voulez savoir combien de chevauchement est nécessaire. Pour cela, faisons un exemple.
- Coordonnée X de l'utilisateur A : 50
- Coordonnée Y de l'utilisateur A : 100
- Rayon de l'utilisateur A : 50
- La masse de l'utilisateur A : 100
- Coordonnée X de l'utilisateur B : 75
- Coordonnée Y de l'utilisateur B : 120
- La masse de l'utilisateur B : 90
Introduisons ces valeurs dans la partie de l'équation suivante if
qui suit l'instruction &&
:
Math.sqrt(Math.Pow(50 - 75, 2) + Math.Pow(100 - 120, 2)) * 1.75 = ~42.35
Maintenant, regardons le reste de la if
avec notre réponse de ~42.35 mise en place, ainsi que les autres variables ci-dessus :
if (100 > 99 && 50 > 42.35) { //User A's Mass > User B's Mass * 1.1 and User A's Radius > The evaluation made above
//do the stuff in here
}
Ainsi, lorsque l'expression à l'intérieur du if
est évalué à true, il descend dans le bloc de code des déclarations et exécute tout code qui s'y trouve. Pour cette instruction, on dirait qu'elle envoie du texte à la console, qu'elle sort l'utilisateur B du jeu, qu'elle fait d'autres choses. if
la logique de l'énoncé (je ne sais pas trop quoi), et ajoute la masse de l'utilisateur B à la masse de l'utilisateur A. Donc pour répondre à la question de savoir combien de chevauchement est nécessaire, je suppose que la réponse correcte serait si Le rayon de l'utilisateur A est supérieur à la racine carrée de la coordonnée X de l'utilisateur A moins la coordonnée X de l'utilisateur B à la puissance 2 plus la coordonnée Y de l'utilisateur A moins la coordonnée Y de l'utilisateur B à la puissance 2 multipliée par 1,75. N'oubliez pas cependant que la masse de l'utilisateur A doit également être supérieure à 110% de la masse de l'utilisateur B.
Pour les virus, je crois qu'il suffit que votre masse soit supérieure à celle du virus pour qu'il vous divise. Le Wiki pour les virus l'affirme, et c'est ce qu'il semble être en jouant réellement au jeu. I pensez à le code pour cela :
if(virusCollision > 0 && currentCell.mass > virus[virusCollision].mass) {
sockets[currentPlayer.id].emit('virusSplit', z);
virus.splice(virusCollision, 1);
}
Edit :
Comment la masse est calculée :
J'ai trouvé ce bout de code dans un autre fichier javascript appelé util.js. Il est souvent référencé dans le fichier server.js, d'où provient le code ci-dessus. D'après le commentaire dans le code, cela ressemble à la façon dont la masse est déterminée :
// determine mass from radius of circle
exports.massToRadius = function (mass) {
return 4 + Math.sqrt(mass) * 6;
};
Il semble que ce soit la racine carrée de la masse du joueur multipliée par 6 plus 4. Tous les joueurs commencent avec un defaultPlayerMass
de 10, qui peut être consulté dans la config.json archivo.
0 votes
C'est une question très intéressante. Je pense que si personne n'y répond avant un certain temps, je pourrais offrir une prime. Peut-être est-il possible de consulter le code source de la page ? Mais je parie que c'est décidé côté serveur, donc il faudrait faire des tests.
0 votes
@Fabian, c'est pour un clone et non pour l'original. À moins que quelqu'un ne fasse des tests ou ne divulgue le code, nous ne connaîtrons peut-être jamais la véritable réponse. J'ai accepté la réponse parce que c'est la meilleure jusqu'à présent.