9
votes

Dessine un cercle simple dans xna

Je veux dessiner une 2D, remplie, cercle. J'ai regardé partout et je ne peux pas sembler trouver quelque chose qui va même m'aider à distance de dessiner un cercle. Je veux simplement spécifier une hauteur et une largeur et une localisation sur ma toile.

Quelqu'un sache comment?

Merci!


0 commentaires

7 Réponses :


3
votes

hors de la boîte, il n'y a pas de support pour cela dans XNA. Je suppose que vous venez de quelques antécédents GDI et que vous voulez juste voir quelque chose de se déplacer à l'écran. Dans un vrai jeu cependant, cela est rarement si jamais nécessaire.

Il y a des informations utiles ici:

http://forums.xna.com/forums/t/7414.aspx

Mes conseils pour vous seraient simplement de tirer de la peinture ou de quelque chose et de créer vous-même les formes de base vous-même et utilisez le pipeline de contenu.


0 commentaires

12
votes

Xna n'a normalement aucune idée d'une toile que vous pouvez peindre. Au lieu de cela, vous pouvez créer un cercle dans votre programme de peinture préféré et le rendre comme un sprite ou créer une série de sommets dans un maillage 3D pour se rapprocher d'un cercle et rendre cela.


0 commentaires

2
votes

Une autre option (si vous souhaitez utiliser une brosse à gradient plus complexe ou quelque chose) consiste à dessiner un quad aligné sur l'écran et à utiliser un shader pixel.


0 commentaires

8
votes

Vous pouvez également consulter le cadre d'échantillon que Jeff Weber utilise à Farseer:
http://www.codeplex.com/farseerphysics

Les démos ont un générateur de texture dynamique qui lui permettait de créer des cercles et des rectangles (que les échantillons utilisent ensuite comme visualisation de la simulation physique). Vous pouvez simplement réutiliser cela: -)


0 commentaires

7
votes

avait le même problème, car d'autres ont déjà suggéré que vous devez dessiner un carré ou un rectangle avec une texture de cercle dessus. Voici ma méthode pour créer une texture de cercle d'exécution. Pas le moyen le plus efficace ou la plus fantaisie de le faire, mais cela fonctionne.

Texture2D createCircleText(int radius)
{
    Texture2D texture = new Texture2D(GraphicsDevice, radius, radius);
    Color[] colorData = new Color[radius*radius];

    float diam = radius / 2f;
    float diamsq = diam * diam;

    for (int x = 0; x < radius; x++)
    {
        for (int y = 0; y < radius; y++)
        {
            int index = x * radius + y;
            Vector2 pos = new Vector2(x - diam, y - diam);
            if (pos.LengthSquared() <= diamsq)
            {
                colorData[index] = Color.White;
            }
            else
            {
                colorData[index] = Color.Transparent;
            }
        }
    }

    texture.SetData(colorData);
    return texture;
}


1 commentaires

Le diamètre est défini comme le temps de rayon 2 . Ce serait mieux si vous avez échangé ces noms variables.



-1
votes
 public Texture2D createCircleText(int radius, GraphicsDevice Devise,Color color,int tickenes)
    {
        Texture2D texture = new Texture2D(Devise, radius, radius);
        Color[] colorData = new Color[radius * radius];
        if (tickenes >= radius) tickenes = radius - 5;
        float diam = radius / 2f;
        float diamsq = diam * diam;
        float intdiam = (radius-tickenes) / 2f;
        float intdiamsq = intdiam * intdiam;

        for (int x = 0; x < radius; x++)
        {
            for (int y = 0; y < radius; y++)
            {
                int index = x * radius + y;
                Vector2 pos = new Vector2(x - diam, y - diam);
                if (pos.LengthSquared() <= diamsq)
                {
                    colorData[index] = color;
                }
                else
                {
                    colorData[index] = Color.Transparent;
                }
                if (pos.LengthSquared() <= intdiamsq)
                {
                    colorData[index] = Color.Transparent; 
                }
            }
        }

        texture.SetData(colorData);
        return texture;
    }

0 commentaires

1
votes

Ce que j'ai fait pour résoudre ce problème, c'était de peindre une texture rectangulaire, laissant la zone du rectangle qui ne contient pas le cercle transparent. Vous vérifiez si un point de la matrice est contenu dans un cercle provenant du centre du rectangle.

Utilisation de la matrice de données de couleur est un peu bizarre car il n'est pas un tableau 2D. Ma solution consistait à apporter une logique de tableau 2D dans le scénario. xxx

et voici la méthode pour vérifier si un point est contenu dans votre cercle: xxx

espère que cela aide!


0 commentaires