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
