Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "glut.h"
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #include <Windows.h>
- using namespace std;
- class kostka{
- public:
- double wspx = 0;
- double wspy = 0;
- double wspz = 0;
- float transx;
- float transy;
- float granicalewa;
- float granicaprawa;
- };
- int wskaznik = 0;
- int aktualnaSpadajacaFigura = 0;
- int liczbaFormDlaKlocka = 0;
- kostka *kloce = new kostka[wskaznik];
- int flag = 0, forma = 1;
- bool ruch = true;
- float delta = 1;
- float granicadol = 90;
- void Display()
- {
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- float licznik = 0;
- GLuint listid;
- float kat = 0, ster = 0;
- float rozmiar = 10;
- float granlewo = 60, granprawo = 80;
- bool czy_stop(kostka *figura, kostka* kloce, int wskaznik){
- bool stoper = false;
- double najnizszy = 10000000;
- int najnizszyind;
- bool kolizja = false;
- float wspx1, wspy1, wspx2, wspy2;
- for (int i = 0; i < sizeof(figura); i++){
- if (figura[i].wspy < najnizszy){
- najnizszy = figura[i].wspy;
- najnizszyind = i;
- }
- }
- //cout << "Wynik wynosi: " << abs(figura[najnizszyind].wspy - (figura[najnizszyind].wspy + figura[najnizszyind].transy)) << endl;
- //cout << "Wynik wynosi: " << figura[najnizszyind].transy << endl;
- for (int i = 0; i < 4; i++){
- for (int j = 0; j < wskaznik; j++){
- wspx1 = figura[i].wspx + figura[i].transx;
- wspy1 = figura[i].wspy - figura[i].transy;
- wspx2 = kloce[j].wspx + kloce[j].transx;
- wspy2 = kloce[j].wspy - kloce[j].transy;
- if (wspx1 == wspx2 && (wspy1 - 20) == wspy2) { kolizja = true; }
- //cout << i<<":" <<j << ".Porownanie figur: " << wspx1 << ":" << wspx2<< endl;
- //cout << i << ":" << j << ".Porownanie figur: " << wspy1 << ":" << wspy2 << endl;
- //Sleep(100);
- }
- }
- if (kolizja == true){
- cout << "Warunek kolizji" << endl;
- stoper = true;
- }
- else if (figura[najnizszyind].transy == granicadol){
- cout << "Warunek spelniony" << endl;
- stoper = true;
- }
- return stoper;
- }
- int kolizja_boczna(kostka* figura, kostka* kloce, float ster, float licznik){
- int kolizja = 0;
- if (figura[0].granicalewa - ster >= granlewo){
- cout << "Wystapienie kolizji z lewej strony" << endl;
- kolizja = 1;
- }
- else if (figura[0].granicaprawa + ster > granprawo){
- cout << "Wystapienie kolizji z prawej strony" << endl;
- kolizja = 2;
- }
- else kolizja = 0;
- for (int i = 0; i < 4; i++){
- for (int j = 0; j < wskaznik; j++){
- //cout << "Roznica granic: " << figura[i].wspx << ":" << kloce[j].wspx + kloce[j].transx << endl;
- if (figura[i].wspx + ster == kloce[j].wspx + kloce[j].transx && figura[i].wspy - licznik < (kloce[j].wspy - kloce[j].transy) + (rozmiar * 2)){
- cout << "Wystapienie kolizji z lewej strony" << endl;
- kolizja = 1;
- }
- }
- }
- return kolizja;
- }
- void wyznacz_granx(kostka *figura){
- float lewo = 10000, prawo = -10000;
- for (int i = 0; i < 4; i++){
- if (figura[i].wspx < lewo){
- lewo = figura[i].wspx;
- figura[i].granicalewa = lewo;
- }
- if (figura[i].wspx > prawo){
- prawo = figura[i].wspx;
- figura[i].granicaprawa = prawo;
- }
- }
- for (int i = 0; i < 4; i++){
- figura[i].granicalewa = lewo;
- figura[i].granicaprawa = prawo;
- }
- }
- void rysujFigureI(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = 0;
- figura[0].wspy = 60;
- figura[1].wspx = 0;
- figura[1].wspy = 40;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }
- if (forma == 2){
- figura[0].wspx = -20;
- figura[0].wspy = 0;
- figura[1].wspx = 0;
- figura[1].wspy = 0;
- figura[2].wspx = 20;
- figura[2].wspy = 0;
- figura[3].wspx = 40;
- figura[3].wspy = 0;
- }
- }
- // dlugas ---> S
- void rysujFigureZ(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 20;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 0;
- figura[3].wspx = 20;
- figura[3].wspy = 0;
- }
- if (forma == 2){
- figura[0].wspx = 0;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = -20;
- figura[2].wspy = 20;
- figura[3].wspx = -20;
- figura[3].wspy = 0;
- }
- }
- // dlugas ---> Z
- void rysujFigureS(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 40;
- figura[1].wspx = -20;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }
- if (forma == 2){
- figura[0].wspx = -20;
- figura[0].wspy = 0;
- figura[1].wspx = 0;
- figura[1].wspy = 0;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 20;
- figura[3].wspy = 20;
- }
- }
- void rysujFigureL(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 0;
- figura[1].wspx = -20;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 20;
- figura[3].wspy = 20;
- }
- if (forma == 2){
- figura[0].wspx = -20;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 40;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }if (forma == 3){
- figura[0].wspx = -20;
- figura[0].wspy = 20;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 20;
- figura[2].wspy = 20;
- figura[3].wspx = 20;
- figura[3].wspy = 40;
- }if (forma == 4){
- figura[0].wspx = -20;
- figura[0].wspy = 40;
- figura[1].wspx = -20;
- figura[1].wspy = 20;
- figura[2].wspx = -20;
- figura[2].wspy = 0;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }
- }
- void rysujFigureJ(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 40;
- figura[2].wspx = 20;
- figura[2].wspy = 40;
- figura[3].wspx = 20;
- figura[3].wspy = 20;
- }
- if (forma == 2){
- figura[0].wspx = 0;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 0;
- figura[3].wspx = -20;
- figura[3].wspy = 0;
- }if (forma == 3){
- figura[0].wspx = 20;
- figura[0].wspy = 0;
- figura[1].wspx = 0;
- figura[1].wspy = 0;
- figura[2].wspx = -20;
- figura[2].wspy = 0;
- figura[3].wspx = -20;
- figura[3].wspy = 20;
- }if (forma == 4){
- figura[0].wspx = -20;
- figura[0].wspy = 0;
- figura[1].wspx = -20;
- figura[1].wspy = 20;
- figura[2].wspx = -20;
- figura[2].wspy = 40;
- figura[3].wspx = 0;
- figura[3].wspy = 40;
- }
- }
- void rysujFigureT(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 20;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 20;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 40;
- }
- if (forma == 2){
- figura[0].wspx = 0;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 0;
- figura[3].wspx = 20;
- figura[3].wspy = 20;
- }if (forma == 3){
- figura[0].wspx = -20;
- figura[0].wspy = 20;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 20;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }if (forma == 4){
- figura[0].wspx = 0;
- figura[0].wspy = 40;
- figura[1].wspx = 0;
- figura[1].wspy = 20;
- figura[2].wspx = 0;
- figura[2].wspy = 0;
- figura[3].wspx = -20;
- figura[3].wspy = 20;
- }
- }
- void rysujFigureO(kostka* figura, int forma){
- if (forma == 1){
- figura[0].wspx = -20;
- figura[0].wspy = 20;
- figura[1].wspx = -20;
- figura[1].wspy = 00;
- figura[2].wspx = 0;
- figura[2].wspy = 20;
- figura[3].wspx = 0;
- figura[3].wspy = 0;
- }
- }
- int losujKtoraFigureWygenerowac(int min, int max, int licznik){
- //cout << "LICZNIK: " << licznik << endl;
- if (licznik == 0){
- int x = min + rand() % max - min;
- licznik++;
- //cout << "LICZNIK IF: " << licznik << endl;
- return x;
- }
- }
- void rysujOdpowiedniegoKlocka(bool mRuch, kostka *mFigura){
- cout << "Wchodze do pyntli " << aktualnaSpadajacaFigura << endl;
- if (mRuch == true){
- switch (aktualnaSpadajacaFigura){
- case 0:
- rysujFigureI(mFigura, forma);
- break;
- case 1:
- rysujFigureS(mFigura, forma);
- break;
- case 2:
- rysujFigureZ(mFigura, forma);
- break;
- case 3:
- rysujFigureJ(mFigura, forma);
- break;
- case 4:
- rysujFigureL(mFigura, forma);
- break;
- case 5:
- rysujFigureT(mFigura, forma);
- break;
- case 6:
- rysujFigureO(mFigura, forma);
- break;
- }
- }
- }
- void upKeyControl(){
- // klocek I
- if (aktualnaSpadajacaFigura == 0){
- liczbaFormDlaKlocka = 2;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }
- // klocek Z
- if (aktualnaSpadajacaFigura == 1){
- liczbaFormDlaKlocka = 2;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }
- // klocek S
- if (aktualnaSpadajacaFigura == 2){
- liczbaFormDlaKlocka = 2;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }
- // klocek L
- if (aktualnaSpadajacaFigura == 3){
- liczbaFormDlaKlocka = 4;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }
- // klocek J
- if (aktualnaSpadajacaFigura == 4){
- liczbaFormDlaKlocka = 4;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }// klocek T
- if (aktualnaSpadajacaFigura == 5){
- liczbaFormDlaKlocka = 4;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }// klocek O
- if (aktualnaSpadajacaFigura == 6){
- liczbaFormDlaKlocka = 1;
- forma = forma + 1;
- if (forma > liczbaFormDlaKlocka){
- forma = 1;
- }
- }
- cout << "forma wynosi: " << forma << endl;
- }
- void szescian(float x, float y){
- glColor3f(1.0, 0.0, 0.0);
- glBegin(GL_LINE_LOOP);
- glVertex3f(x + rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, rozmiar);
- glVertex3f(x + rozmiar, y - rozmiar, rozmiar);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(x + rozmiar, y + rozmiar, -rozmiar);
- glVertex3f(x - rozmiar, y + rozmiar, -rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, -rozmiar);
- glVertex3f(x + rozmiar, y - rozmiar, -rozmiar);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(x + rozmiar, y - rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, -rozmiar);
- glVertex3f(x + rozmiar, y - rozmiar, -rozmiar);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(x + rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y + rozmiar, -rozmiar);
- glVertex3f(x + rozmiar, y + rozmiar, -rozmiar);
- glEnd();
- //
- glColor3f(0.0, 1.0, 0.0);
- glBegin(GL_LINE_LOOP);
- glVertex3f(x - rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, rozmiar);
- glVertex3f(x - rozmiar, y - rozmiar, -rozmiar);
- glVertex3f(x - rozmiar, y + rozmiar, -rozmiar);
- glEnd();
- glBegin(GL_LINE_LOOP);
- glVertex3f(x + rozmiar, y + rozmiar, rozmiar);
- glVertex3f(x + rozmiar, y - rozmiar, rozmiar);
- glVertex3f(x + rozmiar, y - rozmiar, -rozmiar);
- glVertex3f(x + rozmiar, y + rozmiar, -rozmiar);
- glEnd();
- }
- void Rysuj()
- {
- int kolizja = -1;
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- // czyszczenie bufora koloru
- glClearColor(1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glScalef(0.01, 0.01, 0.01);
- //cout << "Licznik wynosi: " << licznik << endl;
- kostka *figura = new kostka[4];
- //aktualnaSpadajacaFigura = 5;
- rysujOdpowiedniegoKlocka(ruch, figura);
- //figuraO(figura, forma);
- //FUNKCJA DO DODANIA!
- wyznacz_granx(figura);
- if (ruch == true){
- licznik = licznik + delta;
- glPushMatrix();
- //DODAC OBSLUGE KOLIZJI
- kolizja = kolizja_boczna(figura, kloce, ster, licznik);
- if (kolizja == 0) glTranslatef(ster, -licznik, 0);
- else if (kolizja == 1) {
- ster = ster + (rozmiar * 2);
- glTranslatef(ster, -licznik, 0);
- }
- else if (kolizja == 2) {
- ster = ster - (rozmiar * 2);
- glTranslatef(ster, -licznik, 0);
- }
- //glRotatef(kat, 0, 0, 1);
- //glScalef(0.1, 0.1, 0.1);
- szescian(figura[0].wspx, figura[0].wspy);
- szescian(figura[1].wspx, figura[1].wspy);
- szescian(figura[2].wspx, figura[2].wspy);
- szescian(figura[3].wspx, figura[3].wspy);
- // cout << "Wspolrzedne figury wynosza: x:" << figura[0].wspx+ster << " y:" << figura[0].wspy-licznik << endl;
- glPopMatrix();
- figura[0].transx = ster;
- figura[0].transy = licznik;
- figura[1].transx = ster;
- figura[1].transy = licznik;
- figura[2].transx = ster;
- figura[2].transy = licznik;
- figura[3].transx = ster;
- figura[3].transy = licznik;
- if (czy_stop(figura, kloce, wskaznik) == true){
- //ZWIEKSZENIE GLOBALNEJ TABLICY KLOCY
- kostka* klocetemp = new kostka[wskaznik + 4];
- for (int i = 0; i < wskaznik; i++){
- klocetemp[i].wspx = kloce[i].wspx;
- klocetemp[i].wspy = kloce[i].wspy;
- klocetemp[i].transx = kloce[i].transx;
- klocetemp[i].transy = kloce[i].transy;
- klocetemp[i].granicalewa = kloce[i].granicalewa;
- klocetemp[i].granicaprawa = kloce[i].granicaprawa;
- //PODODAWAC GRANICE!!!!
- }
- klocetemp[wskaznik].wspx = figura[0].wspx;
- klocetemp[wskaznik].wspy = figura[0].wspy;
- klocetemp[wskaznik].transx = ster;
- klocetemp[wskaznik].transy = licznik;
- klocetemp[wskaznik].granicalewa = figura[0].granicalewa;
- klocetemp[wskaznik].granicaprawa = figura[0].granicaprawa;
- klocetemp[wskaznik + 1].wspx = figura[1].wspx;
- klocetemp[wskaznik + 1].wspy = figura[1].wspy;
- klocetemp[wskaznik + 1].transx = ster;
- klocetemp[wskaznik + 1].transy = licznik;
- klocetemp[wskaznik + 1].granicalewa = figura[1].granicalewa;
- klocetemp[wskaznik + 1].granicaprawa = figura[1].granicaprawa;
- klocetemp[wskaznik + 2].wspx = figura[2].wspx;
- klocetemp[wskaznik + 2].wspy = figura[2].wspy;
- klocetemp[wskaznik + 2].transx = ster;
- klocetemp[wskaznik + 2].transy = licznik;
- klocetemp[wskaznik + 2].granicalewa = figura[2].granicalewa;
- klocetemp[wskaznik + 2].granicaprawa = figura[2].granicaprawa;
- klocetemp[wskaznik + 3].wspx = figura[3].wspx;
- klocetemp[wskaznik + 3].wspy = figura[3].wspy;
- klocetemp[wskaznik + 3].transx = ster;
- klocetemp[wskaznik + 3].transy = licznik;
- klocetemp[wskaznik + 3].granicalewa = figura[3].granicalewa;
- klocetemp[wskaznik + 3].granicaprawa = figura[3].granicaprawa;
- delete[] kloce;
- wskaznik = wskaznik + 4;
- kloce = new kostka[wskaznik];
- for (int i = 0; i < wskaznik; i++){
- kloce[i].wspx = klocetemp[i].wspx;
- kloce[i].wspy = klocetemp[i].wspy;
- kloce[i].transx = klocetemp[i].transx;
- kloce[i].transy = klocetemp[i].transy;
- kloce[i].granicalewa = klocetemp[i].granicalewa;
- kloce[i].granicaprawa = klocetemp[i].granicaprawa;
- cout << "Przekazano dane: " << kloce[i].wspx << ":" << kloce[i].wspy << " ; " << kloce[i].transx << ":" << kloce[i].transy << endl;
- }
- delete[] klocetemp;
- flag = 1;
- licznik = 0;
- ster = 0;
- ruch = false;
- if (ruch == false){
- aktualnaSpadajacaFigura = losujKtoraFigureWygenerowac(0, 7, 0);
- cout << "RUCH:::" << ruch << "TEMP: 0" << aktualnaSpadajacaFigura << endl;
- }
- }
- }
- if (flag == 1){
- //figura[0].transx = ster;
- //figura[0].transy = licznik;
- //figura[1].transx = ster;
- //figura[1].transy = licznik;
- //figura[2].transx = ster;
- //figura[2].transy = licznik;
- //figura[3].transx = ster;
- //figura[3].transy = licznik;
- for (int i = 0; i < wskaznik; i++){
- glPushMatrix();
- glTranslatef(kloce[i].transx, -kloce[i].transy, 0);
- szescian(kloce[i].wspx, kloce[i].wspy);
- glPopMatrix();
- }
- ruch = true;
- }
- //glCallList(listid + 3);
- Sleep(100);
- // glutPostRedisplay();
- glFlush();
- glutSwapBuffers();
- }
- void GenerateDisplayLists(){
- listid = glGenLists(3);
- glNewList(listid + 0, GL_COMPILE);
- szescian(0, 4);
- szescian(0, 2);
- szescian(0, 0);
- szescian(0, -2);
- glEndList();
- glNewList(listid + 1, GL_COMPILE);
- szescian(-2, 4);
- szescian(-2, 2);
- szescian(0, 2);
- szescian(0, 0);
- glEndList();
- glNewList(listid + 2, GL_COMPILE);
- szescian(-2, 2);
- szescian(0, 2);
- szescian(0, 0);
- szescian(0, -2);
- glEndList();
- glNewList(listid + 3, GL_COMPILE);
- szescian(0, 2);
- szescian(-2, 0);
- szescian(0, 0);
- szescian(0, -2);
- glEndList();
- }
- void Reshape(int width, int height)
- {
- // obszar renderingu - ca³e okno
- glViewport(0, 0, width, height);
- // wybór macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- // macierz rzutowania = macierz jednostkowa
- glLoadIdentity();
- Rysuj();
- }
- void SpecialKeys(int key, int x, int y)
- {
- switch (key)
- {
- // kursor w lewo
- case GLUT_KEY_RIGHT:
- ster = ster + 20;
- break;
- case GLUT_KEY_LEFT:
- ster = ster - 20;
- break;
- case GLUT_KEY_UP:
- upKeyControl();
- break;
- case GLUT_KEY_DOWN:
- break;
- }
- // odrysowanie okna
- Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
- }
- int main(int argc, char *argv[])
- {
- // inicjalizacja biblioteki GLUT
- glutInit(&argc, argv);
- // inicjalizacja bufora ramki
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- // rozmiary g³ównego okna programu
- glutInitWindowSize(800, 800);
- // utworzenie g³ównego okna programu
- glutCreateWindow("Tetris");
- // Display();
- //Rysuj();
- glutDisplayFunc(Rysuj);
- glutReshapeFunc(Reshape);
- //glutKeyboardFunc(Keyboard);
- GenerateDisplayLists();
- glutSpecialFunc(SpecialKeys);
- glutIdleFunc(Rysuj);
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement