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);
}