0

If I were to write a working code of what I want to accomplish, it would be this:

Sprite s1(img_path1);
Sprite s2(img_path2);
Sprite s[] = { s1, s2 }

I want to create the objects inside the {} of array declaration instead of first putting the objects into variables and then in the array.

I checked out this post before asking this question and I will clarify a few things first:

  1. I am compiling with -std=c++11
  2. I have not defined a copy constructor of my own

I'm trying to create an array like this:

Sprite s[] =
{
    Sprite(img_path1),
    Sprite(img_path2)
};

After executing that statement, the contents of s are the same as if I created the array of objects using the default constructor:

Sprite s[2];

The problem seems not to be with the default copy constructor because the following executes perfectly fine:

sp = Sprite(img_path);
Sprite sp1(sp);
std::cout << sp1.getAspectRatio();

Relevant code:

/*
 * Sprite.h
 *
*/

#ifndef SPRITE_H
#define SPRITE_H

#include <GL/freeglut.h>
#include <FreeImage.h>
#include <iostream>
#include <stdio.h>

class Sprite
{
    GLuint texture;
    float aspectRatio;
    public:
        Sprite();
        Sprite(std::string path);
        Sprite(GLuint texture, float aspectRatio);
        float getAspectRatio();
        void draw(float x, float y, float alpha, float size);
        virtual ~Sprite();
    protected:
    private:
};

#endif // SPRITE_H



/*
 * Sprite.cpp
 *
*/

#include "Sprite.h"

Sprite::Sprite()
{
    //ctor
}

Sprite::Sprite(std::string file) {
    GLuint texture = 0;
    int sWidth, sHeight;
    if (texture == 0)
    {
        FIBITMAP* bitmap = FreeImage_Load(
            FreeImage_GetFileType(file.c_str(), 0),
            file.c_str());

        if (bitmap == NULL) {
            printf("Could no load image file %s\n", file.c_str());
        }

        glGenTextures(1, &texture);
        printf("%d\n", texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        FIBITMAP *pImage = FreeImage_ConvertTo32Bits(bitmap);
        int nWidth = sWidth = FreeImage_GetWidth(pImage);
        int nHeight = sHeight = FreeImage_GetHeight(pImage);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight,
            0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage));

        FreeImage_Unload(pImage);

        FreeImage_Unload(bitmap);
    }
    this->texture = texture;
    this->aspectRatio = (float)sWidth / sHeight;
    if(texture == 0) {
        std::cout << file << std::endl;
    }
}

Sprite::Sprite(GLuint t, float as) : texture(t), aspectRatio(as) {}

void Sprite::draw(float x, float y, float alpha, float size) {
    float h = size;
    float w = size * aspectRatio;
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glDepthMask(GL_FALSE);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glColor4f(1.0, 1.0, 1.0, alpha);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y);
    glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y + h);
    glTexCoord2f(1.0f, 1.0f); glVertex2f(x + w, y + h);
    glTexCoord2f(1.0f, 0.0f); glVertex2f(x + w, y);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_BLEND);
    glDepthMask(GL_TRUE);
    glPopMatrix();
}

float Sprite::getAspectRatio() { return aspectRatio; }

Sprite::~Sprite()
{
    //dtor
}




/*
 * main.cpp (extract)
 *
*/

#include "Globals.h"
#include <GL/freeglut.h>
#include "Sprite.h"

void render();

std::string img_path = "/home/saurabh/Dropbox/Code/C/OpenGL_Game/images/";

Sprite s[] =
{
    Sprite(img_path + "gait-right-1.gif"),
    Sprite(img_path + "gait-right-0.gif"),

    Sprite(img_path + "gait-left-1.gif"),
    Sprite(img_path + "gait-left-0.gif"),

    Sprite(img_path + "gait-top-1.gif"),
    Sprite(img_path + "gait-top-0.gif"),

    Sprite(img_path + "gait-bottom-1.gif"),
    Sprite(img_path + "gait-bottom-0.gif")
};

int main(int argn, char** argc) {
    FreeImage_Initialise();
    glutInit(&argn, argc);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(GV.windowWidth, GV.windowHeight);
    glutCreateWindow("Monogatari");
    glutDisplayFunc(render);
    glutIdleFunc(render);
    glutMainLoop();
    FreeImage_DeInitialise();
}

void render() {
    s[0].draw(0,0,1,0.5);
}
11
  • 1
    Questions seeking debugging help ("why isn't this code working?") must include the desired behavior, a specific problem or error and the shortest code necessary to reproduce it in the question itself. Commented Mar 18, 2016 at 9:12
  • 2
    Can you please try to create a Minimal, Complete, and Verifiable Example, because with a (very simple) example I can't replicate your problem Commented Mar 18, 2016 at 9:13
  • I have implemented neither the destructor, copy constructor nor the copy assignment operator. Commented Mar 18, 2016 at 9:42
  • 1
    @Saurabh the constructors are executed before opengl is actually initialized (before the execution flow enters main). I'm not sure if this is allowed. I'd start with moving the array inside main Commented Mar 18, 2016 at 11:08
  • 1
    Wow thanks! That did the trick! faith in c++ restored Commented Mar 18, 2016 at 11:12

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.