Problème de rafraichissement

cs_oupepasa Messages postés 4 Date d'inscription lundi 4 décembre 2000 Statut Membre Dernière intervention 7 mars 2008 - 6 mars 2008 à 21:19
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 7 mars 2008 à 12:37
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

lemmingperceval Messages postés 128 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 2 août 2009 6
6 mars 2008 à 21:50
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;

}
0
lemmingperceval Messages postés 128 Date d'inscription mardi 18 décembre 2007 Statut Membre Dernière intervention 2 août 2009 6
6 mars 2008 à 21:54
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?
0
cs_oupepasa Messages postés 4 Date d'inscription lundi 4 décembre 2000 Statut Membre Dernière intervention 7 mars 2008
6 mars 2008 à 22:48
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 mars 2008 à 03:28
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( );
0

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

Posez votre question
cs_oupepasa Messages postés 4 Date d'inscription lundi 4 décembre 2000 Statut Membre Dernière intervention 7 mars 2008
7 mars 2008 à 08:23
- 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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
7 mars 2008 à 12:37
-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( .. )
0
Rejoignez-nous