Is there a problem with the Graphics Device not being invalidated properly? Here is some simple code that animates a sprite moving around. The only way I can see anything is if I toggle the mono window underneath another window, like the Finder. This is adapted from some animation code I picked up that renders to an Image and then uses the Graphic DrawImage call. No matter how I do it, my Form does not invalidate and update on the timer ticks. Any thoughts?

system: MacOSX 10.3.8 w/ mono1.1.5

code:
________________________________________________________________________ __________________________________
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace Bouncy
{
/ /----------------------------------------------------------------------- -------
// Ball
/ /----------------------------------------------------------------------- -------
public class Ball
{
public Ball( System.Drawing.Size bounds )
{
_armPen = new Pen(Color.Red, (float)3.0);
_center = new Point(3,3);
_size = new Size( bounds.Width + 5, bounds.Height + 5);
_velocity = new Point(1,1);
}


// bounce the ball around in a bounded rectangle
public void Update( System.Drawing.Size bounds )
{
_center.X += _velocity.X;
if( _center.X < 0 ) { _center.X = 0; _velocity.X = -_velocity.X; }
if( _center.X > bounds.Width ) { _center.X = bounds.Width; _velocity.X = -_velocity.X; }
_center.Y += _velocity.Y;
if( _center.Y < 0 ) { _center.Y = 0; _velocity.Y = -_velocity.Y; }
if( _center.Y > bounds.Height ) { _center.Y = bounds.Height; _velocity.Y = -_velocity.Y; }
}


                // draw the 'ball'
                public void Draw(Graphics g)
                {
                        g.DrawRectangle( _armPen, new Rectangle( _center, 
_size) );
                }

                private Color _ballColor;
                private Pen   _armPen;
                private Size  _size;
                private Point _velocity;
                private Point _center;
        }

/ /----------------------------------------------------------------------- -------
// MainForm
/ /----------------------------------------------------------------------- -------
public class MainForm : System.Windows.Forms.Form
{
[STAThread]
static void Main()
{
Application.Run(new MainForm());
}


                public MainForm()
                {
                        InitializeComponent();
                }

                protected override void Dispose( bool disposing )
                {
                        if( disposing )
                        {
                                if (components != null)
                                {
                                        components.Dispose();
                                }
                        }
                        base.Dispose( disposing );
                }

                private void InitializeComponent()
                {
                        this.components = new System.ComponentModel.Container();
                        this.timer1 = new 
System.Windows.Forms.Timer(this.components);
                        this.drawBox = new System.Windows.Forms.GroupBox();
                        this.SuspendLayout();

                        // timer1
                        this.timer1.Enabled = true;
                        this.timer1.Tick += new 
System.EventHandler(this.timer1_Tick);
                        this.timer1.Interval = 1000/60;

                        // drawBox
                        this.drawBox.Location = new System.Drawing.Point(120, 
60);
                        this.drawBox.Name = "drawBox";
                        this.drawBox.Size = new System.Drawing.Size(400, 200);
                        this.drawBox.TabIndex = 3;
                        this.drawBox.TabStop = false;
                        this.drawBox.Text = "Drawing Area";
                        this.drawBox.Visible = false;

// MainForm
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.BackColor = System.Drawing.Color.LightBlue;
this.ClientSize = new System.Drawing.Size(640, 320);
this.Controls.AddRange(new System.Windows.Forms.Control[] { this.drawBox });
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false;
this.Name = "MainForm";
this.Text = "MainForm";
this.Load += new System.EventHandler(this.OnLoad);
this.ResumeLayout(false);


                }

                private void OnLoad(object sender, System.EventArgs e)
                {
                        _ball = new Ball( drawBox.Size );

                        backBrush = new SolidBrush(Color.Black);

                        InitForSimpleDrawing();
                }

                private void timer1_Tick(object sender, System.EventArgs e)
                {
                        // redraw the whole form
                        _ball.Update( this.drawBox.Size );
                        DrawSimple();
                }

                private void DrawSimple()
                {
                        Graphics clientDC = this.CreateGraphics();

clientDC.FillRectangle(backBrush, drawBox.Left, drawBox.Top, drawBox.Width, drawBox.Height);
_ball.Draw(clientDC);
drawBox.Invalidate();
}

private System.ComponentModel.IContainer components;
private System.Windows.Forms.Timer timer1;


                private System.Windows.Forms.GroupBox    drawBox;
                private SolidBrush                       backBrush;
                private Ball                             _ball;
        }
}

_______________________________________________
Mono-winforms-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-winforms-list

Reply via email to