使用C ++和Openframeworks创建多个对象实例

时间:2013-11-25 16:23:01

标签: c++ oop openframeworks

我是Openframeworks和C ++的新手,但不是一般的编程(PHP和Objective-C)。我创建了一个绘制立方体的类,其中高度,宽度和深度是变量。我正在尝试创建所述类的3个版本,每个版本都有不同的尺寸。

但是,每个实例都使用第一个对象的维度。我试图改变绘图的顺序,无论如何,首先使用的是所有绘图。另外,我向控制台提供维度,并且正在发送正确的尺寸,但只绘制了第一个版本。

cube.h

#ifndef _CUBE
#define _CUBE

#include "ofMain.h"

class cube
{
public:

void update();
void draw();

cube(float _w, float _h, float _d);

float w;
float h;
float d;

ofMesh mesh;
ofVbo myVbo;


private:
};

#endif

cube.cpp

#include "cube.h"

cube::cube(float _w, float _h, float _d)
{
w = _w;
h = _h;
d = _d;

static GLfloat vdata[8][3] = {
    {-w, -h, -d}, {-w, h, -d},
    {w, h, -d}, {w, -h, -d},
    {-w, -h, d}, {w, -h, d},
    {-w, h, d}, {w, h, d}
};

static GLint indices[6][4] = {
    {3, 2, 1, 0},
    {3, 5, 4, 0},
    {3, 5, 7, 2},
    {0, 4, 6, 1},
    {1, 2, 7, 6},
    {5, 4, 6, 7}
};

ofColor color(ofRandom(255),ofRandom(255),ofRandom(255));
float hue = 254.f;

for (int i=0; i<8; ++i)
{
    mesh.addVertex(ofVec3f( vdata[i][0], vdata[i][1], vdata[i][2] ));
    mesh.addColor(color);
    color.setHue(hue);
    hue -= 20.f;

    for (int i=0; i<6; ++i)
    {
        mesh.addIndex(indices[i][0]);
        mesh.addIndex(indices[i][1]);
        mesh.addIndex(indices[i][2]);
        mesh.addIndex(indices[i][3]);
    }
}

myVbo.setMesh(mesh, GL_STATIC_DRAW);
}

void cube::draw()
{
    myVbo.drawElements(GL_QUADS, 24);
}

void cube::update()
{

}

testApp.h

#pragma once

#include "ofMain.h"
#include "cube.h"

class testApp : public ofBaseApp{
public:
void setup();
void update();
void draw();

ofEasyCam camera;
cube *cube1;
cube *cube2;
cube *cube3;

void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
};

testApp.cpp

#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup()
{
glEnable(GL_DEPTH_TEST);
ofBackground(33, 33, 33);

cube1 = new cube(50, 100, 25);
cube2 = new cube(300, 50, 80);
cube3 = new cube(250, 160, 30);
}

//--------------------------------------------------------------
void testApp::update()
{

}

//--------------------------------------------------------------
void testApp::draw()
{
camera.begin();

cube1->draw();

ofPushMatrix();
ofTranslate(40, 60);
cube2->draw();
ofPopMatrix();

ofPushMatrix();
ofTranslate(80, 100);
cube3->draw();
ofPopMatrix();
}

/*other code*/

2 个答案:

答案 0 :(得分:1)

很抱歉,由于我没有足够的声誉,我无法发表评论。 我无法通过阅读找到代码中的错误,所以我很快就在OF中运行了它,你可以看到...... enter image description here

这里没问题......我在VS2012Express上运行OF 0.8 - Win7 i7 nVidia Quatro 4000.

编辑:也许这是编译器问题?我有一个无法编译的插件有这样的问题。但这只是一个疯狂的猜测...

编辑:我刚注意到安东尼回答了他自己的问题,当我终于弄明白为什么会发生这种情况。我还是不能添加评论,所以......  事实是static变量的值对于所有类的实例都是相同的。它有更多的东西,但通常,如果你在一个对象中更改静态变量(比如说static int width),那么所有这些变量都会发生变化。

以下是它的样子:)

enter image description here

答案 1 :(得分:1)

在梳理代码并测试不同的东西之后,我找到了修复程序。我只是从staticGFloat数组中删除了GLint。我仍然不明白为什么完全,但它有效。