Problème de rafraichissement

Signaler
Messages postés
4
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
7 mars 2008
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour,
Voila j'aimerais bien savoir comment faire pour pouvoir rafraichir ma form a chaque fois que je fais un mouvement et pas toute les minutes environ (je crois).
Si vous avez d'autres suggestions d'optimisation je suis aussi preneur.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Supaventure.Combattants.Joueurs;

namespace Supaventure
{
    public partial class Form1 : Form
    {
        Graphics g;
        LabyrintheCreator lc;
        Player p;
        public Form1()
        {
            InitializeComponent();
            lc = new LabyrintheCreator();
            p = new Player();
            g = this.CreateGraphics();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        public void MainForm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            Image herbe = Image.FromFile(@"C:\Documents and Settings\antoine\Mes documents\Visual Studio 2005\Projects\Supaventure\Supaventure\Images\herbe.jpg");
           
            //Touche "Gauche"
            if (e.KeyCode.Equals(Keys.Left))
            {
                p.My_X_Position--;
                lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                lc.laby[p.My_X_Position+1, p.My_Y_Position].MyImage = herbe;
                Console.WriteLine("gauche");
            }
            //Touche "Droite"
            if (e.KeyCode.Equals(Keys.Right))
            {
                p.My_X_Position++;
                lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                lc.laby[p.My_X_Position - 1, p.My_Y_Position].MyImage = herbe;
                Console.WriteLine("droite");
               
            }
            //Touche "Bas"
            if (e.KeyCode.Equals(Keys.Down))
            {
                p.My_Y_Position++;
                lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                lc.laby[p.My_X_Position, p.My_Y_Position - 1].MyImage = herbe;
                Console.WriteLine("bas");
            }
            //Touche "Haut"
            if (e.KeyCode.Equals(Keys.Up))
            {
                p.My_Y_Position--;
                lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                lc.laby[p.My_X_Position, p.My_Y_Position + 1].MyImage = herbe;
                Console.WriteLine("haut");
            }
        }
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            SolidBrush b = new SolidBrush(Color.Black);
           
                        for (int i = 0; i < 20; i++)
            {
                for (int j = 0; j < 20; j++)
                {
                    g.FillRectangle(b, i*40, j*40, 40, 40);
                }
            }
            base.OnPaintBackground(e);
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Image im;
            int x = p.My_X_Position - 1;

            while (x <= p.My_X_Position + 1)
            {
                int y = p.My_Y_Position - 1;
                while (y <= p.My_Y_Position + 1)
                {
                    im = lc.laby[x, y].MyImage;
                    g.DrawImage(im, x * 40, y * 40, 40, 40);
                    y++;
                }
                x++;
            }
           
            //for (int i = 0; i < 20; i++)
            //{
            //    for (int j = 0; j < 20; j++)
            //    {

            //        im = lc.laby[i, j].MyImage;
            //        g.DrawImage(im, i * 40, j * 40, 40, 40);
            //    }
            //}
            //Console.WriteLine(p.My_X_Position);
            base.OnPaint(e);
        }
    }
}

6 réponses

Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
Salut,

Déjà une partie que je modifierai:

Image

herbe =
Image.FromFile(
Environment.CurrentDirectory+
\\Images\\herbe.jpg);

switch (e.KeyCode)
{

         case
Keys.Left:
                  p.My_X_Position--;
                  lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                  lc.laby[p.My_X_Position + 1, p.My_Y_Position].MyImage = herbe;

                  Console.WriteLine(
"gauche");

                  break;

case
Keys.Right:
                  p.My_X_Position++;
                  lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                  lc.laby[p.My_X_Position - 1, p.My_Y_Position].MyImage = herbe;

                  Console.WriteLine(
"droite");

                  break;

case
Keys.Down:
                  p.My_Y_Position++;
                  lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                  lc.laby[p.My_X_Position, p.My_Y_Position - 1].MyImage = herbe;

                  Console.WriteLine(
"bas");

                  break;

case
Keys.Up:
                  p.My_Y_Position--;
                  lc.laby[p.My_X_Position, p.My_Y_Position].MyImage = p.MyImage;
                  lc.laby[p.My_X_Position, p.My_Y_Position + 1].MyImage = herbe;

                  Console.WriteLine(
"haut");

                  break;

default

:

                  break;

}
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
Si tu dois gèrer plusieurs touches en meme temps, enlève les break; aux case des switchs.
Si je ne me trompe pas, ca devra marcher comme tes IFs, meme que c'est plus propre je pense.
Si il y a quelqu'un qui peut me dire ce qu'il en pense, merci

Sinon si tu veux rafraichir lorsque tu fais un movement, tu pense au mouvement de la souris? Ou du clavier aussi?
Messages postés
4
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
7 mars 2008

bah quand j'appuie sur une touche je voudrais que le mouvement apparaisse instantanement à l'écran, je me demandais s'il ne fallait pas appeler la methode OnPaint directement apres avoir appuye sur une touche.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut,

- On ne garde pas une instance de Graphics en membre de la classe ( du moins, pas comme ça.. ).

- Ne créer pas une image avec FromFile depuis la méthode OnKeyDown ( KeyDown ), les accès disque c'est lent, sort cette déclaration de cette méthode.

- base.OnPaintBackground( e ) est inutile dans ton cas.

- Pourquoi utilises-tu la console dans une appli WinForms !?

- On appelle pas OnPaint/OnPaintBackground.. On Invalide la forme avec :

this.Invalidate( myRectangle );
this.Update( );
Messages postés
4
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
7 mars 2008

- On ne garde pas une instance de Graphics en membre de la classe ( du moins, pas comme ça.. ).
la je vois pas trop comment faire autrement.

- Ne créer pas une image avec FromFile depuis la méthode OnKeyDown ( KeyDown ), les accès disque c'est lent, sort cette déclaration de cette méthode.
ca c'est ok,

- base.OnPaintBackground( e ) est inutile dans ton cas.
il sert juste a colorier le background en noir mais d'ailleurs effectivement ca marche pas donc si quelqu'un peut m'aider aussi pour ca

- Pourquoi utilises-tu la console dans une appli WinForms !?
ca c'est pour mes tests mais je vais les enlever apres

- On appelle pas OnPaint/OnPaintBackground.. On Invalide la forme avec :

this.Invalidate( myRectangle );
this.Update( );

merci c'est surtout ca queje cherchais
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
-L'objet Graphics se trouve dans le parametrre de type PaintEventArgs de OnPaint/OnPaintBackground.

-Si tu appelles OnPaintBackground de la classe de base après ta propre peinture, il éfface tout.

- Pour les tests : Debug.WriteLine( .. )