17 votes

Dans agar.io, combien de chevauchements sont nécessaires pour manger un autre joueur ou un virus ?

Soit

  • R = le rayon du plus grand cercle
  • r = le rayon du plus petit cercle
  • d = la distance entre les centres

Lorsque deux cercles se touchent ( d < R + r ), rien ne se passe. Cependant, j'ai remarqué que même lorsque le centre d'un petit cercle se trouve dans un plus grand cercle ( d < R ), rien ne se passe jusqu'à ce qu'ils se rapprochent légèrement.

Quelle est la condition pour manger d'autres objets ? Combien de chevauchements sont nécessaires ?

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.

7voto

user163757 Points 1728

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

Il s'agit d'une excellente analyse de la taille que vous devez avoir, mais pas de l'ampleur du chevauchement nécessaire.

0 votes

A propos, tous ces trucs de carré et de racine signifient que votre rayon doit être 1,75 fois plus long que la diagonale d'un carré imaginaire autour du cercle de l'autre personne. Je ne sais pas pourquoi exactement, ils auraient pu simplement choisir un facteur différent (par exemple un joli 5 rond), parce que les joueurs sont toujours des cercles (sauf s'ils sont écrasés, mais je ne pense pas que cela ait beaucoup d'importance et cela ne devrait probablement pas changer qui vous pouvez manger).

0 votes

Attendez, cela signifie que votre rayon doit être cinq fois plus grand que celui de l'autre personne ? C'est un peu trop pour moi.

2voto

krebstar Points 1312

Voici un résumé de La réponse de Timmy Jim para un clone de agar.io .

  • (R-4)² > 1.1(r-4)² y 1.75d < R pour manger des joueurs
  • d < R pour manger des virus

C'est intéressant, d < R - r lorsque le petit cercle est entièrement à l'intérieur du grand cercle. 1.75d < R signifie que lorsque R > 7r/3 (le plus grand cercle est 2,3 fois plus grand en rayon, ou ~5,4 fois plus grand en masse), le petit cercle peut survivre même s'il est entièrement à l'intérieur du grand cercle.

-1voto

Tangela Tube Points 140

Hmm... Je pense que j'ai déjà entendu ça avant. De ce dont je me souviens, je pense que vous devez faire environ 110-115% de la taille de la personne que vous essayez de manger.

0 votes

Oh, attendez, je viens de relire la question... Et bien maintenant tu sais quelle taille tu dois avoir pour les manger.

0 votes

C'est la moitié de la condition (mettre en relation r et R), donc cela répond à la moitié de la question.

-3voto

Alejandro Points 5

Environ la moitié de vous, rappelez-vous que c'est seulement s'ils sont plus grands que vous qu'ils peuvent vous attraper !

-3voto

jotish Points 11

Quand votre diamètre est deux fois plus grand que l'objet que vous voulez manger.

0 votes

Cela ne concerne que R et r, pas d. Or d est le nombre en question.

0 votes

La moitié de la condition dépend de r et de R, ce qui permet de répondre à la moitié de la question.

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X