Excellent. That did it. Thanks for the assistance.

Now to remove the bugs and get rid of the flickering.

I noticed that the timer object "should" be triggering at 60 FPS, but it's not even close. Is there some considerable overhead to using timers? Down the line, I'm planning on running the updates in a separate thread and simply putting it to sleep when it's not drawing, but i'm a little worried about this overhead. Any thoughts on optimizing animation would be great. I'll see what I can do here and repost later.

-heina

On Apr 10, 2005, at 1:17 PM, kangaroo wrote:

Jon,

The problem is currently you need to Flush() any graphics context that you use on OSX. Just add a clientDC.Flush (); after your _ball.Draw (); and this will start working.

-kangaroo

On 10-Apr-05, at 1:12 AM, Jon Heiner wrote:

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


!DSPAM:4258b64b310886250714568!


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

Reply via email to