Bitmaps ne s'affichent pas tous dans event Paint

GalFortier - Modifié le 6 juin 2018 à 12:20
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 6 juin 2018 à 17:58
Bonjour,
je code un jeu en 2D de style pokémon et je veux que les textures de 30x30 pixels s'affichent au complet sur un Panel. Pour ce faire, j'ai créé un projet de référence (qui donne un .dll) dans lequel la classe "Core" s'y trouve. J'y ai déclaré mon Panel appelé "World" et une classe appelé "Tile" où les paramètres des tuiles (image en arrière-Plan, Image en avant-plan, collision, Position).

Mon problème est que lorsque j'appelle la méthode dans Core.Render(), celle-ci déclanche l'événement Paint correctement, Mais seulement 1 tuile a été dessiné.

public void OnRender(string renders)
        {
            //Call Paint Event of World.
            Renders = renders;
            WORLD.Paint += new PaintEventHandler(RenderWorld);            
        }
        private void RenderWorld(object sender, PaintEventArgs e)
        {
            OnPaint(e);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (Renders == "Player")
            {

            }
            else if (Renders == "World")
            {
                for (int y = 0; y < XC - 2; y++)
                {
                    for(int x = 0; x < YC - 2; x++)
                    {
                        
                        base.OnPaint(e);
                        g.DrawImage(TILE[x, y].BACK_TEXTURE, TILE[x, y].DIM, TILE[x, y].DIM, GraphicsUnit.Pixel);
                        g.DrawImage(TILE[x, y].FORE_TEXTURE, TILE[x, y].DIM, TILE[x, y].DIM, GraphicsUnit.Pixel);

                    }
                }
            }
            else
            {

            }
        }



Image 1: https://drive.google.com/file/d/1bewH6GXd0fcap4QkAvIrkWxV4J1EqAAD/view?usp=sharing
Image 2: https://drive.google.com/file/d/1-FQ762oT8s9davr3MHLqW1DaO9G9OhXv/view?usp=sharing

Je pourrais vous donner le .sln, mais les textures s'y trouve et je ne veux pas me les faire copier.

Autrement, avez vous des suggestions à me donner pour que tout s'affiche?

EDIT : Correction des balises de code (jordane)

2 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
6 juin 2018 à 07:25
Bonjour
tout d'abord, pour augmenter tes chances de réponses, mieux utiliser les outils du site est conseillé.
Pour la coloration syntaxique, il faut précisé le langage, sinon ça fait un block tout gris et pas scrollable. Voir ici http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code Sur la même page, tu trouveras comment insérer des images directement dans le message plutôt que chez un autre hébergeur.


De façon générale, à propos de ton code:

Si comme, je le suppose, la méthode OnRender est appelée à de multiples reprises alors cette ligne ne doit pas y figurer
WORLD.Paint += new PaintEventHandler(RenderWorld);   
(c'est mieux avec des couleurs non?) en effet à chaque fois tu abonnes une nouvelle instance de RenderWorld à cette évènement. Cette ligne doit être écrite à une endroit où elle sera exécuté une seule fois (le constructeur par exemple).

Faire des choix avec des string est déconseillé, en effet si pour une raison ou une autre, la méthode reçoit
"player"
au lieu de
"Player"
ça ne marchera pas. Il est préférable d'utiliser des énumérations.


Pour ton problème:
Impossible de te réponse sans connaitre
  • le comportement que tu as observé en exécutant en pas à pas,
  • le contenu des variables lors de cet exécution

De plus on ne voit pas le code ou tu ajoutes tes tuiles dans le panel.
0
En fait, OnRender() est appelé une seule fois dans CORE.Init(). Mais avant que OnRender() soit appelé, la méthode calcule le nombre de tuile qu'il y a dans un ficher .map (exemple: 48:00:00:06 = 1 tuile avec 4 paramètres, soit les 2 premiers étant les textures et le dernier étant si il y a une collision) et la méthode va lire chaque paramètres et va configurer chaque tuiles. Par la suite, une fois que toutes les tuiles ont été configurées, OnRender() est lancée.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
6 juin 2018 à 17:58
Alors soit, ça n'est appelé qu'une fois, mais ça resterait plus logique d'abonner un évènement dans le constructeur ou dans ta méthode Init() que dans une méthode de rendu.

Quand au reste, ça ne répond pas à mes questions, on ne peut toujours pas te répondre.

Au passage, merci à Jordane d'avoir corrigé ta coloration syntaxique.
0
Rejoignez-nous