Probleme d'affichage d'une picture box crée dans une classe

ManaOne - 2 mai 2023 à 16:22
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 - 9 mai 2023 à 18:30

Bonjour, voici mon problème : je suis entrain de crée un space invader,

pour ce faire j'ai créer une classe joueur qui a une variable image statique (ou je charge l'image de mon joueur) puis j'ai une variable picture box pour créer mon joueur.

dans mon code principale j'ai instancier une variable de type joueur

mais quand je lance mon programme rien ne s'affiche a l’écran avez vous des idées ?

voici mon code joueur :

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Space_invader_Complexe
{
    internal class joueur
    {
        /* ------------------------------------------------------------------- */
        /* -                       elements statique                         - */
        /* ------------------------------------------------------------------- */


        // - declaration des variables statique ------------------------------

        static private Image img_joueur;

        // - constructeurs statique ------------------------------------------

        static joueur()
        {
            img_joueur = new Bitmap("F:\\programme c#\\TD\\Space_invader_Complexe\\Space_invader_Complexe\\image\\tank.png");
        }

        // - methode statique ------------------------------------------------

        // - proprieter statique ---------------------------------------------

        /* ------------------------------------------------------------------- */
        /* -                      elements d'instance                        - */
        /* ------------------------------------------------------------------- */


        // - declaration des variables d'instance ------------------------------

        public PictureBox pb_joueur;
        private int       point_de_vie;

        // - constructeurs d'instance ------------------------------------------

        public joueur()
        {
            this.point_de_vie = 3;
            this.pb_joueur = new PictureBox();
            this.pb_joueur.BackColor = System.Drawing.Color.Red;
            this.pb_joueur.Image = img_joueur;
            this.pb_joueur.Location = new System.Drawing.Point(500, 500);
            this.pb_joueur.Name = "pb_joueur";
            this.pb_joueur.Size = new System.Drawing.Size(50, 50);
            this.pb_joueur.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
            this.pb_joueur.TabIndex = 0;
            this.pb_joueur.TabStop = false;
            this.pb_joueur.Tag = "joueur";
            this.pb_joueur.Enabled = true;
            this.pb_joueur.Visible = true;
        }

        // - methode d'instance ------------------------------------------------



        // - proprieter d'instance ---------------------------------------------
    }
}

et mon code principale :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Space_invader_Complexe
{
    public partial class f_jeu : Form
    {
        public f_jeu()
        {
            InitializeComponent();
        }

        private void f_jeu_Load(object sender, EventArgs e)
        {
            joueur joueur1;

            joueur1 = new joueur();

            
        }
    }
}

5 réponses

Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
2 mai 2023 à 17:53

Bonjour

En C#, on préfère séparer "le métier" et l'IHM.

Dans cet esprit, ce serait au formulaire de s'occuper d'afficher la picturebox en fonction de l'état du joueur.

Ça permet par exemple de pouvoir tout changer l'IHM sans compromettre le code métier.

Mais bon, rien n'interdit de faire comme tu l'as pensé.


As-tu déjà ajouté un contrôle sur un formulaire par le code ?

Si oui, comment coderais-tu ça pour une picturebox au niveau du formulaire ? (Auquel cas, tu devrais trouver ce qui ne va pas).

Si non, je t'expliquerai.


0

Bonjour Whismeril et merci de ton aide.

je débute en windows Form, je n'avais fait que des programme console avant et me lance dans mon premier gros projet fenêtrer.

J'ai compris que mon erreur est de ne pas avoir ajouter mon picturebox a mes contrôleur comme ce ci :

"this.Controls.Add(joueur1.pb_joueur);"

Je comprend que c'est pas clean de faire ma pictureBox dans ma classe, mais je ne sait pas comment attacher a une pictureBox une classe.

Donc j'ai pris le partie de les déclarer dedans, mais ci c'est pas une bonne pratique je vais changer.

encore merci pour ton aide

0
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
3 mai 2023 à 08:17

Bonjour 

je débute en windows Form, je n'avais fait que des programme console avant et me lance dans mon premier gros projet fenêtrer.

On a tous été débutants un jour, tu n'as pas a t'en justifier. Surtout que tu n'as pas fait l'erreur de beaucoup (moi y compris à mon époque) d'attaquer de suite un projet fenêtré.

La progression que tu as choisie, les bases en console puis winform est un bon choix.

Je ne voulais pas sembler hautain mais bien constructif en essayant d'expliquer le principe de séparation des couches.

J'ai compris que mon erreur est de ne pas avoir ajouter mon picturebox a mes contrôleur comme ce ci :

Exactement, c'est de là que vient le problème et le code de correction que tu proposes est une des options possibles.

mais je ne sait pas comment attacher a une pictureBox une classe.
 

L'idée serait plutôt que la classe joueur communique avec le formulaire. Et qu'en fonction de la communication le formulaire affiche ou déplace (tu vas avoir ça aussi à faire) la picturebox.

Dans tes projets console as tu utilisé des interactions entre classes ?


0

Bonjour et désoler pour le temps de réponse un peux long (semaine charger ^^).

Tout d'abord non je ne cherchais pas a me justifier, mais plutôt a t'expliquer où en était mon niveaux en développement car je pense qu'il est important de savoir pour pouvoir mieux conseiller.

Sinon pour la question des interactions entre classe

Ci c'est le faite d'utiliser des classes dans une classe ? genre on a une classe banque qui va contenir une liste de type client par exemple ?

Ci c'est ça oui plusieurs fois.

Donc si je comprend bien se que tu veux dire ce serait de créer une PictureBox et une classe joueur avec par exemple une variable va_a_droite et va_a_gauche de type booleen et que en fonction de si elle sont a true on déplace la PictureBox dans la direction souhaiter.

donc la PictureBox n'est pas vraiment attacher a joueur directement ?

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
9 mai 2023 à 18:30

Bonjour

Pour les interactions, on va rester avec la classe Banque, Client et FDE (Fournisseur D'Électricité).

Le client utilise les méthodes Depot et Retrait de la classe Banque. Ces méthodes prennent en paramètre un montant et retournent le solde après opération. Ainsi, le client peut suivre son compte.

On a là un premier type d'interaction, une action qui amène une réponse.

De son côté, FDE utilise la méthode PrelevementAutomatique de la classe banque, qui ne retourne rien. En effet, FDE n'a pas à connaitre le solde de son client.

C'est une interaction dans un seul sens.


Mais dans la vraie vie, si un prélèvement met ton compte à découvert, ton banquier va t'appeler.

On peut reproduire cet appel téléphonique grâce à un évènement.

Tu peux aller voir ce code de Bidou, qui illustre l'utilisation des évènements

Dans ton cas, que tu choisisses de laisser la picturebox dans la classe joueur ou que tu la mettes dans le formulaire, tu auras besoin d'évènements.

Dans le premier cas, il faudra que le joueur signale au formulaire qu'il a mis à jour les coordonnées de la picturebox et qu'il faut que la page soit rafraichie.

Dans le second cas, il faudra que le joueur signale au formulaire qu'il a bougé et que l'affichage doit le montrer (avec une picturebox ou autre chose).

Je te conseille aussi de te renseigner sur l'interface INotifyPropertyChanged, qui impose d'utiliser l'évènement PropertyChanged pour signaler tout changement d'état des propriétés de la classe qui l'implémente.

Ça peut être une solution pour toi, mais surtout, si par ailleurs, tu veux utiliser le binding (qui est un procédé simplifié d'affichage de données sur le formulaire), c'est un pré-requis pour les classes à afficher.

J'ai écrit un tuto à ce sujet https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource


0
Rejoignez-nous