2017-10-06 3 views
0

J'ai un programme qui a des carrés rebondissants dans un formulaire, je dois également faire en sorte que toutes les 5 secondes les carrés tirés changent de couleur, j'ai un minuteur pour mettre à jour un listbox sur les coordonnées de chaque boîte et une seconde minuterie avec l'intervalle de 5000 pour changer la couleur du carré. Maintenant, je suis en train de comprendre exactement comment puis-je changer la couleur des carrés avec la minuterie, j'ai une méthode appelée colorchange avec une propriété appelée rectcolorC# comment changer la couleur du rectangle toutes les 5 secondes

private Color Rectcolor { get; set; } 

} 
    public Color Colorchange() 
    { 
     Rectcolor = Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256)); 
     return Rectcolor; 
    } 

dans Form1 j'ai l'événement tique timer2 avec un foreach en passant par les boîtes

public partial class Form1 : Form 
{ 
    Random Randcolor = Box.randcolor; 
    Random Rand = Box.rand; 
    List<Box> Boxes = new List<Box>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     this.SetStyle(ControlStyles.UserPaint, true); 

    } 
    private void timer2_Tick(object sender, EventArgs e) 
    { 
     foreach (Box tmp in Boxes) 
     { 
      tmp.Colorchange(); 
     } 
    } 

quand je lance le programme, rien ne se passe avec les rectangles mobiles, comment je fais colorchange réellement changer la couleur du rectangle?

boîte pleine Classe Code

class Box 
{ 
    protected Rectangle myRectangle; 
    protected int xStep; 
    protected int yStep; 
    protected Form pForm; 
    protected Label myLocation; 
    protected Color myColor; 
    public static Random rand = new Random(); 
    public static Random randcolor = new Random(); 

    public Box(int x, int y, int s, Form pF) 
    { 
     myColor = new Color(); 
     myColor = Colorchange(); 
     myLocation = new Label(); 
     myLocation.BackColor = Color.Transparent; 
     myLocation.Left = x; 
     myLocation.Top = y; 
     myLocation.ForeColor = Colorchange(); 
     pF.Controls.Add(myLocation); 
     pForm = pF; 
     myRectangle = new Rectangle(x, y, s, s); 
     myRectangle.X = x; 
     myRectangle.Y = y; 
     xStep = rand.Next(1, 15); 
     yStep = rand.Next(1, 15); 
    } 

    public int X { get { return myRectangle.X; } } 
    public int Y { get { return myRectangle.Y; } } 
    private int Width { get { return myRectangle.Width; } } 
    private int Height { get { return myRectangle.Height; } } 
    private Color Rectcolor { get; set; } 
    public void Move() 
    { 
     myRectangle.X += xStep; 
     myRectangle.Y += yStep; 
     if (myRectangle.X <= 0) 
      xStep *= -1; 
     if (myRectangle.X + myRectangle.Width >= pForm.ClientSize.Width) 
      xStep *= -1; 
     if (myRectangle.Y <= 0) 
      yStep *= -1; 
     if (myRectangle.Y + myRectangle.Height >= pForm.ClientSize.Height) 
      yStep *= -1; 
     //if (myRectangle.X >500) 
     // xStep *= -1; 

    } 
    public Color Colorchange() 
    { 
     Rectcolor = Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256)); 
     return Rectcolor; 
    } 


    public static bool Bounce(Box One, Box Two) 
    { 
     if (One.X + One.Width < Two.X) 
      return false; 
     if (Two.X + Two.Width < One.X) 
      return false; 
     if (One.Y + One.Height < Two.Y) 
      return false; 
     if (Two.Y + Two.Height < One.Y) 
      return false; 
     return true; 
    } 
    //public void collision() 
    //{ 

    // xStep *= -1; 
    // yStep *= -1; 
    //} 
    public void Draw(Graphics g) 
    { 
     g.DrawRectangle(new Pen(Color.Blue), myRectangle); 

     myLocation.Top = myRectangle.Y -15; 
     myLocation.Left = myRectangle.X+(myRectangle.Width/4); 
     myLocation.Text = myRectangle.X.ToString() + ", " + myRectangle.Y.ToString(); 

    } 

i démarrer la minuterie sur le clic buttone, je vais vous donner FORM1

public partial class Form1 : Form 
{ 
    Random Randcolor = Box.randcolor; 
    Random Rand = Box.rand; 
    List<Box> Boxes = new List<Box>(); 

    public Form1() 
    { 
     InitializeComponent(); 
     this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
     this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
     this.SetStyle(ControlStyles.UserPaint, true); 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // Box tmp = new Box(100, 100, 40); 
     // Boxes.Add(tmp); 
     for (int x = 1; x < 10; x++) 
     { 
      Boxes.Add(
       new Box(
        Rand.Next(100 + x * 10, this.ClientSize.Width - 100), 
       Rand.Next(100 + x * 10, this.ClientSize.Height - 100), 
       Rand.Next(100 + x * 15), this)); 

      //Boxes.Add(new Box(100 + x * 10, 100 + x * 10, x * 15, this)); 

     } 
     timer1.Enabled = true; 
     timer2.Enabled = true; 

    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     foreach (Box tmp in Boxes) 
     { 
      tmp.Draw(e.Graphics); 

     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     listBox1.Items.Clear(); 
     foreach (Box tmp in Boxes) 
     { 
      tmp.Move(); 
      listBox1.Items.Add(tmp.X + ", " + tmp.Y); 
     } 
     this.Invalidate(false); 


    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void timer2_Tick(object sender, EventArgs e) 
    { 
     foreach (Box tmp in Boxes) 
     { 
      tmp.Colorchange(); 
     } 
    } 

} 

}

+0

Veuillez indiquer le code de votre classe 'Box'. – oRole

+0

il a été mis à jour – alvintron

+0

Où commencez-vous les minuteries? – JMA

Répondre

0

Votre méthode ColorChange() jamais vraiment 'applique la nouvelle couleur à l'objet Rectangle dans votre classe Box. Dans votre classe Box, vous avez besoin d'un nouvel objet Graphics. Vous pouvez le définir comme champ ou le passer en paramètre pour le constructeur, comme vous l'utilisez dans la méthode Draw() de toute façon.

 private Graphics g; 

     ... 

     public Box(int x, int y, int s, Form pF) 
     { 
      g = pF.CreateGraphics(); 

      ... 
     } 

Vous devrez également modifier votre méthode ColorChange(), de sorte que le Rectangle est rempli à la couleur désirée:

public Color Colorchange() 
{ 
    this.Rectcolor = Color.FromArgb(randcolor.Next(256), randcolor.Next(256), randcolor.Next(256)); 

    // You need to fill the rectangle with the desired color again 
    this.g.FillRectangle(new SolidBrush(this.Rectcolor), this.myRectangle); 
    return Rectcolor; 
} 
+0

les rectangles changent mais seulement pour une seconde, il se redessine comme bleu encore – alvintron

+0

Malheureusement, je ne peux pas reconstruire votre problème, à cause du code XAML manquant et des minuteurs. Est-ce que vos minuteurs cochent toutes les secondes? – oRole

+0

timer1 a un intervalle de 100 et timer2 a un intervalle de 5000 – alvintron

0
g.DrawRectangle(new Pen(Color.Blue), myRectangle); 

cette ligne dessine un rectangle bleu. Quelle que soit la couleur que vous avez définie sur "myColor", elle est bleue. Changer cela pour

g.DrawRectangle(new Pen(myColor), myRectangle); 

devrait résoudre votre problème.