如何通过点击鼠标打破气球?

时间:2014-05-19 18:49:50

标签: opengl glut

我的display()函数,我将气球位置的值带到pop()

void display()
{
glClear (GL_COLOR_BUFFER_BIT);

// update balloon position
p = 0;

for(w=0; w<100; w++)
{
    p = rand() % speedrange;

    balloon[w].pos.y = balloon[w].pos.y + speed[p];
}

for(balloonBurst=0; balloonBurst<100; balloonBurst++)
{
    drawCircleOutline(balloon[balloonBurst]);
    if(mouseleft){
    pop(balloon[balloonBurst].pos.x,balloon[balloonBurst].pos.y);
    }
}
glutSwapBuffers();
}

这是我的鼠标功能

void mouse(int button, int state, int x, int y)
{

if (button==GLUT_LEFT_BUTTON)
{
    mouseleft = (state == GLUT_LEFT_BUTTON);
    mouseX = x;
    mouseY = y;
    /*tex_2d = SOIL_load_OGL_texture(
    "balloonBurst.png",
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);*/
    }
}

这是我的pop()函数

void pop (float x, float y)
{
    if( x - 0.1f <= mouseX/800 <= x + 0.1f && y - 0.1f <= 1 - mouseY/800 <= y + 0.1f)
    {
        tex_2d = SOIL_load_OGL_texture(
        "balloonBurst.png",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT);
    }
}

我不知道如何链接它并比较鼠标位置和气球位置的值。

2 个答案:

答案 0 :(得分:0)

您正在寻找的内容在OpenGL中称为picking。有两种方法,即Ray Picking和opengl Selection Mode。请参阅herehereherehere

答案 1 :(得分:0)

用不同颜色绘制每个气球,然后获得鼠标所在像素的颜色,这将为您提供气球的颜色(如果您指向一个气球)。为此,请查看glReadPixels。使用某种列表来查看哪个气球对应于哪种颜色。如果您不想显示此颜色,可以清除屏幕并使用所需的颜色,纹理,着色器等进行渲染。

相关问题