2014-10-30 129 views
0

this post矩形通过鼠标移动。我想添加一个三角形,并通过鼠标像矩形移动。在Opengl中移动很多形状

这样的三角形函数:

void drawTriangle(float x,float y,float size){ 
glPushMatrix(); 
glTranslatef(x, y, 0.0f); 
glScalef(size, size, 1.0f); 
glBegin(GL_TRIANGLES); 
glColor3ub(255, 255, 255); 
glVertex2f( -1, 1); 
glVertex2f( 1, -1); 
glVertex2f( 1, 1); 
glEnd(); 
glPopMatrix(); 

矩形和三角形一起移动。但我想要改变它的不同。那么我的错误是什么?

+0

您发布的代码只是绘制在任何'x'和'y'坐标下给出一个三角形。它与鼠标输入或跟踪三角形出现的位置无关。 – Wyzard 2014-10-30 02:45:38

回答

1

你必须保持形状对象的数组,并测试每一个鼠标的碰撞,以及跟踪其中形状您拖动:

#include <GL/glut.h> 
#include <vector> 

using namespace std; 

struct Shape 
{ 
    float mX, mY; 
    float mSize; 
    bool mIsRectangle; 

    bool PointInside(const float x, const float y) const 
    { 
     return 
      mX - mSize <= x && x <= mX + mSize 
      && 
      mY - mSize <= y && y <= mY + mSize; 
    } 
}; 

vector<Shape> objects; 
Shape* dragging = NULL; 
void mouse(int button, int state, int x, int y) 
{ 
    if(GLUT_DOWN == state) 
    { 
     dragging = NULL; 
     for(Shape& obj : objects) 
     { 
      if(obj.PointInside(x, y)) 
      { 
       dragging = &obj; 
       glutPostRedisplay(); 
       break; 
      } 
     } 
    } 
    else 
    { 
     dragging = NULL; 
    } 
} 

void motion(int x, int y) 
{ 
    if(dragging) 
    { 
     dragging->mX = x; 
     dragging->mY = y; 
     glutPostRedisplay(); 
    } 
} 

void drawRect(float x, float y, float size) 
{ 
    glPushMatrix(); 
    glTranslatef(x, y, 0.0f); 
    glScalef(size, size, 1.0f); 
    glBegin(GL_QUADS); 
    glColor3ub(255, 255, 255); 
    glVertex2f(-1, -1); 
    glVertex2f( 1, -1); 
    glVertex2f( 1, 1); 
    glVertex2f(-1, 1); 
    glEnd(); 
    glPopMatrix(); 
} 

void drawTriangle(float x, float y, float size) 
{ 
    glPushMatrix(); 
    glTranslatef(x, y, 0.0f); 
    glScalef(size, size, 1.0f); 
    glBegin(GL_TRIANGLES); 
    glColor3ub(255, 255, 255); 
    glVertex2f( -1, 1); 
    glVertex2f( 1, -1); 
    glVertex2f( 1, 1); 
    glEnd(); 
    glPopMatrix(); 
} 

void display() 
{ 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    const double w = glutGet(GLUT_WINDOW_WIDTH); 
    const double h = glutGet(GLUT_WINDOW_HEIGHT); 
    glOrtho(0, w, h, 0, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    for(const Shape& obj : objects) 
    { 
     if(obj.mIsRectangle) 
      drawRect(obj.mX, obj.mY, obj.mSize); 
     else 
      drawTriangle(obj.mX, obj.mY, obj.mSize); 
    } 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(600, 600); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutMouseFunc(mouse); 
    glutMotionFunc(motion); 

    Shape temp; 
    temp.mSize = 50; 

    temp.mX = temp.mY = 100; 
    temp.mIsRectangle = true; 
    objects.push_back(temp); 

    temp.mX = temp.mY = 200; 
    temp.mIsRectangle = false; 
    objects.push_back(temp); 

    glutMainLoop(); 
    return 0; 
} 
+0

数组或类。 – 2014-10-30 07:30:56

+0

@GavinSimpson:我看不出* *班将如何帮助那里。一个类不是容纳多个对象信息的容器。你一定需要这个容器。 – datenwolf 2014-10-30 08:33:41

+0

但是,如果每个形状都有它自己的类,它可以包含它自己的坐标,以及更多? – 2014-10-30 08:54:14