close

Вход

Забыли?

вход по аккаунту

?

Додаток A

код для вставкиСкачать
// ConsoleApplication15.cpp: определяет точку входа для консольного приложения.
//
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <fstream>
#include <stdlib.h>
#include <glut.h>
#include <stdio.h>
#include <time.h>
#include <gl/GLAux.h>
#include <math.h>
#pragma comment (lib, "glaux.lib")
time_t seconds = time(NULL); // дата і час
tm* timeinfo = localtime (&seconds);
float ballX = 0.0, ballY = 0.0, ballZ = 0.5; // кординати кулі
float boardX1 = 0.0, boardY1 = 0.0, boardZ1 = 0.0; // кординати платформи 1
float boardX2 = -1.0, boardY2 = 7.0, boardZ2 = 0.0; // кординати платформи 2
float distX = 0, distY = 0, distZ = -15; // кординати камери
float angleX = 0, angleY = -45; // кут повернення миші
float step1 = 10.0, step2 = 17.0, step = 14.0; // шаги для визначення координат наступної платформи
float speed = 0.125; // швидкість
float lvl = 50 ; // для бонусу int level = 1; // рівень
int sec = 0, score = 0; // час , рахунок
bool start = false; // початок
bool finish = false; // кінець
bool move; // рух
bool go=false; // змінна для визначення натикання клавіші "Insert"
float width, height; // параметри вікна , висота , ширина
float boardSize; // розмір платформи
int button; // кнопка миші (-1 - не натиснутa, 0 - ліва, 2 - права)
float mouseX, mouseY; // кординаты мышки
float jump , babax=4.5 ; // змінна для визначення довжини стрибка
float axe=0.0885; // оптимальна швидкість руху камери bool stage1=false; // змінна для визначення поточного рівня
bool stage2=false; // змінна для визначення поточного рівня
int Zoom=0; // приближення і віддалення камери
int WinWid=950; // довжина вікна
int WinHeig=600; // ширина вікна
float col=50; // розмір ігрового простору
GLuint textures[7]; // масив для збереження тестур
AUX_RGBImageRec *BoardStage1;
AUX_RGBImageRec *BallStage1;
AUX_RGBImageRec *BoardStage2;
AUX_RGBImageRec *BallStage2;
AUX_RGBImageRec *FonS1;
AUX_RGBImageRec *FonS2;
AUX_RGBImageRec *MENU;
const float shininess = 64;
// Функція для завантаження текстур void LoadTextures() {
BoardStage1=auxDIBImageLoadA("C:/Data/imgBallW.bmp"); // завантажуємо текструр та зображуємо її як набір кольорів
BallStage1=auxDIBImageLoadA("C:/Data/wood.bmp");
BoardStage2=auxDIBImageLoadA("C:/Data/imgBm.bmp");
BallStage2=auxDIBImageLoadA("C:/Data/metal.bmp");
FonS1=auxDIBImageLoadA("C:/Data/sky3.bmp");
FonS2=auxDIBImageLoadA("C:/Data/fire2.bmp");
MENU=auxDIBImageLoadA("C:/Data/MENU.bmp");
glGenTextures(7,textures); // кількість текстру і місце де вони будуть зберігатися
glPixelStorei( GL_UNPACK_ALIGNMENT, 0); // команда яка задає спосіб збереження пікселей текстур в пам'яті в запакованому чи розпакованому видах (розпакований)
glBindTexture(GL_TEXTURE_2D,textures[0]); // показуємо з якою текстурою ми працюватимемо
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // визначає функцію зменшення текстури
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // визначає функцію збільшення текстури
glTexImage2D(GL_TEXTURE_2D,0,3,BoardStage1->sizeX,BoardStage1->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,BoardStage1->data); // визначає розміри текстури і визначає ссилкуна мисив пікселей в RGBA
glBindTexture(GL_TEXTURE_2D,textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,BallStage1->sizeX,BallStage1->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,BallStage1->data);
glBindTexture(GL_TEXTURE_2D,textures[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,BoardStage2->sizeX,BoardStage2->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,BoardStage2->data);
glBindTexture(GL_TEXTURE_2D,textures[3]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,BallStage2->sizeX,BallStage2->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,BallStage2->data);
glBindTexture(GL_TEXTURE_2D,textures[4]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,FonS1->sizeX,FonS1->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,FonS1->data);
glBindTexture(GL_TEXTURE_2D,textures[5]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,FonS2->sizeX,FonS2->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,FonS2->data);
glBindTexture(GL_TEXTURE_2D,textures[6]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,3,MENU->sizeX,MENU->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,MENU->data);
} // Функція для відображення текстур при рендерінгу void Initialize1()
{
LoadTextures(); // викликаємо функцію завантаження текстур
glEnable(GL_TEXTURE_2D); // вказуємо що текстура 2Д
glClearColor(0,0,0,1);
glMatrixMode(GL_PROJECTION); // вкахуємо що будемо працювати з проєктом а не переглядом (modelview) glOrtho(-width,width,-height,height,-200,200); //
}
// Функція для встановлення позиції тексту
void drawString(void *font, const char* sz, float x, float y)
{
if (!sz)
return;
glRasterPos2f(x, y); // встановлення позиції тексту
while(*sz) { glutBitmapCharacter(font, *sz); sz++; } // рядок выводиться посимвольно
}
// Функція малювання платформ для 1 рівня
void parallelepiped()
{
float boardSize = 10; // визначаємо розмір платформи
glEnable(GL_TEXTURE_2D); // вмикаємо текстуру
glBindTexture(GL_TEXTURE_2D, textures[0]); // вказуємо з якою будемо працювати (текстурою)
glBegin(GL_QUAD_STRIP); // glBegin , glEnd - обмежують групу вершин і представляють їх в виді відповідного примітиву. GL_QUAD_STRIP - малюється група з'єднаних чотирикутників
//грань 1 || YZ, x<0
glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(1 ,0 ) ; glVertex3f(0,0, 0);
glTexCoord2f(0 ,1) ;glVertex3f(0, boardSize,-1);
glTexCoord2f(1,1) ;glVertex3f(0, boardSize, 0);
//грань 2 || ZX, y>0
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0 , 0) ;glVertex3f( 1, boardSize,-1);
glTexCoord2f(0 , 1) ;glVertex3f( 1, boardSize, 0);
//грань 3 || YZ, x>0
glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(1 , 0) ;glVertex3f( 1,0,-1);
glTexCoord2f(1 , 1) ;glVertex3f( 1,0, 0);
//грань 4 || ZX y<0
glNormal3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(0 , 1) ;glVertex3f(0,0, 0);
glEnd(); //
glBegin(GL_QUADS); // GL_QUADS - кожні чотири вершини визначають чотирикутник
//грань 5 || YX, z>0
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0, 0);
glTexCoord2f(1 , 0) ;glVertex3f(0, boardSize, 0);
glTexCoord2f(1 , 1) ;glVertex3f( 1, boardSize, 0);
glTexCoord2f(0 , 1) ;glVertex3f( 1,0, 0);
//грань 6 || YX, z<0
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(0 , 1) ;glVertex3f(0, boardSize,-1);
glTexCoord2f(1 , 1) ;glVertex3f( 1, boardSize,-1);
glTexCoord2f(1 , 0) ;glVertex3f( 1,0,-1);
glEnd();
glBegin(GL_QUAD_STRIP);
// препядствие
glNormal3f(0.0f, 0.0f, 0.0f);
glVertex3f(0,5, 0);
glVertex3f(1, 5, 0);
glVertex3f( 0, 5, 1.5);
glVertex3f( 1,5, 1.5);
glEnd();
glDisable(GL_TEXTURE_2D); // вимикаємо текстуру
}
// Функція малювання платформ для 2 рівня
void parallelepiped1()
{
float boardSize = 10;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[2]);
glBegin(GL_QUAD_STRIP);
//грань 1 || YZ, x<0
glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(1 ,0 ) ; glVertex3f(0,0, 0);
glTexCoord2f(0 ,1) ;glVertex3f(0, boardSize,-1);
glTexCoord2f(1,1) ;glVertex3f(0, boardSize, 0);
//грань 2 || ZX, y>0
glNormal3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0 , 0) ;glVertex3f( 1, boardSize,-1);
glTexCoord2f(0 , 1) ;glVertex3f( 1, boardSize, 0);
//грань 3 || YZ, x>0
glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(1 , 0) ;glVertex3f( 1,0,-1);
glTexCoord2f(1 , 1) ;glVertex3f( 1,0, 0);
//грань 4 || ZX y<0
glNormal3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(0 , 1) ;glVertex3f(0,0, 0);
glEnd();
glBegin(GL_QUADS);
//грань 5 || YX, z>0
glNormal3f(0.0f, 0.0f, 1.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0, 0);
glTexCoord2f(1 , 0) ;glVertex3f(0, boardSize, 0);
glTexCoord2f(1 , 1) ;glVertex3f( 1, boardSize, 0);
glTexCoord2f(0 , 1) ;glVertex3f( 1,0, 0);
//грань 6 || YX, z<0
glNormal3f(0.0f, 0.0f, -1.0f);
glTexCoord2f(0 , 0) ;glVertex3f(0,0,-1);
glTexCoord2f(0 , 1) ;glVertex3f(0, boardSize,-1);
glTexCoord2f(1 , 1) ;glVertex3f( 1, boardSize,-1);
glTexCoord2f(1 , 0) ;glVertex3f( 1,0,-1);
glEnd();
glBegin(GL_QUAD_STRIP);
// препядствие
glNormal3f(0.0f, 0.0f, 0.0f);
glVertex3f(0,5, 0);
glVertex3f(1, 5, 0);
glVertex3f( 0, 5, 1.5);
glVertex3f( 1,5, 1.5);
glEnd();
glDisable(GL_TEXTURE_2D);
}
// Функція для малювання ігрового простору 1 рівня
void kube1()
{
glEnable(GL_TEXTURE_2D); // "вмикаємо тестуру неба"
glBindTexture(GL_TEXTURE_2D, textures[4]); // в масиві текстур вказуємо індекс текстури неба
glBegin(GL_QUADS); // вибір типу малювання прямокутника //верхня
glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(1,1); glVertex3f( col, col,-col); glTexCoord2f(0,1); glVertex3f(-col, col,-col); glTexCoord2f(0,0); glVertex3f(-col, col, col); glTexCoord2f(1,0); glVertex3f( col, col, col); //нижня
glTexCoord2f(1,0); glVertex3f( col,-col, col); glTexCoord2f(0,0); glVertex3f(-col,-col, col); glTexCoord2f(0,1); glVertex3f(-col,-col,-col); glTexCoord2f(1,1); glVertex3f( col,-col,-col); //передня
glTexCoord2f(1,1);glVertex3f( col, col, col); glTexCoord2f(0,1);glVertex3f(-col, col, col); glTexCoord2f(0,0); glVertex3f(-col,-col, col); glTexCoord2f(1,0);glVertex3f( col,-col, col); //задня
glTexCoord2f(1,0);glVertex3f( col,-col,-col); glTexCoord2f(0,0);glVertex3f(-col,-col,-col); glTexCoord2f(0,1);glVertex3f(-col, col,-col); glTexCoord2f(1,1);glVertex3f( col, col,-col); //ліва
glTexCoord2f(0,1);glVertex3f(-col, col, col); glTexCoord2f(1,1);glVertex3f(-col, col,-col); glTexCoord2f(1,0);glVertex3f(-col,-col,-col); glTexCoord2f(0,0);glVertex3f(-col,-col, col); //права
glTexCoord2f(1,1);glVertex3f( col, col,-col); glTexCoord2f(0,1);glVertex3f( col, col, col); glTexCoord2f(0,0);glVertex3f( col,-col, col); glTexCoord2f(1,0);glVertex3f( col,-col,-col); glEnd(); glDisable(GL_TEXTURE_2D); // "вимикаємо тестуру неба"
}
// Функція для малювання ігрового простору 2 рівня
void kube2()
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[5]);
glBegin(GL_QUADS); //верхня
glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(1,1); glVertex3f( col, col,-col); glTexCoord2f(0,1); glVertex3f(-col, col,-col); glTexCoord2f(0,0); glVertex3f(-col, col, col); glTexCoord2f(1,0); glVertex3f( col, col, col); //нижня
glTexCoord2f(1,0); glVertex3f( col,-col, col); glTexCoord2f(0,0); glVertex3f(-col,-col, col); glTexCoord2f(0,1); glVertex3f(-col,-col,-col); glTexCoord2f(1,1); glVertex3f( col,-col,-col); //передня
glTexCoord2f(1,1);glVertex3f( col, col, col); glTexCoord2f(0,1);glVertex3f(-col, col, col); glTexCoord2f(0,0); glVertex3f(-col,-col, col); glTexCoord2f(1,0);glVertex3f( col,-col, col); //задня
glTexCoord2f(1,0);glVertex3f( col,-col,-col); glTexCoord2f(0,0);glVertex3f(-col,-col,-col); glTexCoord2f(0,1);glVertex3f(-col, col,-col); glTexCoord2f(1,1);glVertex3f( col, col,-col); //ліва
glTexCoord2f(0,1);glVertex3f(-col, col, col); glTexCoord2f(1,1);glVertex3f(-col, col,-col); glTexCoord2f(1,0);glVertex3f(-col,-col,-col); glTexCoord2f(0,0);glVertex3f(-col,-col, col); //права
glTexCoord2f(1,1);glVertex3f( col, col,-col); glTexCoord2f(0,1);glVertex3f( col, col, col); glTexCoord2f(0,0);glVertex3f( col,-col, col); glTexCoord2f(1,0);glVertex3f( col,-col,-col); glEnd(); glDisable(GL_TEXTURE_2D);
}
// Функція для рестарту
void Initialize()
{
// Встановлюємо початкові значення змінних
ballX = 0.0, ballY = 0.0, ballZ = 0.5;
boardX1 = 0.0, boardY1 = 0.0, boardZ1 = 0.0;
boardX2 = -1.0, boardY2 = 7.0, boardZ2 = 0.0;
distX = 0, distY = 0, distZ = -13.9;
angleX = 0, angleY = -45;
step1 = 10.0, step2 = 17.0, step = 14.0;
speed = 0.125;
lvl = 50, level = 1;
sec = 0, score = 0;
start = false;
finish = false;
jump=0;
babax=4.5;
axe=0.089;
Zoom=0;
}
// Функція для руху кулі та зміни положення 2 платформи відносно 1 (1 рівня)
void moveBall_Stage1()
{
if (start)
{
// умова для коректного стрибка
if (ballY==jump+3)
{
ballZ=0.5;
}
// умова зіткнення з перешкодою
if (ballY==babax+1)
{
babax+=7;
}
// при початку руху змінюємо кординату по у та рухаємо камеру
if (move)
{
ballY +=speed;
distZ +=axe;
distY -=axe;
}
// умова поразки
if ((ballX == boardX2 && ballY < boardY2) || (ballX == boardX1 && ballY < boardY1) || ballX > 1 || ballX < -1 || ballX == -boardX2 || (ballY>=babax && ballZ<=1.5 && ballY<babax+1) )
{
ballZ += 0.25;
finish = true;
move = false;
}
// умова зміни швидкості кулі та камери при зміні рівня
if (ballY == lvl && level < 4)
{
speed *= 2;
axe*=2;
lvl += 50 + lvl;
level++;
}
// Рух платформи №1
if (ballY == step1)
{
boardY1 += step;
step1 += step;
}
// Рух платформи №2
if (ballY == step2)
{
srand (time(NULL));
int rand1 = rand()%2+1;
if (rand1 == 1)
{
boardX2 = 1;
boardY2 += step;
step2 += step;
}
if (rand1 == 2)
{
boardX2 = -1;
boardY2 += step;
step2 += step;
}
}
}
}
// Функція для руху кулі та зміни положення 2 платформи відносно 1 (2 рівня)
void moveBall_Stage2()
{
if (start)
{
if (ballY==jump+1.5)
{
ballZ=0.5;
}
if (ballY==babax+1)
{
babax+=7;
}
if (move)
{
ballY +=(speed/2);
distZ +=(axe/2);
distY -=(axe/2);
}
if ((ballX == boardX2 && ballY < boardY2) || (ballX == boardX1 && ballY < boardY1) || ballX > 1 || ballX < -1 || ballX == -boardX2 || (ballY>=babax && ballZ<=1.5 && ballY<babax+1) )
{
ballZ += 0.25;
finish = true;
move = false;
}
if (ballY == lvl && level < 5)
{
speed *= 2;
axe*=2;
lvl += 50 + lvl;
level++;
}
if (ballY == step1)
{
boardY1 += step;
step1 += step;
}
if (ballY == step2)
{
srand (time(NULL));
int rand1 = rand()%2+1;
if (rand1 == 1)
{
boardX2 = 1;
boardY2 += step;
step2 += step;
}
if (rand1 == 2)
{
boardX2 = -1;
boardY2 += step;
step2 += step;
}
}
}
}
// Функція для малювання (1 рівня)
void on_paint_Stage1()
{
moveBall_Stage1(); // викликаємо функцію руху кулі
kube1(); // викликаємо функцію малювання ігрового простору
char sz[128];
if (finish)
sprintf(sz, "You lose. Time: %d Score: %d F2 - Restart game Esc - Exit", sec, score);
else
sprintf(sz, "F2 - Restart game Esc - Exit Level: %d Time: %d Score: %d Speed: %f Zoom: %d ",level, sec, score , speed , Zoom );
if (!go)
sprintf(sz, "******************************** Click <Insert> to GO :) *****************************");
if ( go && !start)
sprintf(sz, "F1 - Start game Esc - Exit Home - Info End - Developed Zoom: %d ", Zoom );
if (!start && !go)
{
angleX++;
angleY++;
distZ=-17;
}
glViewport(0, 0, width, height); // встановлюємо область перегляду таку, щоб вона вміщувала все вікно
// ініціалізуємо параметри матеріалів і джерела світла
float light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // колір фонового освітлення float light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // колір дифузного освітлення float light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };// колір дзеркального відображення
float light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f };// розташування джерела світла
// встановлюємо параметри джерела світла glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// очищуємо буфери
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); // вмикаємо режим роботи з матрицею проекцій glLoadIdentity(); // Cчитывает текущую матрицу.
// задаємо усічений конус видимості в лівосторонній системі координат, // 60 - кут видимості в градусах по осі у,
// width/height - кут видимості уздовж осі x,
// 1 и 100 - відстань від спостерігача до площин відсікання по глибині.
gluPerspective(60, width/height, 1, 100);
// вмикаємо режим роботи з видовою матрицею
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // зчитуємо поточну матрицю
glTranslatef(distX, distY, distZ); // камера з початку координат зсувається на distZ, glRotatef(angleX, 0.0f, 1.0f, 0.0f); // потім повертається по осі Oy
glRotatef(angleY, 1.0f, 0.0f, 0.0f); // потім повертається по осі Ox
glEnable(GL_DEPTH_TEST); // вмикаємо буфер глибини (для відсікання невидимих частин зображення)
// вмикаємо режим для установки освітлення
glEnable(GL_LIGHTING);
// додаємо джерело світла № 0 (їх може бути до 8), зараз воно світить з "очей"
glEnable(GL_LIGHT0);
// блок №1
glPushMatrix(); // команда яка дозволяє запам'ятати поточну матрицю
glTranslatef( boardX1, boardY1, boardZ1 ); // рухаємо платформу по відповідним кординатам
parallelepiped();
glPopMatrix(); // команда яка дозволяє відновити поточну матрицю
// блок №2
glPushMatrix();
glTranslatef( boardX2, boardY2, boardZ2 );
parallelepiped();
glPopMatrix();
// відображаємо cферу
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTranslatef( 0.5 + ballX, ballY, ballZ );
glutSolidSphere (0.5f, 20, 20);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
// куб glPushMatrix();
glTranslatef( 0, ballY, 0 );
kube1();
glPopMatrix();
// вимикаємо джерела glDisable(GL_LIGHT0);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glPushMatrix(); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glOrtho(0,1, 0,1, -1, 1);// для відображення тексту, краще використовувати ортографічню проекцію
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 0); // зробимо текст жовтеньким
drawString(GLUT_BITMAP_TIMES_ROMAN_24, sz, 0.01, 0.95); //
glPopMatrix();
// показуємо вікно
glutSwapBuffers();
}
// Функція для малювання (2 рівня)
void on_paint_Stage2()
{
moveBall_Stage2();
kube2();
char sz[128];
if (finish)
sprintf(sz, "You lose. Time: %d Score: %d F2 - Restart game Esc - Exit", sec, score);
else
sprintf(sz, "F2 - Restart game Esc - Exit Level: %d Time: %d Score: %d Speed: %f Zoom: %i ",level, sec, score , (speed/2) , Zoom);
if (!go)
sprintf(sz, "******************************** Click <Insert> to GO :) *****************************");
if ( go && !start)
sprintf(sz, "F1 - Start game Esc - Exit Home - Info End - Developed Zoom: %d ", Zoom );
if (!start && !go)
{
angleX++;
angleY++;
distZ=-17;
}
// Встановлюємо область перегляду таку, щоб вона вміщувала все вікно:
glViewport(0, 0, width, height);
// Ініціалізуємо параметри матеріалів і джерела світла
float light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; // колір фонового освітлення float light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; // колір дифузного освітлення float light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };// колір дзеркального відображення
float light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f };// розташування джерела світла
// Встановлюємо параметри джерела світла glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
// Визначаємо блакитний колір для очищення:
glClearColor(0, 0.25, 0.25, 0);
// Очищуємо буфери:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); // включаємо режим роботи з матрицею проекцій glLoadIdentity(); // Cчитывает текущую матрицу.
// Задаємо усічений конус видимості в лівосторонній системі координат, // 60 - кут видимості в градусах по осі у,
// width/height - кут видимості уздовж осі x,
// 1 и 100 - відстань від спостерігача до площин відсікання по глибині.
gluPerspective(60, width/height, 1, 100);
//gluLookAt (30, 10, 10, 0, 0, 0, 0, 10, 0);// Настройка перспективы просмотра
// Включаємо режим роботи з видовою матрицею:
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Cчитывает текущую матрицу.
glTranslatef(distX, distY, distZ);// камера з початку координат зсувається на distZ, glRotatef(angleX, 0.0f, 1.0f, 0.0f); // потім повертається по осі Oy
glRotatef(angleY, 1.0f, 0.0f, 0.0f); // потім повертається по осі Ox
glEnable(GL_DEPTH_TEST);// включаємо буфер глибини (для відсікання невидимих частин зображення)
// Включаємо режим для установки освітлення:
glEnable(GL_LIGHTING);
// Додаємо джерело світла № 0 (їх може бути до 8), зараз воно світить з "очей":
glEnable(GL_LIGHT0);
boardSize = 10;
//Блок №1
glPushMatrix();
glTranslatef( boardX1, boardY1, boardZ1 );
parallelepiped1();
glPopMatrix();
//Блок №2
glPushMatrix();
glTranslatef( boardX2, boardY2, boardZ2 );
parallelepiped1();
glPopMatrix();
// відображаємо cферу
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[3]);
glTranslatef( 0.5 + ballX, ballY, ballZ );
glutSolidSphere (0.5f, 20, 20);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
//Куб лево
glPushMatrix();
glTranslatef( 0, ballY, 0 );
//glTranslatef( boardX1, boardY1, boardZ1 );
kube2();
glPopMatrix();
glDisable(GL_LIGHT0);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0,1, 0,1, -1, 1);// для відображення тексту, краще використовувати ортографічню проекцію
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 0); // зробимо текст жовтеньким
drawString(GLUT_BITMAP_TIMES_ROMAN_24, sz, 0.01, 0.95);
glPopMatrix();
// показуємо вікно:
glutSwapBuffers();
}
// Функція опису команд які буде виконувати контекстне меню
void MenuChek(int v)
{
switch (v)
{
case 0 : if(go && start)break; stage1=true; stage2=false; break;
case 1 : if(go && start)break; stage2=true; stage1=false; break;
case 2 : if (stage1==true || stage2==true)
{
if (go && !start)
{
start = true, move = true; break;
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
} ; }
else
{
MessageBoxA(NULL , "Выберите режим игры!!! " , ":)" , MB_OK );
}
case 3 : Initialize(); break;
case 4 : if(stage1==true || stage2==true)
{
if (go && !start && stage1==true)
{
MessageBoxA(NULL, "Вы выбрали режим woodlevel!!\n В этом режиме скорость шарика больше чем в режиме metal , расстояние прыжка увеличено , скорость увеличена , начисление очков в 2 раза больше чем в metal", "Info" , MB_OK ) ; break;
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
if (go && !start && stage2==true)
{
MessageBoxA(NULL, "Вы выбрали режим metal level!!\n В этом режиме скорость шарика в 2 раза меньше чем в режиме wood , расстояние прыжка уменьшено , скорость уменьшена , начисление очков в 2 раза меньше чем в wood", "Info" , MB_OK ) ; break;
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
}
else
{
MessageBoxA(NULL , "Выберите режим игры!!! " , ":)" , MB_OK );
}
case 5 : if(stage1==true || stage2==true)
{
if (go && !start)
{
MessageBoxA(NULL, "Разработал программу \nстудент 2 курса \nгрупы СУА-12 \nГук Дмитрий " , "Develoed" , MB_OK );
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
}
else
{
MessageBoxA(NULL , "Выберите режим игры!!! " , ":)" , MB_OK );
}
case 6 :
if(stage1==true || stage2==true)
{
go=true , Initialize(); break;
}
else
{
MessageBoxA(NULL , "Выберите режим игры!!! " , ":)" , MB_OK );
}
}
}
// Функція створення контекстного меню
void MenuInit()
{
int M=glutCreateMenu(MenuChek); // створюємо контекстне меню і передаємо до нього команди з MenuChek glutSetMenu(M); // встановлює меню M поточним
glutAddMenuEntry("Деревянный режим" , 0); // додаємо пункті меню з відповідними індексами
glutAddMenuEntry("Металический режим" , 1);
glutAddMenuEntry("Start(Старт)" , 2);
glutAddMenuEntry("Restart(Рестарт)" , 3);
glutAddMenuEntry("Info(игформация)" , 4);
glutAddMenuEntry("Developed(Разработчик)" , 5);
glutAddMenuEntry("Click Insert(Нажать инсерт)" , 6);
glutAttachMenu(GLUT_RIGHT_BUTTON); // задаємо виклик меню з правої кнопки миші
}
// Функція для відображення стартового меню (вибір рівнів)
void starte_menu()
{
glEnable(GL_TEXTURE_2D); // вмикаємо текстуру
glBindTexture(GL_TEXTURE_2D, textures[6]); // вказуємо з якою будемо працювати
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2f(0,0);glVertex2f(-1,-1); // glTexCoord - для відображення текстури , через цю команду прив'язуємо кути текстури до кутів створеного вікна
glTexCoord2f(0,1);glVertex2f(-1, 1);
glTexCoord2f(1,1);glVertex2f(1,1);
glTexCoord2f(1,0);glVertex2f(1,-1);
glEnd();
glDisable(GL_TEXTURE_2D); // вимикаємо текстуру
glutSwapBuffers(); // показуємо екран
}
// Загальна функція яка містить в собі послідовний викслик функцій малювання void draw()
{
// (з самого початку рівні не активні) викликаємо функцію яка малює початкове меню if (stage1==false && stage2==false)
{
starte_menu();
}
// якщо натисаємо кнопку яка активує 1 рівень , тоді викликаємо функцію малювання 1 рівня
if (stage1==true)
{
on_paint_Stage1();
}
// якщо натисаємо кнопку яка активує 2 рівень , тоді викликаємо функцію малювання 2 рівня
if (stage2==true)
{
on_paint_Stage2();
}
}
// Функція яка відповідає за зміну розмірів вікна glut
void on_size(int w, int h)
{
glViewport(0, 0, w, h); // встановлюємо область перегляду таку, щоб вона вміщувала все вікно
width = w;
height = h;
if (height == 0) height = 1; // запобігання ділення на нуль, якщо вікно занадто коротке
// (ви не можете зробити вікно нульовою ширини).
}
// Функція яка відповідає за спеціальні клавіші
void on_special(int key, int x, int y)
{
// Визначаємо яка клавіша за що відповідатиме
switch (key)
{
case GLUT_KEY_LEFT : if (start)if (move) ballX-=1; break; // рух вліво
case GLUT_KEY_RIGHT : if (start) if (move) ballX += 1; break; // рух вправо
case GLUT_KEY_UP: // наближення камери
if (distZ > -1.7) break;
distZ += 0.1; Zoom+=1 ; break; case GLUT_KEY_DOWN: // віддалення камери
if ( distZ < -19) break;
distZ -= 0.1; Zoom-=1;break; case GLUT_KEY_F1: // (старт) початок гри
if (go && !start)
{
start = true, move = true; break;
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
case GLUT_KEY_F2: Initialize(); break; // (рестарт) перезавантаження рівня
case GLUT_KEY_INSERT : go=true , Initialize(); break; //
case GLUT_KEY_HOME : // інформація про рівні
if (go && !start && stage1==true)
{
MessageBoxA(NULL, "Вы выбрали режим woodmode!!\n В этом режиме скорость шарика больше чем в режиме metal , расстояние прыжка увеличено , скорость увеличена , начисление очков в 2 раза больше чем в metal", "Info" , MB_OK ) ; break;
}
if(!go && !start && stage2==false)
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
if (go && !start && stage2==true)
{
MessageBoxA(NULL, "Вы выбрали режим metal of mode!!\n В этом режиме скорость шарика в 2 раза меньше чем в режиме wood , расстояние прыжка уменьшено , скорость уменьшена , начисление очков в 2 раза меньше чем в wood", "Info" , MB_OK ) ; break;
}
if(!go && start && stage2==false)
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
break;
case GLUT_KEY_END : // інформація про розробника
if (go && !start)
{
MessageBoxA(NULL, "Разработал программу \nстудент 2 курса \nгрупы СУА-12 \nГук Дмитрий " , "Develoed" , MB_OK );
}
else
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
break;
case GLUT_KEY_F10 : if(go && start)break; stage1=true; stage2=false; break; // рівень 1
case GLUT_KEY_F11 :if(go && start)break; stage2=true; stage1=false; break; // рівень 2
}
}
// Функція яка відповідає за маніпуляції мишею
void on_mouse(int button, int state, int x, int y)
{ if (state == 1)
{ // 0 - натиснули на кнопку, 1 - відпустили кнопку
button = -1; // ніяка кнопка не натиснута
angleX = 0, angleY = -30;
return;
}
//Зберігаємо поточні координати миші:
mouseX = x; mouseY = y;
button = button; // зберігаємо інформацію про кнопки
}
// Функція яка відповідає за рендерінг зображення
int tick = 0;
void on_timer(int value)
{
draw(); // Перемалюємо екран
if (stage1==true)
{
if (start)
{
tick++;
if (tick >= 40)
{
if (!finish)
{
score +=100*level;
int bonus = 50;
if (ballY == bonus)
score +=50; bonus += 50;
sec++;
tick = 0;
}
}
}
}
if (stage2==true)
{
if (start)
{
tick++;
if (tick >= 40)
{
if (!finish)
{
score +=50*level;
int bonus = 25;
if (ballY == bonus)
score +=25; bonus += 25;
sec++;
tick = 0;
}
}
}
}
glutTimerFunc(40, on_timer, 0);
}
// Функція яка відповідає за натискання клавіш з кодуванням ASCII
void on_keyboard(unsigned char key, int x, int y)
{
if (key == 27) // дії при натисканні клавіши (Esc) {
int a = MessageBoxA(NULL ,"Вы действительно хотите покинуть игру ?" , ":)" , MB_OKCANCEL | MB_ICONQUESTION );
switch (a)
{
case 1:
exit(0);
break;
case 2:
break;
}
}
if (key == 32) // дії при натисканні клавіши (пробіл)
{
if (go && start)
{
if(ballZ!=2 || ballY==jump+3.5)
{
ballZ=2;
jump=ballY;
}
}
if(!go && !start)
{
MessageBoxA(NULL , "Click Insert" , ":)" , MB_OK );
}
}
}
// Функція яка відповідає за рух мишею
void on_motion(int x, int y)
{
switch (button) {
case 0:
angleX += x - mouseX; // рух миші по х
angleY += y - mouseY; // рух миші по у
// зберігаємо поточні кординати миші
mouseX = x; mouseY = y;
break;
}
}
int main (int argc, char* argv[])
{
glutInit(&argc, argv); // ініціалізуємо GLUT
glutInitWindowSize(WinWid, WinHeig);// встановлюємо розміри вікна
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);// ініцілізуємо режими відображення
glutCreateWindow("Crazy Board"); // створюємо вікно
glutDisplayFunc(draw); // реєструємо функцію відображення
glutReshapeFunc(on_size); // реєструємо функцію обробки зміни розмірів вікна
glutKeyboardFunc(on_keyboard); // реєструємо функцію, яка відповідає за натискання клавіш
glutSpecialFunc(on_special); // реєструємо функцію, яка відповідає за натискання спеціальних клавіш
glutMotionFunc(on_motion); // реєструємо функцію, яка відповідає за переміщення миші з натиснутою кнопкою
glutMouseFunc(on_mouse) ; // реєструємо функцію, яка відповідає за натискання на кнопку миші
glutTimerFunc(40, on_timer, 0);// кожні 40 мс викликається ця функція
Initialize1(); // реєструємо завантаження текстур
MenuInit(); // ініціалізуємо контекстне меню
glutMainLoop(); // стартуємо основний цикл обробки подій return 0;
}
Документ
Категория
Разное
Просмотров
28
Размер файла
44 Кб
Теги
додаток
1/--страниц
Пожаловаться на содержимое документа