Witam, przesuwam sobie właśnie okręg i kwadrat. I na razie działa mi to tak, że jeśli nacisnę 'o' to przesuwa okrąg o to co tam sobie wybiorę, ale jeśli nacisnę 'k' to okrąg wraca mi do pierwotnego miejsca, a mogę przesuwać kwadrat. A chcę, żeby okrąg został mi tam gdzie był. I wyglądało to sobie tak o:
#include "glut.h"
#include "math.h"
float x = 0, y = 0;
float x_c = 0, y_c = 0;
float m_x = 0, m_y = 0;
int kolor = 0;
bool isSquare = true;
void drawCircle( float xc, float yc, float rad )
{
glPushMatrix();
if( isSquare == false )
{
x_c += m_x;
y_c += m_y;
glTranslatef( x_c, y_c, 0 );
}
glBegin( GL_LINE_LOOP );
for( int angle = 0; angle < 365; angle = angle + 5 )
{
float angle_radians = angle *( float ) 3.14159 /( float ) 180;
float x = rad *( float ) cos( angle_radians );
float y = rad *( float ) sin( angle_radians );
glVertex3f( x, y, 0 );
}
glEnd();
glPopMatrix();
}
void display( void )
{
glClear( GL_COLOR_BUFFER_BIT );
glPushMatrix();
if( isSquare )
{
x += m_x;
y += m_y;
glTranslatef( x, y, 0 );
}
if( kolor > 3 ) kolor = 1;
if( kolor == 1 ) glColor3f( 1.0, 0.0, 0.0 );
if( kolor == 2 ) glColor3f( 0.0, 1.0, 0.0 );
if( kolor == 3 ) glColor3f( 0.0, 0.0, 1.0 );
glBegin( GL_POLYGON );
glVertex2f( - 0.5, - 0.5 );
glVertex2f( - 0.5, 0.5 );
glVertex2f( 0.5, 0.5 );
glVertex2f( 0.5, - 0.5 );
glEnd();
glPopMatrix();
drawCircle( 0, 0, 1 );
glFlush();
}
static void Key( unsigned char key, int x_d, int y_d )
{
m_x = 0, m_y = 0;
switch( key )
{
case 'k':
isSquare = true;
break;
case 'o':
isSquare = false;
break;
case 'w':
m_y +=.1;
glutPostRedisplay();
break;
case 's':
m_y -=.1;
glutPostRedisplay();
break;
case 'a':
m_x -=.1;
glutPostRedisplay();
break;
case 'd':
m_x +=.1;
glutPostRedisplay();
break;
case ' ':
kolor++;
glutPostRedisplay();
break;
case 27:
exit( 0 );
default:
break;
}
}
void init()
{
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glColor3f( 1.0, 1.0, 1.0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( - 1.0, 1.0, - 1.0, 1.0, - 1.0, 1.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
int main( int argc, char * argv[] )
{
glutInit( & argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
glutInitWindowSize( 500, 500 );
glutInitWindowPosition( 0, 0 );
glutCreateWindow( "simple" );
glutDisplayFunc( display );
glutKeyboardFunc( Key );
init();
glutMainLoop();
return 0;
}
No i teraz dodałam zmienne globalne e_xc i e_yc i wyzerowałam je globalnie i z nimi działam, ale coś nie do końca styka to.
Bo np wybieram 'k' i mogę sobie przesuwać kwadrat, wybieram 'o' i przesuwac mogę okrag(a kwadrat wraca mi na początkowe położenie, więc źle), ale gdy znów się przełączę na 'k', mogę ten kwadrat przesuwać od miejsca gdzie był ostatnio, a nie od startu(więc tutaj okej).
No i tak to wygląda dla okręgu teraz:
if( isSquare )
{
x_c = 0; y_c = 0;
x_c = e_xc + m_x;
y_c = e_yc + m_y;
glTranslatef( x_c, y_c, 0 );
e_xc = x_c;
e_yc = y_c;
}
Bo ogółem potem chce te dwie figury zamienić miejscami w czasie 2sekund za pomocą GlutTimerFunc.
int licznik;
static void timercallback( int value )
{
float krok;
krok = sqrt((( e_x - e_xc ) *( e_x - e_xc ) ) -(( e_y - e_yc )( e_y - e_yc ) ) );
if( licznik < 50 )
{
licznik++;
glutTimerFunc( 100, timercallback, value );
}
}
I ja wiem, że muszę to e_xc, e_yc i e_x i e_y zmieniać właśnie dodając ten krok, i, że to musi być w tym ifie. Jednak też nie wiem zbyt jak tu uwzględnić kierunek przesuwania.