Intelteh
Сообщений: 22
Оценки: 0
Присоединился: 2006-06-13 02:51:53
|
Здравствуйте, уважаемые. Столкнулся я с такой проблемой. Пишу свою игру Duck Hunt, наподобие той, что была под 8-ми битные телевизионные приставки в начале 90-х годов. Игра пишется на основе 32-го урока с сайта nehe.gamedev.net. Смысл игры в попадании в утку мышкой, которая вылетает из камышей. Беда в том, что функция, отвечающая за обработку выбора объекта под курсором не выбирает объект(утку). А почему – понять не могу. Уже третьи сутки туториалы читаю и нифига не получается. Помогите вы. Вот функция, выводящая на экран утку, и описывающая её поведение. void Duck(float x, float y, float z)
{
glLoadName(OBJECT_ID_1);
glPushMatrix();
if(DuckFly==true)
{
if(DuckHit==true) // есть попадание
{
DuckY-=dY;
if(DuckY<-3)
{
DuckY==-3;
DuckHit=false;
}
DuckTexID=14;
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID);
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID); //DuckTexID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x+4, y, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+4, y+4, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y+4, z);
glEnd();
// DuckNum++;
}
//логика полёта утки
if(DuckY>-3 && DuckAway==3 && DuckHit==false) /////////FlyAway
{
DuckY1=(int)DuckY%2;
if(DuckY1==0) DuckTexID=12;
else DuckTexID=13;
Shoot=false;
dY=0.1;
DuckY+=dY;
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x+4, y, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+4, y+4, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y+4, z);
glEnd();
if(DuckY>18) DuckFly=false;
}
if(DuckY<=-3 && DuckAway==0)
{
if(DuckDir==0) dX=0.1;
else dX=-0.1;
DuckY+=dY;
DuckX+=dX;
DuckY1=(int)DuckY%2;
if(DuckY1==0) DuckTexID=7;
else DuckTexID=8;
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x+4, y, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+4, y+4, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y+4, z);
glEnd();
glPopMatrix();
}
if(DuckY<=-3 && DuckAway!=0 && DuckHit==false)
{
dY=0.04;
DuckY+=dY;
DuckX+=dX;
DuckX1=(int)DuckX%3;
if(DuckX1==0) DuckTexID=9;
else if(DuckX1==1||DuckX1==-1)DuckTexID=10;
else DuckTexID=11;
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x+4, y, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+4, y+4, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y+4, z);
glEnd();
}
if(DuckY>-3 && DuckAway!=3)
{
DuckX+=dX;
DuckY+=dY;
if(DuckX>24)
{
dX=-0.2;
DuckAway++;
}
if(DuckX<-27)
{
dX=0.2;
DuckAway++;
}
if(DuckY>12) dY=-0.04;
DuckX1=(int)DuckX%3;
if(DuckX1==0) DuckTexID=9;
else if(DuckX1==1||DuckX1==-1)DuckTexID=10;
else DuckTexID=11;
glBindTexture(GL_TEXTURE_2D, textures[DuckTexID].texID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x+4, y, z);
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+4, y+4, z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(x, y+4, z);
glEnd();
}
}
glPopMatrix();
}
А вот функция Selection(), обеспечивающая выбор объекта. Эта функция вызывается после получения сообщения WM_LBUTTONDOWN void Selection(void)
{
GLuint buffer[512]; //установка буфера выбора
GLint hits; //число объектов, попавших в выбор(не более 1-го)
if(GameOver) return;
PlaySound("shot.wav", NULL, SND_ASYNC);
GLint viewport[4]; //размер области просмотра
glGetIntegerv(GL_VIEWPORT, viewport); //помещаем в массив viewport размеры и положение на экране относительно окна
glSelectBuffer(512, buffer); //указываем какой массив использовать
(void)glRenderMode(GL_SELECT); //переключаемся в режим выбора
glInitNames(); //инициализация стека имён
glPushName(0); //помещаем 0 в стек(наименьший первый элемент)
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
//задаём маленькую область под мышью
gluPickMatrix((GLdouble)mouse_x, (GLdouble)(viewport[3]-mouse_y), 1.0f, 1.0f, viewport);
//применяем перспективную матрицу
gluPerspective(45.0f, (GLfloat)(viewport[2]-viewport[0])/(GLfloat)(viewport[3]-
viewport[1]), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
Duck(DuckX, DuckY, DUCK_Z); //визуализация объекта в буфер выбора
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
hits=glRenderMode(GL_RENDER); // переключаемся обратно в режим визуализации
if(hits>0)
{
DuckHit=true;
DuckNum++;
}
}
|