Creer des picture box a l'infini

- - Dernière réponse : soussous78
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
- 12 févr. 2013 à 22:23
Bonjour a tous,

Mon probleme est simple je voudras creer un space invaders.
Pour l'instant mon programme (en windows form) gere 1 seul monstre et un tir.

Je voudrais savoir comme gerer plusieur tir en creant des picturebox a chaque appui sur la touche espace.

je voudrais savoir comment creer une picturebox pendant l'execution du programme.
Si quelqu'un a une idée.
Afficher la suite 

2 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Salut,

Pour créer un pictureBox en dynamique il suffit de faire new PictureBox puis de l'ajouter aux controles de la fenetre this.Controls.Add().
Mais ce n'est pas du tout la bonne manière de faire,
je te donne un exemple pour dessiner directement sur la fenetre :
On fait une classe "Tir" avec son point de départ et d'arrivé + son image
On crée un Timer qui simule la "boucle" du jeu
A chaque appui sur "space bar" on cherche un tir libre puis on le lance
Pour simplifier, j'ai tout mis en public.
J'ai utilisé une image de 16 sur 16 représentant une boule (Balle.bmp).

Tout est dans le code, aucun controle glissé sur la form.

public class Tir
{
    public static Image _img = null; // Partage l'image (chargée qu'une seule fois)
    // défini un "Tir" (point départ, point arrivée et vitesse de déplacement)
    public PointF _ptOrig;
    public PointF _ptFin;
    public float _vitesseTir;
    // Ctor
    public Tir(PointF prOrig, PointF ptFin, float fVitesseTir)
    {
        _ptOrig = prOrig;
        _ptFin = ptFin;
        _vitesseTir = fVitesseTir;
    }
    // Lance le tir
    public void Tire(Graphics g)
    {
        if (_img == null) return;
        if (_ptOrig.Y > _ptFin.Y)
        {
            g.DrawImage(_img, _ptOrig);
            _ptOrig.Y -= _vitesseTir; // Déplace le tir du bas vers le haut
        }
        else
        {
            _ptOrig = PointF.Empty; // Réinit
            _ptFin = PointF.Empty;
        }
    }   
}

///////////////////////////////////// Formulaire (Form1)

public partial class Form1 : Form
{
    Tir[] _arrTir = new Tir[10]; // Max 10 tirs en même temps   
    Timer _timer = new Timer(); // simule boucle du jeu
    Random _randX = new Random(DateTime.Now.Millisecond); // Simule départ du tir sur X

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Taille de la fenetre
        this.Size = new Size(640, 480);
        this.Text = "========== PRESS SPACE BAR ! ==========";
        // Arriere plan
        this.BackColor = Color.White;

        // Initialise l'image de tous les tirs
        Tir._img = new Bitmap("Balle.bmp");

        // les tirs sont libres
        for(int i=0; i<_arrTir.Length; i++)
            _arrTir[i] = null;

        // Démarre boucle du jeu
        _timer.Interval = 25;
        _timer.Tick += new EventHandler(_timer_Tick);
        _timer.Enabled = true;
    }

    private void _timer_Tick(object sender, EventArgs e)
    {
        this.Refresh();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        // Dans la boucle du jeu, cherche si un tir a été lancé
        for (int i = 0; i < _arrTir.Length; i++)
        {
            if (_arrTir[i] != null && _arrTir[i]._ptOrig != PointF.Empty)
                _arrTir[i].Tire(e.Graphics);
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Space)
        {
            int i;
            for (i = 0; i < _arrTir.Length; i++) // Libère les tirs finis 
            {
                if (_arrTir[i] != null && _arrTir[i]._ptOrig == PointF.Empty)
                    _arrTir[i] = null;
            }

            for (i = 0; i < _arrTir.Length; i++) // Cherche un tir libre
            {
                if (_arrTir[i] == null)
                {
                    // Démarre le tir aléatoirement sur la largeur (du bas vers le haut)
                    int xOrig = _randX.Next(
                        this.ClientRectangle.Left + 15,
                        this.ClientRectangle.Right - 15);

                    _arrTir[i] = new Tir(
                        new PointF((float)xOrig, (float)this.ClientRectangle.Bottom),
                        new PointF((float)xOrig, (float)this.ClientRectangle.Top + 15.0f),
                        5.0f);

                    break;
                }
            }
        }
    }
}



Voilà, bye...
Commenter la réponse de yann_lo_san
Messages postés
47
Date d'inscription
mardi 21 novembre 2006
Statut
Membre
Dernière intervention
5 novembre 2016
0
Merci
Bonjour,
Je suis d'accord avec yann_lo_san, ce n'est pas la bonne solution.
Si par contre tu as envie de créer un picturebox à la volée. c'est simple :
PictureBox pb = new PictureBox();
pb.Location = new System.Drawing.Point(52, 47);
pb.Size = new System.Drawing.Size(42, 26);

Si tu en aura besoin plus loin dans ton code. Ajoute le dans une liste.

N'hésite pas à valider les réponses si elles te semblent justes.
Commenter la réponse de soussous78