OpenGL移动我的两个形状之一

时间:2017-03-22 20:30:11

标签: c++ opengl textures sdl-2

我正在SDL中创建一个游戏,其中所有内容都必须在OpenGL中绘制。我画了两种不同纹理的形状并添加了键盘控件。我的问题只是我的Player纹理形状应该是可控的,而是我的两个形状都被粘在一起,我认为控制敌人位置的矢量不是。我抽的时候是我的问题吗?我怎么做到这一点我的播放器控件只移动播放器的形状。

//Declare transform and model matrix.
    glm::mat4 Model;  glm::mat4 Rotation; glm::mat4 View;
    glm::mat4 Projection;

    glm::vec3 Player = glm::vec3(2.0f, 0.5f, -1.0f);
    GLfloat playermovespeed = 0.1f;

    Projection = glm::ortho(0.0f, 4.0f, 0.0f, 3.0f, -1.0f, 100.0f);

    Model = glm::translate(Model, Player);
    GLint ProjectionLocation = glGetUniformLocation(shaderProgram, "ProjectionMat");
    glUniformMatrix4fv(ProjectionLocation, 1, GL_FALSE, glm::value_ptr(Projection));

    SDL_GetWindowSize(window, &w, &h);   glViewport(0, 0, w, h);
    while (WindowOpen)
    {
        glBindVertexArray(VAO);
        glBindTexture(GL_TEXTURE_2D, texture[0]);
        Model = glm::mat4();
        Model = glm::translate(Model, glm::vec3(0.0f, 15.0f, 5.0f)); //Position of enemy shape
        GLint ModelLocation = glGetUniformLocation(shaderProgram, "ModelMat");
        GLint ViewLocation = glGetUniformLocation(shaderProgram, "ViewMat");
        //glUniformMatrix4fv(ModelLocation, 1, GL_FALSE, glm::value_ptr(Model*Rotation));
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindVertexArray(0);

        //Player texture
        glBindVertexArray(VAO);
        glBindTexture(GL_TEXTURE_2D, textureA);
        Model = glm::mat4();                         //y
        Model = glm::translate(Model, Player); //Position control of ship.
        ModelLocation = glGetUniformLocation(shaderProgram, "ModelMat");
        glUniformMatrix4fv(ModelLocation, 1, GL_FALSE, glm::value_ptr(Model));
        glUniformMatrix4fv(ViewLocation, 1, GL_FALSE, glm::value_ptr(View));
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindVertexArray(0);

        SDL_GL_SwapWindow(window);
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
                WindowOpen = false;
            if (event.type == SDL_KEYDOWN)
            {
                switch (event.key.keysym.sym)
                {
                case SDLK_RIGHT:
                    Player.x += playermovespeed;
                    break;
                case SDLK_LEFT:
                    Player.x -= playermovespeed;
                    break;
                default:
                    break;
                }
            }
        }
    }
}

但是,以防万一我也是如何设置所有内容。

GLfloat vertices[] = {
        0.5f,  0.5f, 0.0f,    1.0f, 1.0f,   // Top Right
        0.5f, -0.5f, 0.0f,    1.0f, 0.0f,   // Bottom Right
        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f,   // Bottom Left
        -0.5f,  0.5f, 0.0f,   0.0f, 1.0f,
    };
    GLuint indices[] = {   start from 0!
        0, 1, 3,   
        1, 2, 3,
    };

//Load image Enemy; //Load image Player; //Load shaders;

GLuint VBO;
    glGenBuffers(1, &VBO);
    GLuint EBO;
    glGenBuffers(1, &EBO);
    GLuint texture[2];
    glGenTextures(2, texture);
    glBindTexture(GL_TEXTURE_2D, texture[0]);

    //set texture parameters. First texture.

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w, image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);
    SDL_FreeSurface(image);

    //Second texture same way as first; //Set texture parameters

    GLuint VAO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);
    glBindVertexArray(0);

0 个答案:

没有答案