/* w,a,d r , space */ #include "stdafx.h" #include <math.h> #include <vector> #include <iostream> #include <fstream> #include <glut.h> using namespace std; const float Pi=3.14159265358; float winwid=400; float winhei=400; bool game_end=0; /////bullet//// float dx=0,dy=0; float bull_speed=6; float betta=0; bool fl1=0, fl2=0; /////ship//// float speed=0; float angle=0; float acsel=0; /////asteroid///// float ast_size=50; float aster_speed=3; /////0-rand//// int kol_aster=0; class bullet { public: float dxb; float dyb; float angleb; bullet() { dxb=dx; dyb=dy; angleb=betta; } }; class asteroid { public: float anglea; float dx; float dy; float depth; int n; int i_big; int ifsmall; vector <double> x; vector <double> y; void create(int i,bool param); void create_small(int i,int j,bool param,float depth1,float dx1,float dy1); }; void asteroid:: create_small(int i,int j,bool param,float depth1,float dx1,float dy1) { ifsmall=0; int size=ast_size/2; depth=depth1+(j+2)*1.0/(8.0*(kol_aster)); dx=dx1; dy=dy1; i_big=i; ///////////////////////////////////////////////// int quat=rand()%4; int n1=rand()%2+1; int n2=rand()%2+1; int n3=rand()%2+1; int n4=rand()%2+1; n1=n2=n3=n4=1; n=n1+n2+n3+n4; double xi,yi; anglea=rand()%360; x.clear(); y.clear(); for (int i=0;i<n1;i++) { xi=rand()%(size/2)-size/2; yi=rand()%(size/2)+size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n2;i++) { xi=rand()%(size/2)+size/2; yi=rand()%(size/2)+size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n3;i++) { xi=rand()%(size/2)+size/2; yi=rand()%(size/2)-size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n4;i++) { xi=rand()%(size/2)-size/2; yi=rand()%(size/2)-size/2; x.push_back(xi); y.push_back(yi); } ////////////////////////////////////////////////// } void asteroid:: create(int kol_exist,bool param) { int size=ast_size; int quat=rand()%4; int n1=rand()%2+1; int n2=rand()%2+1; int n3=rand()%2+1; int n4=rand()%2+1; n1=n2=n3=n4=1; n=n1+n2+n3+n4; double xi,yi; anglea=rand()%360; i_big=kol_exist; ifsmall=1; depth=(float)(kol_exist)/((kol_aster)); dx=rand()%(int)winwid -winwid/2; dy=rand()%(int)winhei -winhei/2; if(quat==0) dy=-ast_size-winhei/2; if(quat==1) dy=ast_size+winhei/2; if(quat==2) dx=-ast_size-winwid/2; if(quat==3) dx=ast_size+winwid/2; x.clear(); y.clear(); for (int i=0;i<n1;i++) { xi=rand()%(size/2)-size/2; yi=rand()%(size/2)+size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n2;i++) { xi=rand()%(size/2)+size/2; yi=rand()%(size/2)+size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n3;i++) { xi=rand()%(size/2)+size/2; yi=rand()%(size/2)-size/2; x.push_back(xi); y.push_back(yi); } for (int i=0;i<n4;i++) { xi=rand()%(size/2)-size/2; yi=rand()%(size/2)-size/2; x.push_back(xi); y.push_back(yi); } } vector <bullet> vecb; vector <asteroid> veca; void destroy_small_ast( int i) { ////// 4 - ///// bool create_big=1; float up_boarder=(float)(veca[i].i_big)/((kol_aster)); float down_boarder=(float)(veca[i].i_big)/((kol_aster)); asteroid a_big; a_big.create(veca[i].i_big,1); if (i>0) if(veca[i-1].depth>down_boarder) create_big=0; if (i<veca.size()-1) if(veca[i+1].depth<up_boarder) create_big=0; {if (create_big==1) {veca.insert(veca.begin()+veca[i].i_big,a_big); veca[veca[i].i_big].create(veca[i].i_big,1); veca.erase(veca.begin()+i+1);} else veca.erase(veca.begin()+i);} } void destroy_aster(float dep) { dep=1-2*dep; for(int i=0;i<veca.size();i++) { if (abs(dep-veca[i].depth)<0.0001) {if(veca[i].ifsmall==1) { veca.resize(veca.size()+4); for(int j=0;j<4;j++) veca[veca.size()-j-1].create_small(i,j,0,veca[i].depth,veca[i].dx,veca[i].dy); veca.erase(veca.begin()+i); break; } else {destroy_small_ast( i);break;} } } } void shoot() { float depth[5]; for(int i=0;i<vecb.size();i++) { glLoadIdentity(); ////// ////// vecb[i].dxb+=(speed+bull_speed)*cos(Pi*(vecb[i].angleb)/180.0); vecb[i].dyb+=(speed+bull_speed)*sin(Pi*(vecb[i].angleb)/180.0); //// ///// if((vecb[i].dxb>winwid/2-1) ||(vecb[i].dxb<-winwid/2+1) ||(vecb[i].dyb<-winhei/2+1) || (vecb[i].dyb>winhei/2-1)) {vecb.erase(vecb.begin()+i);i--;} else{ ///// //// glReadPixels((vecb[i].dxb+winwid/2),-vecb[i].dyb+winhei/2,2,2,GL_DEPTH_COMPONENT,GL_FLOAT,depth); if (depth[0]!=1) { destroy_aster(depth[0]); vecb.erase(vecb.begin()+i); i--; } else { ////// ////// glTranslatef(vecb[i].dxb,vecb[i].dyb,0.0f); glColor3f(1.0f,1.0f,1.0f); glBegin(GL_LINES); glVertex3f( 0.0,0.0, 0.5f); glVertex3f(1.0,0.0, 0.5f); glEnd(); } } } } void aster_draw() { glColor3f(0.5f,1.0f,1.0f); glLoadIdentity(); for (int i=0;i<veca.size();i++) { glBegin(GL_POLYGON); for(int j=0;j<veca[i].n;j++) glVertex3f( veca[i].dx+veca[i].x[j],veca[i].dy+veca[i].y[j], veca[i].depth); glEnd(); veca[i].dx+=aster_speed*cos(Pi*(veca[i].anglea)/180.0); veca[i].dy+=aster_speed*sin(Pi*(veca[i].anglea)/180.0); ///// , /// if((veca[i].dx>winwid/2+ast_size) ||(veca[i].dx<-winwid/2-ast_size) ||(veca[i].dy<-winhei/2-ast_size) || (veca[i].dy>winhei/2+ast_size)) if (veca[i].ifsmall==0) {destroy_small_ast( i);i--;} else veca[i].create(i,1); } } void asteroidsinit() { int k; k=rand()%6+4; if(kol_aster!=0) k=kol_aster; else kol_aster=k; veca.resize(k); for(int i=0;i<k;i++) veca[i].create(i,1); } void draw_ship() { float depth[6]; float dx1,dx2,dy1,dy2; //////// ///// if ((dx<winwid/2-1)&&(dx>-winwid/2+1)&&(dy<winwid/2-1)&&(dy>-winwid/2+1)) glReadPixels((dx+winwid/2),-dy+winhei/2,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth); else depth[0]=1; dx1=dx-10*cos(Pi*betta/180)-10*sin(Pi*betta/180)+winwid/2; dy1=-dy+10*sin(Pi*betta/180)-10*cos(Pi*betta/180)+winhei/2; if ((dx1<winwid-1)&&(dx1>0+1)&&(dy1<winhei-1)&&(dy1>0+1)) glReadPixels(dx1,dy1,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth+1); else depth[1]=1; dx2=dx-10*cos(Pi*betta/180)+10*sin(Pi*betta/180)+winwid/2; dy2=-dy+10*sin(Pi*betta/180)+10*cos(Pi*betta/180)+winhei/2; if ((dx2<winwid-1)&&(dx2>0+1)&&(dy2<winhei-1)&&(dy2>0+1)) glReadPixels(dx2,dy2,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,depth+2); else depth[2]=1; /////// //// if(dx>winwid/2) dx=-winwid/2; if(dx<-winwid/2) dx=winwid/2; if(dy<-winhei/2) dy=winhei/2; if(dy>winhei/2) dy=-winhei/2; /////////////// glColor3f(0.8f,0.0f,0.8f); glLoadIdentity(); glTranslatef(dx,dy,0.0f); glRotatef(betta,0.0f,0.0f,1.0f); glBegin(GL_TRIANGLES); glVertex3f( -10.0f,-10.0f, 1.0f); glVertex3f(-10.0f,10.0f, 1.0f); glVertex3f(0.0f,0.0f, 1.0f); if (fl2==1){ glVertex3f( -10.0f,-3.0f, 1.0f); glVertex3f(-10.0f,3.0f, 1.0f); glVertex3f(-15.0f,0.0f, 1.0f); } glEnd(); ///////// - ///////// if ((depth[0]!=1)||(depth[1]!=1)||(depth[2]!=1)) game_end=1; } void display() { glClearDepth( 1.0f ); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); aster_draw(); draw_ship(); shoot(); glutSwapBuffers(); } void Timer(int) { acsel--; if(speed>10) speed=10; if (fl1==1) {angle=betta;fl1=0;} if (acsel==0) {fl2=0;} dx=dx+speed*cos(Pi*angle/180.0); dy=dy+speed*sin(Pi*angle/180.0); if(speed>0)speed=speed-0.1; else speed=0; display(); if(game_end==0) glutTimerFunc(50,Timer,0); } void Initialize() { dx=0; dy=0; vecb.empty(); angle=betta=speed=0; glClearColor(0, 0, 0.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-winwid/2, winwid/2, winhei/2, -winhei/2, -1, 1); glMatrixMode(GL_MODELVIEW); glEnable(GL_DEPTH_TEST); glDepthFunc( GL_LEQUAL ); float depth[5]; glClearDepth( 1.0f ); // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); asteroidsinit(); glutTimerFunc(500,Timer,0); } void keyboard(unsigned char key,int x,int y) { if (key=='w') {fl1=1;speed++;fl2=1;acsel=10;} if (key=='d') {betta+=7;} if (key=='a') betta-=7; if (key==' ') {bullet b1;vecb.push_back(b1);} if(key=='r') {if(game_end==1) {game_end=0;Initialize();}} } int main(int argc, char **argv)// { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH |GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(winwid, winhei); glutInitWindowPosition(200, 200); glutCreateWindow("Powder Toy"); Initialize(); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMainLoop(); }