游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: zed

怎样实现鼠标选择物体后就可以拖动

[复制链接]

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-8-5 10:33:00 | 显示全部楼层

Re:怎样实现鼠标选择物体后就可以拖动

哪位大哥有源代码呀
小弟高价求

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-8-5 11:27:00 | 显示全部楼层

Re:怎样实现鼠标选择物体后就可以拖动

哪位大哥有源代码呀
小弟高价求

0

主题

18

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-8-7 19:40:00 | 显示全部楼层

Re: 怎样实现鼠标选择物体后就可以拖动

这是我做的国际象棋游戏的一些代码,你可以参考一下

下面是选择部分
int selectChess(int x, int y)
{
    GLuint selectBuf[BUF_SIZE];
    GLuint minDepth, name;
    GLint hits;
    int i;

    if(chess->gameResult != -1)
    {
        return 0;            // 游戏已结束
    }

    glSelectBuffer(BUF_SIZE, selectBuf);

    glRenderMode(GL_SELECT);
    glInitNames();
    glPushName(0);

    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluPickMatrix((GLdouble)x, (GLdouble)(viewport[3] - y), 1.0, 1.0, viewport);
    gluPerspective(50.0, (GLfloat)viewport[2] / viewport[3], 1.0, 5000.0);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    camera.callList();
    glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);

    chess->drawSolid();

    glPopMatrix();
   
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glFlush();

    hits = glRenderMode(GL_RENDER);

    if(hits)
    {
        minDepth = selectBuf[1];
        name = selectBuf[3];
        for(i = 0; i < hits; i++)
        {
            if(selectBuf[i * 4 + 1] < minDepth)
            {
                minDepth = selectBuf[i * 4 + 1];
                name = selectBuf[i * 4 + 3];
            }
        }
        return name;
    }
    return 0;
}

下面是实现拖动的部分代码
    if(selectedChess)
    {
        glClear(GL_DEPTH_BUFFER_BIT);
        glBegin(GL_QUADS);
        // 画一个和棋盘一样大的矩形
        //不用担心这个矩形会显示出来,因为使用了双缓冲,矩形只在显存中,等处理完拖动事件,才绘制场景,此时矩形已经被清除了
        glVertex3f(GRID_WIDTH * 4, GRID_WIDTH * 4, deltaz);
        glVertex3f(-GRID_WIDTH * 4, GRID_WIDTH * 4, deltaz);
        glVertex3f(-GRID_WIDTH * 4, -GRID_WIDTH * 4, deltaz);
        glVertex3f(GRID_WIDTH * 4, -GRID_WIDTH * 4, deltaz);
        glEnd();

        glReadPixels(x, viewport[3] - y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
        if(depth != 1.0 && x > viewport[0] && x < (viewport[0] + viewport[2]) && y > viewport[1] && y < (viewport[1] + viewport[3]))
        {
            gluUnProject(x, viewport[3] - y, (GLdouble)depth, modelMatrix, projMatrix, viewport, &objx, &objy, &objz);
            objx -= deltax;
            objy -= deltay;
            objz -= deltaz;
            selectedChess->x = (GLfloat)objx;
            selectedChess->y = (GLfloat)objy;
            selectedChess->z = (GLfloat)objz;
            selectedChess->newList();

            chess->setHighlight(moveRow, moveCol, CHESS_MOVE_NONE);
            if(lastMoveState == CHESS_MOVE_LEFTCASTLE || lastMoveState == CHESS_MOVE_RIGHTCASTLE)
            {
                chess->setHighlight(moveRow, moveCol - 1, CHESS_MOVE_NONE);
                chess->setHighlight(moveRow, moveCol + 1, CHESS_MOVE_NONE);
            }

            moveRow = (int)((GRID_WIDTH * 4 - objy) / GRID_WIDTH);
            if(moveRow > 7) moveRow = 7;
            moveCol = (int)((objx + GRID_WIDTH * 4) / GRID_WIDTH);
            if(moveCol > 7) moveCol = 7;

            lastMoveState = (selectedChess->*(selectedChess->checkMove))(moveRow, moveCol);
            chess->setHighlight(moveRow, moveCol, lastMoveState);
            chess->setHighlight(selectedChess->getRow(), selectedChess->getColumn(), CHESS_MOVE_FROM);
            chess->newList();

            glutPostRedisplay();
        }
    }

0

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2005-9-10 16:08:00 | 显示全部楼层

Re:怎样实现鼠标选择物体后就可以拖动

和scu_biology@sohu.com 联系吧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 18:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表