PDA

View Full Version : Glut.TimerCallback() for scale and rotate



danielwashere
12-30-2010, 10:43 PM
I am using VS2008 with TaoFramework's freeglut and OpenGl

Can someone help me? I always get "CallbackOnCollectedDelegate" error
when I apply this rotation and scaling with mouse and timer
on my 3D Tetris game project,

but if I don't apply timer the scale and rotate will be out of control....

these are the codes that cause my tetris game to crash; when playing for some time my game crashes...
when I remove rotate and scale option game doesnt crash...

My code is attached in this post...


#region ScaleRotate(int value)
private static void ScaleRotate(int value)
{
if (shiftButton == true) // holding shift button??
{
if (lmd == 1 && moving == 1) // is left mouse down? is mouse moving?
{
if (xNw > baseX) // mouse moves to the right
{
Gl.glScaled(1.07, 1.07, 1.07); //scale bigger
baseX = xNw; // update mouse position
}
else if (xNw < baseX) // moves to the left
{
Gl.glScaled(0.93, 0.93, 0.93); //smaller
baseX = xNw;
}
}
}
else if (shiftButton == false) //if not holding the shift
{
if (lmd != 0 || rmd != 0 || mmd != 0)//if mouse button is being pressed
{
Gl.glRotated(angle, lmd, mmd, rmd); //rotate
if (release == true) //if mouse is released
{
angle -= 0.09f; //apply persistence
if (angle <= 0) //if angle reaches 0
{
release = false; //stop the release event
lmd = 0; rmd = 0; mmd = 0; //stop rotating
angle = 2; //prepare angle for next event
}
}
}
}

RegisterTimer2(); //loop timer
}
#endregion ScaleRotate(int value)

#region RegisterTimer2
private static void RegisterTimer2()
{
Glut.glutTimerFunc(50, new Glut.TimerCallback(ScaleRotate), 1);
}
#endregion RegisterTimer2



the error message is:
A callback was made on a garbage collected delegate of type 'Tao.FreeGlut!Tao.FreeGlut.Glut+TimerCallback::Inv oke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called.

I am wondering what I am doing wrong and is there any way to optimize my code??

thanks in advanced.