gruszek Posted November 20, 2008 Report Share Posted November 20, 2008 witam was. od jakiegos czasu probuje napisac w devC++ malutka gierke, konkretniej snake.. zaczalem od zdefiniowania graficznie pola oraz granic.. jestem teraz na etapie kiedy po kliknieciu przycisku w , a , s , d moj waz (zielona kula) zaczyna sie poruszac.. przesowa bez zatrzymania sie jednak kiedy naciskam kolejny przycisk automatycznie znika mi z pola ?!?!?!?!?! mam takze problem z funkcja RAND(), chcialbym aby zmienialo sie losowo polozenie "robaczka" (zoltej kuli), kiedy wpisuje po prostu funkcje rand() do glTranslatef losuje mi sie bez konca nowe polozenie ktore powinno po jednym razie sie zakonczyc. Zamiescilem zatem funkcje w void-dzie ale ten z koleji nie chce mi dzialac?!?!?!?!?!?!?! tutaj podsylam kod: #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> float ratio; float x = 80.0f; float y = 40.0f; float z = 140.0f; float lx = 0.0f; float ly = 0.0f; float lz = -1.0f; float myszx, myszy; int ruch = 0; float alfa=0; float beta=0; float r = 100; float KulaRot = 0; float RobaczekRot = 0; int ruszw = 0; int ruszs = 0; int rusza = 0; int ruszd = 0; int pierwszyx; int pierwszyy; int lewa = 200; int gora = 100; ////////////////////////////////////////////////////////////////////////////////////// void losuj (int konieclosowania){ srand(time(0)); if (konieclosowania == 1){ for (int i = 0; i < 1; i++){ pierwszyx = (rand()%650)-250 ; pierwszyy = (rand()%350)-120 ; } } } void init() { losuj(0); } void changeSize(int width, int height) //skalowanie okna { if(height == 0) height = 1; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, width, height); gluPerspective(45,(double)width/(double)height,1,1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0f, 1.0f, 0.0f); } void drawScena(void) { glPushMatrix(); glEnable( GL_LINE ); glColor3f(0,0,255); glBegin( GL_LINES ); glVertex3f( 0.0f, 88.0f, 0.0f); glVertex3f( 160.0f, 88.0f, 0.0f); glVertex3f( 160.0f, 88.0f, 0.0f); glVertex3f( 160.0f, 0.0f, 0.0f); glVertex3f( 160.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 0.0f, 0.0f); glVertex3f( 0.0f, 88.0f, 0.0f); glEnd(); glDisable( GL_LINE ); glPopMatrix(); } void drawPole(void) { glBegin(GL_QUADS); // pole glColor3f(0.0f,0.0f,0.1f); glVertex3f(0.0f, 88.0f, 0.0f); // górny lewy glColor3f(0.0f,0.0f,0.1f); glVertex3f( 160.0f, 88.0f, 0.0f); // górny prawy glColor3f(0.0f,0.0f,0.7f); glVertex3f( 160.0f,0.0f, 0.0f); // dolny prawy glColor3f(0.0f,0.0f,0.1f); glVertex3f(0.0f,0.0f, 0.0f); // dolny lewy glEnd(); // kiniec pola } void drawKuladuza(void) { glPushMatrix(); glColor3f(0, 255, 0); if(ruszw == 1){ glTranslatef(lewa,gora, -500.0f); } if(ruszs == 1){ glTranslatef(lewa,gora, -500.0f); } if(rusza == 1){ glTranslatef(lewa,gora, -500.0f); } if(ruszd == 1){ glTranslatef(lewa,gora, -500.0f); } glRotatef(KulaRot, 1, 1, 1)/ obrot wokol osi KulaRot += 0.2; glutWireSphere(15,15,10); glPopMatrix(); } void drawKulasrednia(void) { glPushMatrix(); glColor3f(0, 255, 0); glTranslatef(230,100, -500.0f); glRotatef(KulaRot, 1, 1, 1)/obrot wokol osi KulaRot += 0.2; glutWireSphere(14,15,10); glPopMatrix(); } void drawKulamala(void) { glPushMatrix(); glColor3f(0, 255, 0); glTranslatef(259,100, -500.0f); glRotatef(KulaRot,1 , 1, 1)/ obrot wokol osi KulaRot += 0.2; glutWireSphere(13,15,10); glPopMatrix(); } void drawRobaczek(void) { glPushMatrix(); glColor3f(100, 255, 0); losuj(0); glTranslatef(pierwszyx,pierwszyy, -500.0f); glRotatef(RobaczekRot, 1, 1, 1)/ obrot wokol osi RobaczekRot += 0.2; glutWireSphere(15,15,10); glPopMatrix(); } //tworzysz motion-a , polozenie oraz roch punktow w przestrzeni void motion(){ glTranslatef(0,0,0); drawPole(); // Linie krawedzi sceny drawScena(); drawRobaczek(); drawKuladuza(); drawKulasrednia(); drawKulamala(); glColor3f(1, 1, 1); glLoadIdentity(); gluLookAt(x, y, z, x + lx, y + ly, z + lz, 0.0f, 1.0f, 0.0f); } // koniec motion-a void klawisze (unsigned char key,int a,int b ) { switch(key) { case 27: exit(0); break; case 'w': ruszw = 1; break; case 's': ruszs = 1; break; case 'a': rusza = 1; break; case 'd': ruszd = 1; break; } } void kSpecjalne (int key, int a , int b ) { switch(key) { case GLUT_KEY_UP: gora = gora+1; break; case GLUT_KEY_DOWN: gora = gora-1; break; case GLUT_KEY_LEFT: lewa = lewa-1; break; case GLUT_KEY_RIGHT: lewa = lewa+1; break; } } void processMouse(int button, int state, int x, int y) { if (state == GLUT_DOWN) { myszx = x; myszy = y; ruch=1; } else ruch=0; } void motionMouse(int nowex, int nowey){ if(ruch){ alfa+=(nowey-myszy)*1.0; beta-=(nowex-myszx)*1.0; lx = r*cos(alfa*(M_PI/180))*cos(beta*(M_PI/180)); ly = r*sin(alfa*(M_PI/180)); lz = r*cos(alfa*(M_PI/180))*sin(beta*(M_PI/180)); myszx= nowex; myszy=nowey; } } void renderScene(void) { glClearColor (0.0f, 0.0f, 0.0f, 0.0); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(ruszw==1) { gora++; } if(ruszs==1) { gora--; } if(ruszd==1) { lewa++; } if(rusza==1) { lewa--; } motion(); glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(0,0); glutInitWindowSize(800,600); glutCreateWindow("Snake"); glutDisplayFunc(renderScene); glutIdleFunc(renderScene); glutMouseFunc(processMouse); glutMotionFunc(motionMouse); init(); glutReshapeFunc(changeSize); glutKeyboardFunc(klawisze); glutSpecialFunc(kSpecjalne); glutMainLoop(); return(0); } Link to comment Share on other sites More sharing options...
Jason Posted November 20, 2008 Report Share Posted November 20, 2008 W glTranslatef jak dajesz rand() to czemu się dziwisz? Za każdym wywołaniem funkcji losujesz nową pozycję. Najpierw sobie wylosuj do zmiennej, która będzie przyjmowała nową wartość tylko wtedy, kiedy się wąż "odradza". Co do pierwszego problemu to naprawdę nielogiczne wszystko... Np. jak ruszasz s to powinieneś w a d przestać ruszać. A u Ciebie wszystkie na raz mogą być w ruchu Ale cóż... nie od razu Rzym zbudowano... Jeszcze naucz się robić wcięcia (albo skorzystaj z jakiegoś IDE, który będzie na bieżąco robił to za Ciebie) no i kod wstawiaj w odpowiednie tagi. BTW. to są podstawy programowania, więc radzę zaprzestać z ambitnymi planami stworzenia gry, aż do osiągnięcia odpowiedniego poziomu, na którym sobie poradzisz.... Powodzenia Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.