Код:
#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;
bool TestCollide();
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]; //Массив астероидов
//------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
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);
bool collide = TestCollide();
glBegin(GL_TRIANGLES);
if (collide) {
glColor3ub(255,0,0);
}
else {
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;
}