[C#]Créer un radar pour des jeux

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Geonesis

Mon beat dans ton cube !
V.I.P
Dec 6, 2010
142
0
441
Demacia
Voici un petit tutoriel pour créer un radar World of Warcraft (et d'autre jeux) :

Introduction
Avec un minimum de jugeote vous pouvez adapter ce tutoriel pour d'autres jeux.
Réaliser un radar nécessite un connaissance Débutant+ du langage C#.

I - Prérequis

Dans ce tutoriel, j'utiliserais BlackRain, un Object Manager (comprendre le concept d'Object Manager avant de continuer, merci) pour WoW réaliser par Seifer des forums MMOwned.

Télécharger BlackRain et la suite BlackMagic de Shynd.

Black.rar (Black.rar contient BlackRain.dll BlackMagic.dll fasm_managed.dll FASM.dll)

II - DoubleBufferedPanel

Le meilleur composant pour dessiner des graphismes (2D) en C# (et d'autres langage) pour un radar est le composant Panel.

Cependant, celui ci n'as qu'un tampon simple (SimpleBuffered) donc si le temps de rafraichissement de votre Panel est faible (disons 10 millisecondes), celui ci scintilleras et ça vas être moche.

Nous allons donc créer un DoubleBufferedPanel.

Petit dessin pour expliquer.
9959.png

image (c) Site du zero​

Commencer par ajouter une classe à votre projet puis renommer Class1.cs en DoubleBufferedPanel.cs.
Voici le code :
Code:
[C#]
using System.Windows.Forms; //Using nécessaire pour accéder à System.Windows.Forms.Panel


namespace RADAR
{
    class DoubleBufferedPanel : Panel //Défini la classe en tant que composant Panel
    {
        public DoubleBufferedPanel()
        {
            this.DoubleBuffered = true; //On active le double buffering
        }
    }
}

Enfin, placer un Panel (System.Windows.Forms.Panel depuis la ToolBox) dans votre forme principale (FormMain.cs ou Form1.cs souvent).
Accédez à <Votre forme principale>.Designer.cs, puis changer ceci.

Code:
[C#]
...
this.votre_panel = new System.Windows.Forms.Panel();
...

Par.
Code:
[C#]
...
this.votre_panel = new DoubleBufferedPanel();
...

III - BlackRain Object Manager

Commençons par les usings nécessaire à la bonne utilisation de BlackRain.
Code:
[C#]
using BlackRain.Common;
using BlackRain.Common.Objects;

Voici la méthode générale pour utiliser BlackRain.

Initialisation :
Code:
[C#]
//Initialisation de BlackRain (lien vers le processus)
int wow_pid = 0;
if ((wow_pid = SProcess.GetProcessFromProcessName("Wow")) != 0)
            {
                ObjectManager.Initialize(wow_pid);
            }

Rafraîchissement des objets chargés en mémoire :
Code:
[C#]
ObjectManager.Pulse();
Accès aux données :
Code:
[C#]
ObjectManager.Me.BaseHealth;

IV - Le radar

Pour rafraîchir votre radar vous devez créer une thread tournant en boucle qui exécute la méthode Refresh du Panel, pour cela nous allons utiliser un Timer.

Ajouter un timer à votre forme, laissez l'intervalle de base (100 millisecondes) nous verrons comment le modifier dans les annexes.
Insérez la méthode Refresh() du panel dans le timer.
Code:
[C#]
private void timer_WhatYouWant_Tick(object sender, EventArgs e)
        {
            votre_panel.Refresh(); //Tout les x millisecondes cette méthode est exécutée.
        }

V - "Peindre" sur le panel

Pour "peindre" sur le panel des graphismes représentant votre joueur, les unités et/ou objets environnants (oui on vas pas dessiner des bites...) nous allons utiliser l’événement OnPaint du composant panel.

1 - Ajout de OnPaint

Sélectionnez votre panel, pardon votre DoubleBufferedPanel; puis ajoutez lui l’événement OnPaint.
Une fois ajouté, ne vous placez pas encore dans le code de l’événement; la partie la plus intéressante arrive.

2 - Avant de peindre

Avant de peindre, il nous faut du matériel :
un pinceau -> SolidBrush
un crayon -> Pen
des connaissances en dessin -> Graphics

3 - Atelier peinture


Instanciez votre matériel, mais pas vos connaissances.
Code:
[C#]
private Pen p = new Pen(Color.Transparent);
private SolidBrush f = new SolidBrush(Color.Transparent);
private Graphics g;

Placez vous dans le code de l'événement OnPaint :
Code:
[C#]
private void votre_panel_Paint(object sender, PaintEventArgs e)
        {
                 //Vous êtes ici!
        }

ATTENTION : LA SUITE SE PASSE DANS LA FONCTION EVENEMENTIELLE votre_panel_Paint().

Initialisez vos connaissances.
Code:
[C#]
g = e.Graphics();

En premier lieu, il faut nettoyer le dessin avant d'en faire un autre :
Code:
[C#]
g.Clear(Color.TheColorYouWant);

4 - Partie intéressante

Petite partie théorique : Nous voulons afficher chaque objets chargés en mémoire, ainsi que notre position (position de notre joueur) au milieu.
Mais nous ne pouvons pas accéder à tout les objets en une seule fois, nous allons devoir accéder au objets un par un puis dessiner leur positions sur le panel.

Pour placer notre position (au centre du panel), rien de plus simple, il suffit de déterminer des coordonnées fixes (x_orig, y_orig).
Code:
[C#]
x_center = votre_panel.Width / 2; //On récupère la largeur du panel, on la divise par deux et on obtient la coordonnée x centrale, je vous épargne le cours de mathématiques, je suppose que vous êtes scolarisés.
y_center = votre_panel.Height / 2; //Idem avec y et la hauteur.

Pour accéder aux objets nous allons les énumérer un par un et leur appliquer un traitement.

Attention ça viens en un bloc (commenté) :
Code:
[C#]
foreach (WowObject obj in ObjectManager.Objects) //On traite objet par objet
            {
                if (obj.IsMe) //Si L'objet est mon joueur
                {
                    b.Color = Color.Red; //On trempe le pinceau dans le Rouge
                    g.FillRectangle(b, x_center, y_center, 8, 8);//On dessine un rectangle et on le remplis avec notre pinceau au centre
                }
                else //Sinon
                {
                    p.Color = Color.Black; //On prépare notre stylo noir
                    b.Color = Color.Blue; //On trempe le pinceau dans le bleu
                    x_display = GetXDiff(obj.X); //On cherche la différence de coordonnée (X) entre nous et l'objet
                    y_display = GetYDiff(obj.Y); //On cherche la différence de coordonnée (X) entre nous et l'objet
                    g.DrawLine(p, x_center, y_center, x_display, y_display); //On trace une ligne entre nous et l'objet (coordonnées pré-transformées donc tout vas bien)
                    g.FillRectangle(b, x_display, y_display, 5, 5); //On dessine un rectangle et on le remplis avec notre pinceau au coordonnées transformées
                }
            }
Conclusion
Voilà voilà hop hop, vous avez toutes les cartes pour réaliser un radar pour n'importe quel jeu.

Attention, dans certain jeux, pour correctement afficher la position des unités, il faudras transformer les coordonnées (pour Wow aussi), mais je vais pas vous macher plus le travail.

Pour un autre jeu, il vous faudra un ObjectManager pour le-dit jeu.

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
 
Last edited:

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
Bonsoir,

Rien à dire, je trouve ca plutôt excellent, pourrais-tu apporter quelques screen à ton tuto ?
Je te remercie.

Cordialement,
n0way
 

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
ragnarock je te conseille de retirer le lien menant a un autre site, tu risque d'être sanctionné par les admins.

Geonesis Quel dommage, j'y ai presque cru, je te felicite beaucoup moins du coup, mais je te remercie du partage tout de même ;)
 

Coldphase

Membre actif
Jan 5, 2011
304
0
922
Merci Du partage , va falloir revoir un peu ce que je connaisais du C et du C++ , Merci du partage !