C# Conversion d'une cellid en position de souris

Inscrit
6 Mai 2013
Messages
15
Reactions
2
#1
Bonsoir,

Veuillez m'excuser pour mon message, je bloque sur un problème auquel je n'arrive pas comment y remédier.

Ma question est de savoir si c'est possible de convertir une cellid en position de souris.

Par exemple, je suis sur la cellid 256 et quand je mets ma souris dessus cela indique la position 716,438

Écran au format : 1920, 1080

Du coup, je voulais savoir si c'est possible d'automatiser ceci.

Je vous remercie d'avance pour vos réponses, bonne soirée à vous :D
 
Inscrit
21 Février 2012
Messages
81
Reactions
5
#2
Hello, pourquoi tu veux connaitre la cellid ?
Tu dois coder un bot pixel, ça a ses limites :/
Sachant que les map dofus sont variables, les mines etc, tu n'auras pas forcément la même chose à chaque fois
 
Inscrit
6 Mai 2013
Messages
15
Reactions
2
#3
Hello, pourquoi tu veux connaitre la cellid ?
Tu dois coder un bot pixel, ça a ses limites :/
Sachant que les map dofus sont variables, les mines etc, tu n'auras pas forcément la même chose à chaque fois
Bonjour,

Concernant les cellid je les connais déjà, parce que à chaque fois que mon personnage change de map, l'application me donne la position de la map ainsi que sa cellid du personnage, ce que je voulais savoir si c'était possible de trouver la position de la souris en fonction du cellid du personnage ^^
 
Inscrit
21 Février 2012
Messages
81
Reactions
5
#4
En fonction de la map ou tu te situes les cellid sur ta position x;y seront différentes
 
Inscrit
6 Decembre 2020
Messages
31
Reactions
6
#5
Je ne sais pas si j'ai bien compris au vu des réponses au-dessus.
Mais je dirais que transformer des cellId en position x et y (sur ton écran) est tout à fait possible.
 
Inscrit
8 Septembre 2017
Messages
36
Reactions
8
#6
Hello, tu dois récupérer la taille d'une map, pour 1.29 c'est comme ça : (map en 15/17)
JavaScript:
   static function getCaseCoordonnee(mapHandler, nNum)
   {
      var _loc4_ = mapHandler.getWidth();
      var _loc5_ = Math.floor(nNum / (_loc4_ * 2 - 1));
      var _loc6_ = nNum - _loc5_ * (_loc4_ * 2 - 1);
      var _loc7_ = _loc6_ % _loc4_;
      var _loc8_ = new Object();
      _loc8_.y = _loc5_ - _loc7_;
      _loc8_.x = (nNum - (_loc4_ - 1) * _loc8_.y) / _loc4_;
      return _loc8_;
   }
ça va te donner la position x,y d'une cellule sur le cadrillage d'une carte de dofus, pour faire par rapport à ton écran il te suffit de calculer le nombre de pixel entre le bord de t'as fenêtre et le démarrage d'une carte visuellement
 

AzureHaze

Contributeur
Inscrit
27 Septembre 2019
Messages
47
Reactions
250
#7
Si ça peut t'aider à y voir plus clair pour visualiser la map:

1667996294764.png

Pour trouver les dimensions d'une case tu commences par trouver la largeur:

largeur = largeur de ta fenêtre / (largeur de la map - 1) (vu que seules les rangées paires sont visibles)
hauteur = 0.5f * largeur

après c'est simple de trouver le centre de la case en question:

1668003162611.png

cellPos:
const int mapWidth = 15;
const int mapHeight = 17;
const float windowWidth = 1000.0f;
const auto cellWidth = windowWidth  / (float)(mapWidth - 1);
const auto cellHeight = 0.5f * cellWidth;
const float offset = cellWidth * 0.5f;
int id = 0;

for (int i = 0; i < (mapHeight * 2) - 1; i++)
{
    for (int j = 0; j < ((i & 1) ? mapWidth - 1 : mapWidth); j++)
    {
        const auto cellCenter = std::make_pair(windowPosX + cellWidth * j + ((i & 1) ? offset : 0.0f), windowPosY + cellHeight * (i * 0.5f));
        id++;
    }
}
et si tu veux avoir la position relative en fonction de l'id, de la taille de ta map et de la taille de ta fenêtre, tu peux faire ça:

