Skocz do zawartości

OPENGL - nie wiem jak sobie poradzic :(


gruszek

Polecane posty

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 do komentarza
Udostępnij na innych stronach

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 :D

 

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 do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...