zatrzymanie animacji Opengl C#

0

Po wcisnieciu klawisza S (uruchomienie animacji)chcialam zatrzymac animacje np klawisze T :/
jak ktos mi pomoze bede wdzieczna :d

using System;
using System.Windows.Forms;
using System.Collections.Generic;

using CsGL.OpenGL;
public class GlStart : Form
{
MyView view = new MyView();
public GlStart()
{
Text = "Moj pierwszy GL";
view.Dock = DockStyle.Fill;
Controls.Add(view);
}
public static void Main()
{
GlStart gl = new GlStart();
Application.Run(gl);
}
}
public class MyView : OpenGLControl
{
    public MyView()
{
this.KeyDown += new KeyEventHandler(OnKeyDown);
}
float xrot = 0f, yrot = 0f, zrot = 0f;
public override void glDraw()
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT);
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
GL.glTranslatef(0.0f, 0.0f, -5.0f);
GL.glRotatef(xrot, 1.0f, 0.0f, 0.0f); // obrót po osi X
GL.glRotatef(yrot, 0.0f, 1.0f, 0.0f); // obrót po osi Y
GL.glRotatef(zrot, 0.0f, 0.0f, 1.0f); // obrót po osi Z
GL.glBegin(GL.GL_QUADS); // rozpoczêcie rysowania czworoboków
GL.glColor3f(1.0f, 0.0f, 0.0f); GL.glVertex3f(1.0f, 1.0f, 1.0f);
GL.glColor3f(1.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, 1.0f, 1.0f);
GL.glColor3f(1.0f, 1.0f, 1.0f); GL.glVertex3f(-1.0f, -1.0f, 1.0f);
GL.glColor3f(0.0f, 1.0f, 1.0f); GL.glVertex3f(1.0f, -1.0f, 1.0f);
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, 1.0f, -1.0f);
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(1.0f, 1.0f, -1.0f);
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(1.0f, -1.0f, -1.0f);
GL.glColor3f(0.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, -1.0f, -1.0f);
GL.glColor3f(0.0f, 0.0f, 1.0f); GL.glVertex3f(1.0f, 1.0f, -1.0f);
GL.glColor3f(0.0f, 0.0f, 1.0f); GL.glVertex3f(-1.0f, 1.0f, -1.0f);
GL.glColor3f(0.0f, 0.0f, 1.0f); GL.glVertex3f(-1.0f, 1.0f, 1.0f);
GL.glColor3f(0.0f, 0.0f, 1.0f); GL.glVertex3f(1.0f, 1.0f, 1.0f);
GL.glColor3f(1.0f, 0.0f, 1.0f); GL.glVertex3f(1.0f, -1.0f, 1.0f);
GL.glColor3f(1.0f, 0.0f, 1.0f); GL.glVertex3f(-1.0f, -1.0f, 1.0f);
GL.glColor3f(1.0f, 0.0f, 1.0f); GL.glVertex3f(-1.0f, -1.0f, -1.0f);
GL.glColor3f(1.0f, 0.0f, 1.0f); GL.glVertex3f(1.0f, -1.0f, -1.0f);
GL.glColor3f(0.0f, 1.0f, 1.0f); GL.glVertex3f(1.0f, 1.0f, -1.0f);
GL.glColor3f(0.0f, 1.0f, 1.0f); GL.glVertex3f(1.0f, 1.0f, 1.0f);
GL.glColor3f(0.0f, 1.0f, 1.0f); GL.glVertex3f(1.0f, -1.0f, 1.0f);
GL.glColor3f(0.0f, 1.0f, 1.0f); GL.glVertex3f(1.0f, -1.0f, -1.0f);
GL.glColor3f(1.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, 1.0f, 1.0f);
GL.glColor3f(1.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, 1.0f, -1.0f);
GL.glColor3f(1.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, -1.0f, -1.0f);
GL.glColor3f(1.0f, 1.0f, 0.0f); GL.glVertex3f(-1.0f, -1.0f, 1.0f);
GL.glEnd(); // koniec rysowania
}
protected void OnKeyDown(object Sender, KeyEventArgs kea)
{
if (kea.KeyCode == Keys.Q && kea.Modifiers == Keys.Shift)
{
Application.Exit();
}
if (kea.KeyCode == Keys.X)
{
xrot += 0.3f; // zwiêkszenie kšta obrotu po osi X
this.Refresh();
}
if (kea.KeyCode == Keys.Y)
{
yrot += 0.2f; // zwiêkszenie kšta obrotu po osi Y
this.Refresh();
}
if (kea.KeyCode == Keys.Z)
{
zrot += 0.4f; // zwiêkszenie kšta obrotu po osi Y
this.Refresh();
}
if (kea.KeyCode == Keys.R)
{
xrot += 0.3f; // zwiêkszenie kšta obrotu po osi X
yrot += 0.2f; // zwiêkszenie kšta obrotu po osi Y
zrot += 0.4f; // zwiêkszenie kšta obrotu po osi Z
this.Refresh();
}
if (kea.KeyCode == Keys.S)
{
while(true)
{
xrot += 0.3f; // zwiêkszenie kšta obrotu po osi X
yrot += 0.2f; // zwiêkszenie kšta obrotu po osi Y
zrot += 0.4f; // zwiêkszenie kšta obrotu po osi Z
this.Refresh();
}
}
}
protected override void InitGLContext()
{
base.InitGLContext();
GL.glShadeModel(GL.GL_SMOOTH); // gladkie cieniowanie
GL.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // kolor czyszczenia bufora kolorów
GL.glClearDepth(1.0f); // wartosc wypelnienia bufora glebi
GL.glEnable(GL.GL_DEPTH_TEST); // uaktywnienie testu glebi
GL.glDepthFunc(GL.GL_LEQUAL); // rodzaj funkcji testujacej glebie
GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e); // wywolujemy metoda klasy bazowej
System.Drawing.Size s = Size; // pobieramy nowy rozmiar okna
GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();
GL.gluPerspective(45.0f, (double)s.Width / (double)s.Height, 0.1f, 100.0f);
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
}
}
0

Proponuje przenieść kod odpowiedzialny za animacje do "zegara". Gdy zostanie wciśnięty przycisk S włączasz zegar. Gdy wciśniesz T - wyłączysz zegar. Pętla while(true) jest nie na miejscu.
Przykłady użycia zegara:
[1] http://msdn.microsoft.com/en-[...]stem.windows.forms.timer.aspx
[2] http://www.csharphelp.com/archives/archive90.html
[3] http://www.c-sharpcorner.com/[...]withTimerControlinCSharp.aspx

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0