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
