Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.7.2010
Репутация: нет Всего: нет
|
Народ подскажите как сделать чтоб астероиды не прыгали по окну а плавно двигались линейно в рендомном направлении. И может кто знает как сделать так чтоб при контакте треугольника с астероидом цвет треугольника менялся на красный | Код | #include <windows.h> #include <stdio.h> #include <iostream> #include <math.h> #include <glut.h> #define PI 3.1415926535898 #pragma comment (lib, "glut32.lib") struct Vector {float x, y;}; Vector v1, v2, v3,v4; Vector pos; float angle; struct Vec3D {float X, Y, Z;}; class Asteroid { public: void Init(int N) { int i = N / 4; int j = N % 4; A.X = -0.5+i/2; A.Y = -0.5+j/2; A.Z = 0; B.X = i/2; B.Y = -0.5+j/2; B.Z = 0; C.X = -0.5+i/2; C.Y = j/2; C.Z = 0; D.X = i/2; D.Y = j/2; D.Z = 0; dx = 0; dy = 0; dz = 0; } Vec3D A, B, C, D; float dx, dy, dz;
public: void Draw(); }; int N = 10; Asteroid AstArr[10]; //Массив астероидов //------------------------------------------------------------------------------------ void resize(int width,int height) { glViewport(0,0,width,height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(-5,5, -5,5, 2,12); gluLookAt( 0,0,5, 0,0,0, 0,1,0 ); glMatrixMode( GL_MODELVIEW ); } //------------------------------------------------------------------------------------ Vector Rotate(Vector v,float a) // функция вращения вектора на угол а. { Vector r; a = a * (PI/180.0); r.x = (v.x*cos(a)) + (v.y*sin(a)); r.y = (v.x*-sin(a)) + (v.y*cos(a)); return r; } //------------------------------------------------------------------------------------ void init() // Задаем установки прогы { v1.x = 0.3; v1.y = 0.3; // записываем статичиские кординаты фигуры v2.x =-0.08; v2.y = 0.08; v4.x = 0.08; v4.y =-0.08; } void Asteroid::Draw() { glBegin(GL_QUADS); glColor3ub(255,255,255); glVertex3f(A.X, A.Y, A.Z); // Слева вверху glVertex3f(B.X, B.Y, B.Z); // Справа вверху glVertex3f(C.X, C.Y, C.Z); // Справа внизу glVertex3f(D.X, D.Y, D.Z); // Слева внизу glEnd(); } //------------------------------------------------------------------------------------ void display(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glLoadIdentity(); for (int i = 0; i < N; i++) { glLoadIdentity(); glTranslatef(AstArr[i].dx, AstArr[i].dy, AstArr[i].dz); AstArr[i].Draw(); } glLoadIdentity(); if(GetAsyncKeyState(VK_LEFT)) angle -= 0.7; // Кнопки Влево и вправо крутят фигуру! if(GetAsyncKeyState(VK_RIGHT)) angle += 0.7; if(GetAsyncKeyState(VK_UP)) { Vector tmp; tmp.x = 0.004; tmp.y = 0.004; tmp = Rotate(tmp, angle); pos.x += tmp.x; pos.y += tmp.y; if(pos.x > 5.1) pos.x = -5.1; if(pos.x < - 5.1) pos.x = 5.1; if(pos.y > 5.1) pos.y = -5.1; if(pos.y < - 5.1) pos.y = 5.1; } // Кнопки вверх и вниз меняют позицию фигуру! if(GetAsyncKeyState(VK_DOWN)) { Vector tmp; tmp.x = -0.003; tmp.y = -0.003; tmp = Rotate(tmp, angle); pos.x += tmp.x; pos.y += tmp.y; pos.x += tmp.x; pos.y += tmp.y; if(pos.x > 5.1) pos.x = -5.1; if(pos.x < - 5.1) pos.x = 5.1; if(pos.y > 5.1) pos.y = -5.1; if(pos.y < - 5.1) pos.y = 5.1; } Vector tv1 = Rotate(v1,angle); // создаем временой вектор для создания глобальних кординат Vector tv2 = Rotate(v2,angle); Vector tv3 = Rotate(v4,angle); glBegin(GL_TRIANGLES); glColor3ub(255,255,0); glVertex2d(tv1.x + pos.x, tv1.y + pos.y); // рисуем фигуру и добовляем позицию glVertex2d(tv2.x + pos.x, tv2.y + pos.y); glVertex2d(tv3.x + pos.x, tv3.y + pos.y); glEnd(); glutSwapBuffers(); glutPostRedisplay(); } void Timer(int value) { for (int i = 0; i < N; i++) { float Angle = rand() * PI/180; AstArr[i].dx = AstArr[i].dx + cos(Angle)-sin(Angle); AstArr[i].dy = AstArr[i].dy + sin(Angle)+cos(Angle); if (AstArr[i].dx > 5) AstArr[i].dx =4.7; if (AstArr[i].dx < -5) AstArr[i].dx =-4.7; if (AstArr[i].dy > 5) AstArr[i].dy =4.7; if (AstArr[i].dy < -5) AstArr[i].dy =-4.7; } glutPostRedisplay(); // Redraw windows glutTimerFunc(300, Timer, 0); } //------------------------------------------------------------------------------------ int main(int argc, char *argv[]) { for (int i = 0; i < N; i++) { AstArr[i].Init(i); AstArr[i].Draw(); } init(); glutInit(&argc, argv); glutInitWindowSize(800, 700); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow("FrOsT"); glutReshapeFunc(resize); glutTimerFunc(300, Timer, 0); glutDisplayFunc(display); glutMainLoop(); return 0; }
|
Буду очень благодарен Это сообщение отредактировал(а) revaldo666 - 29.7.2010, 11:17
|