GetMousePosByCellId:
        const auto GetMousePosByCellId = [](int cellId, int mapWidth, float windowWidth) {
            const auto cellWidth = windowWidth / (float)(mapWidth - 1);
            const auto cellHeight = 0.5f * cellWidth;
            const float offset = 0.5f * cellWidth;
            int err = std::floorf(cellId / (float)((mapWidth * 2) - 1));
            int row = (cellId + err) / (mapWidth);
            int col = (cellId + err) % (mapWidth);
            return std::make_pair(cellWidth * col + ((row & 1) ? offset : 0.0f), cellHeight * (row * 0.5f));
        };
 
Dernière édition:
Inscrit
6 Mai 2013
Messages
15
Reactions
2
#8
Bonjour,

Tout d'abord, je vous remercie pour vos messages, et désolé pour la réponse tardive.

J'ai fait une conversion des codes pour les adapter au C#.

Le code fonctionne, mais ne donne pas du tout les bons résultats.

Voici le code converti en C#

Code:
public object get_pos(int cellId, int mapWidth, float windowWidth)
{
    float cellWidth = windowWidth / (mapWidth - 1);
    float cellHeight = 0.5f * cellWidth;
    float offset = 0.5f * cellWidth;
    int err = (int)Math.Round(Math.Floor(cellId / (float)(mapWidth * 2 - 1)));
    int row = (int)Math.Round((cellId + err) / (double)mapWidth);
    int col = (cellId + err) % mapWidth;
    return Tuple.Create(cellWidth * col + ((row & 1) != 0 ? offset : 0.0f), cellHeight * (row * 0.5f));
}
et je l'appelle avec ceci pour avoir un messagebox

C#:
Interaction.MsgBox(get_pos(230, 15, 1000).ToString());
et quand je compare sur la position de la map celle-ci n'est pas du tout la même elle m'indique autre chose

J'ai peut être fait une erreur ? :/
 
Inscrit
27 Septembre 2019
Messages
47
Reactions
250
#9
Bonjour,

Tout d'abord, je vous remercie pour vos messages, et désolé pour la réponse tardive.

J'ai fait une conversion des codes pour les adapter au C#.

Le code fonctionne, mais ne donne pas du tout les bons résultats.

Voici le code converti en C#

Code:
public object get_pos(int cellId, int mapWidth, float windowWidth)
{
    float cellWidth = windowWidth / (mapWidth - 1);
    float cellHeight = 0.5f * cellWidth;
    float offset = 0.5f * cellWidth;
    int err = (int)Math.Round(Math.Floor(cellId / (float)(mapWidth * 2 - 1)));
    int row = (int)Math.Round((cellId + err) / (double)mapWidth);
    int col = (cellId + err) % mapWidth;
    return Tuple.Create(cellWidth * col + ((row & 1) != 0 ? offset : 0.0f), cellHeight * (row * 0.5f));
}
et je l'appelle avec ceci pour avoir un messagebox

C#:
Interaction.MsgBox(get_pos(230, 15, 1000).ToString());
et quand je compare sur la position de la map celle-ci n'est pas du tout la même elle m'indique autre chose

J'ai peut être fait une erreur ? :/
faut remplacer windowWidth par la largeur de ta fenêtre (1000 c'est la largeur de ma fenêtre, pas celle du jeu), et ça te donne les coordonnées relatives (pas absolues) ensuite il faut bien que tu prennes en compte la client area de ta fenêtre (sans les bordures).
Donc au final ta position absolue (sur ton écran) sera { clientAreaX + getPos(cellId).x, clientAreaY + getPos(cellId).y }
 
Inscrit
6 Mai 2013
Messages
15
Reactions
2
#10
Merci beaucoup pour ta réponse.

Vu que mon écran fait 1920 x 1080 sans les bandes noire de la fenêtre, Dofus équivaut à 1270 pixel en horizontale
et 900 pixel en verticale
et donc 650pixel de bande noire des deux côtés.

La partie jouable dans la fenêtre est de : 325px à 1595px

Si j'ai bien compris, je remplace les 1000 par 1270
en gros "Interaction.MsgBox(get_pos(230, 15, 1270).ToString());"

à ce moment j'obtiens un résultat a celle-ci je rajoute les +325px des bande noire ?
 
Haut Bas