Code:
//================================================== ===========================================
// Szamitogepes grafika hazi feladat keret. Ervenyes 2011-tol.
// A //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// sorokon beluli reszben celszeru garazdalkodni, mert a tobbit ugyis toroljuk.
// A beadott program csak ebben a fajlban lehet, a fajl 1 byte-os ASCII karaktereket tartalmazhat.
// Tilos:
// - mast "beincludolni", illetve mas konyvtarat hasznalni
// - faljmuveleteket vegezni (printf is fajlmuvelet!)
// - new operatort hivni
// - felesleges programsorokat a beadott programban hagyni
// - tovabbi kommenteket a beadott programba irni a forrasmegjelolest kommentjeit kiveve
// ---------------------------------------------------------------------------------------------
// A feladatot ANSI C++ nyelvu forditoprogrammal ellenorizzuk, a Visual Studio-hoz kepesti elteresekrol
// es a leggyakoribb hibakrol (pl. ideiglenes objektumot nem lehet referencia tipusnak ertekul adni)
// a hazibeado portal ad egy osszefoglalot.
// ---------------------------------------------------------------------------------------------
// A feladatmegoldasokban csak olyan gl/glu/glut fuggvenyek hasznalhatok, amelyek
// 1. Az oran a feladatkiadasig elhangzottak ES (logikai AND muvelet)
// 2. Az alabbi listaban szerepelnek:
// Rendering pass: glBegin, glVertex[2|3]f, glColor3f, glNormal3f, glTexCoord2f, glEnd, glDrawPixels
// Transzformaciok: glViewport, glMatrixMode, glLoadIdentity, glMultMatrixf, gluOrtho2D,
// glTranslatef, glRotatef, glScalef, gluLookAt, gluPerspective, glPushMatrix, glPopMatrix,
// Illuminacio: glMaterialfv, glMaterialfv, glMaterialf, glLightfv
// Texturazas: glGenTextures, glBindTexture, glTexParameteri, glTexImage2D, glTexEnvi,
// Pipeline vezerles: glShadeModel, glEnable/Disable a kovetkezokre:
// GL_LIGHTING, GL_NORMALIZE, GL_DEPTH_TEST, GL_CULL_FACE, GL_TEXTURE_2D, GL_BLEND, GL_LIGHT[0..7]
//
// NYILATKOZAT
// ---------------------------------------------------------------------------------------------
// Nev : <VEZETEKNEV(EK)> <KERESZTNEV(EK)>
// Neptun : <NEPTUN KOD>
// ---------------------------------------------------------------------------------------------
// ezennel kijelentem, hogy a feladatot magam keszitettem, es ha barmilyen segitseget igenybe vettem vagy
// mas szellemi termeket felhasznaltam, akkor a forrast es az atvett reszt kommentekben egyertelmuen jeloltem.
// A forrasmegjeloles kotelme vonatkozik az eloadas foliakat es a targy oktatoi, illetve a
// grafhazi doktor tanacsait kiveve barmilyen csatornan (szoban, irasban, Interneten, stb.) erkezo minden egyeb
// informaciora (keplet, program, algoritmus, stb.). Kijelentem, hogy a forrasmegjelolessel atvett reszeket is ertem,
// azok helyessegere matematikai bizonyitast tudok adni. Tisztaban vagyok azzal, hogy az atvett reszek nem szamitanak
// a sajat kontribucioba, igy a feladat elfogadasarol a tobbi resz mennyisege es minosege alapjan szuletik dontes.
// Tudomasul veszem, hogy a forrasmegjeloles kotelmenek megsertese eseten a hazifeladatra adhato pontokat
// negativ elojellel szamoljak el es ezzel parhuzamosan eljaras is indul velem szemben.
//================================================== ===========================================
#include <math.h>
#include <stdlib.h>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
// MsWindows-on ez is kell
#include <windows.h>
#endif // Win32 platform
#include <GL/gl.h>
#include <GL/glu.h>
// A GLUT-ot le kell tolteni: http://www.opengl.org/resources/libraries/glut/
#include <GL/glut.h>
#define new new_nelkul_is_meg_lehet_csinalni
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
// Innentol modosithatod...
#define g 0.1f
#define epsilon 0.005f
#define NoOfObstacles 12
#define PI 3.14f
#define elevacc 0.2f
#define dt 500
bool floatIsEqual(float a, float b){
if(fabs(a-b)<epsilon)
return true;
else
return false;
}
class coord{
public:
float x, y;
coord(float x=0.0f, float y=0.0f):x(x), y(y){}
~coord(){}
};
class Snake;
class Platform{
public:
coord a, b;
Platform(coord a, coord b): a(a), b(b){}
bool carry(){
}
bool bottom(){
}
void collision(){
}
~Platform(){}
};
class Block: public Platform{
public:
coord c, d;
Block(coord a, coord b, coord c, coord d): Platform(a, b), c(c), d(d) {}
~Block(){}
};
class Elevator: public Block{
public:
float v;
bool up;
Elevator(coord a, coord b, coord c, coord d, float v=0.0f, bool up=true): Block(a, b, c, d), v(v), up(up){}
void Move(){
if(up){
if(a.y+v>1.0f || floatIsEqual(a.y+v, 1.0f)){
a.y=1.0f;
b.y=1.0f;
c.y=0.99f;
d.y=0.99f;
v=0.0f;
}
else{
a.y+=v;
b.y+=v;
c.y+=v;
d.y+=v;
v+=elevacc;
}
}
else{
if(a.y+v<-1.0f || floatIsEqual(a.y+v, -1.0f)){
a.y=-0.99f;
b.y=-0.99f;
c.y=-1.0f;
d.y=-1.0f;
v=0.0f;
}
else{
a.y+=v;
b.y+=v;
c.y+=v;
d.y+=v;
v+=elevacc;
}
}
}
~Elevator(){}
};
class Obstacles{
public:
Platform *t[NoOfObstacles];
Obstacles();
~Obstacles();
};
class Snake{
public:
float vx, vy, ay, A, x;
coord a, b, c, d;
Snake(coord a, coord b, coord c, coord d, float vx, float vy, float ay, float A, float x): a(a), b(b), c(c), d(d), vx(vx), vy(vy), ay(ay), A(A), x(x) {}
bool death(){
}
void move(){
}
~Snake(){}
};
Platform upperleft(coord(-1.0f, 0.33f), coord(-0.6f, 0.33f)),
uppermid(coord(-0.2, 0.33f), coord(0.2f, 0.33f)),
upperright(coord(0.6f, 0.33f), coord(1.0f, 0.33f)),
lowerleft(coord(-1.0f, -0.33f), coord(-0.6f, -0.33f)),
lowermid(coord(-0.2, -0.33f), coord(0.2f, -0.33f)),
lowerright(coord(0.6f, -0.33f), coord(1.0f, -0.33f));
Block top(coord(-1.0f, 1.0f), coord(1.0f, 1.0f), coord(1.0f, 0.99f), coord(-1.0f, 0.99f)),
bottom(coord(-1.0f, -0.99f), coord(1.0f, -0.99f), coord(1.0f, -1.0f), coord(-1.0f, -1.0f)),
left(coord(-1.0f, 1.0f), coord(-0.99f, 1.0f), coord(-0.99f, -1.0f), coord(-1.0f, -1.0f)),
right(coord(0.99f, 1.0f), coord(1.0f, 1.0f), coord(1.0f, -1.0f), coord(0.99f, -1.0f));
Elevator e[2]={Elevator(coord(-0.59f, 0.33f), coord(-0.21f, 0.33f), coord(-0.21f, 0.32f), coord(-0.59f, 0.32f), 0.0f, true),
Elevator(coord(0.21f, 0.33f), coord(0.59f, 0.33f), coord(0.59f, 0.32f), coord(0.21f, 0.32f), 0.0f, true)};
Snake s[2]={Snake(coord(-0.9f, -0.87f), coord(-0.6f, -0.87f), coord(-0.6f, -0.99f), coord(-0.9f, -0.99f), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f),
Snake(coord(0.6f, 0.45f), coord(0.9f, 0.45f), coord(0.9f, 0.33f), coord(0.6f, 0.33f), -1.0f, 0.0f, 0.0f, 0.0f, 0.0f)};
long oldtime=0;
void simulateWorld(long tstart, long tend){
for(long ts=tstart; ts<tend; ts+=dt){
float te=min(tend, ts+dt);
//e[0].Move();
//e[1].Move();
glutPostRedisplay();
}
}
// Inicializacio, a program futasanak kezdeten, az OpenGL kontextus letrehozasa utan hivodik meg (ld. main() fv.)
void onInitialization( ) {
}
// Rajzolas, ha az alkalmazas ablak ervenytelenne valik, akkor ez a fuggveny hivodik meg
void onDisplay( ) {
glClearColor(0.1f, 0.2f, 0.3f, 1.0f); // torlesi szin beallitasa
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // kepernyo torles
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_LINES);
glVertex2f(upperleft.a.x, upperleft.a.y);
glVertex2f(upperleft.b.x, upperleft.b.y);
glVertex2f(uppermid.a.x, uppermid.a.y);
glVertex2f(uppermid.b.x, uppermid.b.y);
glVertex2f(upperright.a.x, upperright.a.y);
glVertex2f(upperright.b.x, upperright.b.y);
glVertex2f(lowerleft.a.x, lowerleft.a.y);
glVertex2f(lowerleft.b.x, lowerleft.b.y);
glVertex2f(lowermid.a.x, lowermid.a.y);
glVertex2f(lowermid.b.x, lowermid.b.y);
glVertex2f(lowerright.a.x, lowerright.a.y);
glVertex2f(lowerright.b.x, lowerright.b.y);
glEnd();
glBegin(GL_QUADS);
glVertex2f(top.a.x, top.a.y);
glVertex2f(top.b.x, top.b.y);
glVertex2f(top.c.x, top.c.y);
glVertex2f(top.d.x, top.d.y);
glVertex2f(bottom.a.x, bottom.a.y);
glVertex2f(bottom.b.x, bottom.b.y);
glVertex2f(bottom.c.x, bottom.c.y);
glVertex2f(bottom.d.x, bottom.d.y);
glVertex2f(left.a.x, left.a.y);
glVertex2f(left.b.x, left.b.y);
glVertex2f(left.c.x, left.c.y);
glVertex2f(left.d.x, left.d.y);
glVertex2f(right.a.x, right.a.y);
glVertex2f(right.b.x, right.b.y);
glVertex2f(right.c.x, right.c.y);
glVertex2f(right.d.x, right.d.y);
glVertex2f(e[0].a.x, e[0].a.y);
glVertex2f(e[0].b.x, e[0].b.y);
glVertex2f(e[0].c.x, e[0].c.y);
glVertex2f(e[0].d.x, e[0].d.y);
glVertex2f(e[1].a.x, e[1].a.y);
glVertex2f(e[1].b.x, e[1].b.y);
glVertex2f(e[1].c.x, e[1].c.y);
glVertex2f(e[1].d.x, e[1].d.y);
for(int i=0; i<2; i++){
if(i==0)
glColor3f(0.0f, 1.0f, 0.0f);
else
glColor3f(1.0f, 0.0f, 0.0f);
if(s[i].vx<0.0f){
glVertex2f(s[i].a.x, (s[i].a.y+s[i].d.y)/2);
glVertex2f(s[i].a.x+0.03f, (s[i].a.y+s[i].d.y)/2+0.02f);
glVertex2f(s[i].a.x+0.06f, (s[i].a.y+s[i].d.y)/2);
glVertex2f(s[i].a.x+0.03f, (s[i].a.y+s[i].d.y)/2-0.02f);
}
else{
glVertex2f(s[i].b.x-0.06f, (s[i].a.y+s[i].d.y)/2);
glVertex2f(s[i].b.x-0.03f, (s[i].a.y+s[i].d.y)/2+0.02f);
glVertex2f(s[i].b.x, (s[i].a.y+s[i].d.y)/2);
glVertex2f(s[i].b.x-0.03f, (s[i].a.y+s[i].d.y)/2-0.02f);
}
}
glEnd();
for(int i=0; i<2; i++){
if(i==0)
glColor3f(0.0f, 1.0f, 0.0f);
else
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_LINE_STRIP);
if(s[i].vx<0.0f){
for(float j=0.0f; j<=0.24f; j+=0.005f)
glVertex2f(s[i].a.x+0.06f+j, ((s[i].a.y+s[i].d.y)/2)+0.06f*sin(4.0f*PI*(j/0.24f)));
}
else{
for(float j=0.0f; j<=0.24f; j+=0.005f)
glVertex2f(s[i].b.x-0.06f-j, ((s[i].a.y+s[i].d.y)/2)+0.06f*sin(4.0f*PI*(j/0.24f)));
}
glEnd();
}
glutSwapBuffers();
// ...
//glutSwapBuffers(); // Buffercsere: rajzolas vege
}
// Billentyuzet esemenyeket lekezelo fuggveny
void onKeyboard(unsigned char key, int x, int y) {
if(key=='q')
e[0].up=true;
if(key=='a')
e[0].up=false;
if(key=='o')
e[1].up=true;
if(key=='l')
e[1].up=false;
glutPostRedisplay();
}
// Eger esemenyeket lekezelo fuggveny
void onMouse(int button, int state, int x, int y) {
}
// `Idle' esemenykezelo, jelzi, hogy az ido telik, az Idle esemenyek frekvenciajara csak a 0 a garantalt minimalis ertek
void onIdle( ) {
long time = glutGet(GLUT_ELAPSED_TIME); // program inditasa ota eltelt ido
simulateWorld(oldtime, time);
oldtime=time;
}
// ...Idaig modosithatod
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
// A C++ program belepesi pontja, a main fuggvenyt mar nem szabad bantani
int main(int argc, char **argv) {
glutInit(&argc, argv); // GLUT inicializalasa
glutInitWindowSize(600, 600); // Alkalmazas ablak kezdeti merete 600x600 pixel
glutInitWindowPosition(100, 100); // Az elozo alkalmazas ablakhoz kepest hol tunik fel
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // 8 bites R,G,B,A + dupla buffer + melyseg buffer
glutCreateWindow("Grafika hazi feladat"); // Alkalmazas ablak megszuletik es megjelenik a kepernyon
glMatrixMode(GL_MODELVIEW); // A MODELVIEW transzformaciot egysegmatrixra inicializaljuk
glLoadIdentity();
glMatrixMode(GL_PROJECTION); // A PROJECTION transzformaciot egysegmatrixra inicializaljuk
glLoadIdentity();
onInitialization(); // Az altalad irt inicializalast lefuttatjuk
glutDisplayFunc(onDisplay); // Esemenykezelok regisztralasa
glutMouseFunc(onMouse);
glutIdleFunc(onIdle);
glutKeyboardFunc(onKeyboard);
glutMainLoop(); // Esemenykezelo hurok
return 0;
}