2016-05-11 11 views
0

OpenGLを使用してスプライトシート上の2つのテクスチャを入れ替えたいプロジェクトに取り組んでいます。 両方のテクスチャを個別にウィンドウにレンダリングしても問題はありませんが、設定したキーを押すと切り替えることができません。 誰かが私が間違っていることを教えてもらえますか?スプライトシート上のテクスチャ間のスワップ(OpenGL、C++)

#include "LUtil.h" 
#include <IL/il.h> 
#include <IL/ilu.h> 
#include "LTexture.h" 

int gViewportMode = VIEWPORT_MODE_C; 

//Sprite texture 
LTexture gArrowTexture; 

//Sprite area 
LFRect gArrowClips[ 4 ]; 

bool initGL() 
{ 
//Set the viewport 
glViewport(0.f, 0.f, SCREEN_WIDTH, SCREEN_HEIGHT); 

//Initialize Projection Matrix 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, 1.0, -1.0); 

//Initialize Modelview Matrix 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

//Initialize clear color 
glClearColor(0.f, 0.f, 0.f, 1.f); 

//Enable texturing 
glEnable(GL_TEXTURE_2D); 

//Check for error 
GLenum error = glGetError(); 
if(error != GL_NO_ERROR) 
{ 
    printf("Error initializing OpenGL! %s\n", gluErrorString(error); 
    return false; 
} 

//Initialize DevIL 
ilInit(); 
ilClearColour(255, 255, 255, 000); 

//Check for error 
ILenum ilError = ilGetError(); 
if(ilError != IL_NO_ERROR) 
{ 
printf("Error initializing DevIL! %s\n", iluErrorString(ilError)); 
    return false; 
} 

return true; 
} 

bool loadMedia() 
{ 
//Set clip rectangles 
if (gViewportMode == VIEWPORT_MODE_C) { 
gArrowClips[ 0 ].x = 0.f; 
gArrowClips[ 0 ].y = 0.f; 
gArrowClips[ 0 ].w = 330.f; 
gArrowClips[ 0 ].h = 355.f; 

gArrowClips[ 1 ].x = 330.f; 
gArrowClips[ 1 ].y = 0.f; 
gArrowClips[ 1 ].w = 310.f; 
gArrowClips[ 1 ].h = 480.f; 

gArrowClips[ 2 ].x = 0.f; 
gArrowClips[ 2 ].y = 355.f; 
gArrowClips[ 2 ].w = 330.f; 
gArrowClips[ 2 ].h = 125.f; 
} 
else if (gViewportMode == VIEWPORT_MODE_N) { 
gArrowClips[ 0 ].x = 0.f; 
gArrowClips[ 0 ].y = 480.f; 
gArrowClips[ 0 ].w = 330.f; 
gArrowClips[ 0 ].h = 355.f; 

gArrowClips[ 1 ].x = 330.f; 
gArrowClips[ 1 ].y = 480.f; 
gArrowClips[ 1 ].w = 310.f; 
gArrowClips[ 1 ].h = 480.f; 

gArrowClips[ 2 ].x = 0.f; 
gArrowClips[ 2 ].y = 835.f; 
gArrowClips[ 2 ].w = 330.f; 
gArrowClips[ 2 ].h = 125.f; 
} 
//Load texture 
if(!gArrowTexture.loadTextureFromFile("SpriteSheet.png")) 
{ 
    printf("Unable to load texture!\n"); 
    return false; 
} 
return true; 
} 

void update() 
{ 

} 

void render() 
{ 
//Clear color buffer 
glClear(GL_COLOR_BUFFER_BIT); 

//Render arrows 
gArrowTexture.render(0.f, 0.f, &gArrowClips[ 0 ]); 
gArrowTexture.render(SCREEN_WIDTH - gArrowClips[ 1 ].w, 0.f, &gArrowClips[ 1 ]); 
gArrowTexture.render(0.f, SCREEN_HEIGHT - gArrowClips[ 2 ].h, &gArrowClips[ 2 ]); 




//Update screen 
glutSwapBuffers(); 

} 
void handleKeys(unsigned char key, int x, int y) 
{ 
//If the user presses q 
if(key == 'q') 
{ 
gViewportMode++; 
if (gViewportMode > VIEWPORT_MODE_N) 
{ 
gViewportMode == VIEWPORT_MODE_C; 
} 
} 
} 

私は以前、私は私が含まれてちょうど下のint gViewPortModeでVIEWPORT_MODE_CとVIEWPORT_MODE_Nを交換することにより、レンダリングするための異なるテクスチャを取得することができています言ったように。

私の問題は、プログラムを停止し、コードを変更してから、再度テクスチャを変更するためにビューポートを切り替えるkeyコマンドを使用してスワップすることができないということです。

ビューポートの切り替えはこれでは機能しませんか? はいの場合は、代替手段はありますか? いいえの場合は、修正/変更する必要はありますか?

+0

'handleKeys()'では、なぜ 'gViewportMode == VIEWPORT_MODE_C'と等しいかどうかテストして、結果を無視していますか? – genpfault

+0

それはサイクルを続けるのを助けるはずだったが、あなたは私がそのif文を完全に削除できると思っていると言ったので、残念ながら私は自分の家とコンピュータから離れているので、今はそれをテストすることはできません。私はすぐにアップデートを投稿します。 – PocketTNT

+0

更新: 'if(key == 'q')を削除しました { gViewportMode ++; if(gViewportMode> VIEWPORT_MODE_N) { gViewportMode == VIEWPORT_MODE_C; } } ' – PocketTNT

答えて

0

OpenGLコードが正常に表示されます。キーを押すたびに、gArrowClipsを更新するだけです。あなたが提供したコードサンプルから、loadMedia()が呼び出されたときにはgArrowClipsと設定されているようです。 キーを押した後にloadMedia()と決してコールすることはないので、gArrowClipsは決して更新されません。テクスチャの変更は有効になりません。私はloadMedia()は、ファイルからテクスチャのロードを処理し、コードのどこからでも呼び出さないので、プログラムの開始時に一度しか呼び出されないと仮定しています。

私は以下のコードをテストしていませんが、あなたが求めていることを行う必要があります。私は基本的にloadMedia()にあるコードを、gArrowClipsの設定を処理するコードを自分の関数updateSpriteAreas()に移動しました。 loadMedia()が呼び出されてgArrowClipsが初期化され、handleKeys()qキーが押されてスプライトのテクスチャが変更されると、その関数を呼び出します。

#include "LUtil.h" 
#include <IL/il.h> 
#include <IL/ilu.h> 
#include "LTexture.h" 

int gViewportMode = VIEWPORT_MODE_C; 

//Sprite texture 
LTexture gArrowTexture; 

//Sprite area 
LFRect gArrowClips[ 4 ]; 

bool initGL() 
{ 
    //Set the viewport 
    glViewport(0.f, 0.f, SCREEN_WIDTH, SCREEN_HEIGHT); 

    //Initialize Projection Matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0, 1.0, -1.0); 

    //Initialize Modelview Matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    //Initialize clear color 
    glClearColor(0.f, 0.f, 0.f, 1.f); 

    //Enable texturing 
    glEnable(GL_TEXTURE_2D); 

    //Check for error 
    GLenum error = glGetError(); 
    if(error != GL_NO_ERROR) 
    { 
     printf("Error initializing OpenGL! %s\n", gluErrorString(error); 
     return false; 
    } 

    //Initialize DevIL 
    ilInit(); 
    ilClearColour(255, 255, 255, 000); 

    //Check for error 
    ILenum ilError = ilGetError(); 
    if(ilError != IL_NO_ERROR) 
    { 
     printf("Error initializing DevIL! %s\n", iluErrorString(ilError)); 
     return false; 
    } 

    return true; 
} 

//Move the sprite changes to a new function that gets called every time you make changes 
void updateSpriteAreas() 
{ 
    //Set clip rectangles 
    if (gViewportMode == VIEWPORT_MODE_C) { 
     gArrowClips[ 0 ].x = 0.f; 
     gArrowClips[ 0 ].y = 0.f; 
     gArrowClips[ 0 ].w = 330.f; 
     gArrowClips[ 0 ].h = 355.f; 

     gArrowClips[ 1 ].x = 330.f; 
     gArrowClips[ 1 ].y = 0.f; 
     gArrowClips[ 1 ].w = 310.f; 
     gArrowClips[ 1 ].h = 480.f; 

     gArrowClips[ 2 ].x = 0.f; 
     gArrowClips[ 2 ].y = 355.f; 
     gArrowClips[ 2 ].w = 330.f; 
     gArrowClips[ 2 ].h = 125.f; 
    } 
    else if (gViewportMode == VIEWPORT_MODE_N) { 
     gArrowClips[ 0 ].x = 0.f; 
     gArrowClips[ 0 ].y = 480.f; 
     gArrowClips[ 0 ].w = 330.f; 
     gArrowClips[ 0 ].h = 355.f; 

     gArrowClips[ 1 ].x = 330.f; 
     gArrowClips[ 1 ].y = 480.f; 
     gArrowClips[ 1 ].w = 310.f; 
     gArrowClips[ 1 ].h = 480.f; 

     gArrowClips[ 2 ].x = 0.f; 
     gArrowClips[ 2 ].y = 835.f; 
     gArrowClips[ 2 ].w = 330.f; 
     gArrowClips[ 2 ].h = 125.f; 
    } 
} 

bool loadMedia() 
{ 
    //Initialize the sprite rectangles 
    updateSpriteAreas() 

    //Load texture 
    if(!gArrowTexture.loadTextureFromFile("SpriteSheet.png")) 
    { 
     printf("Unable to load texture!\n"); 
     return false; 
    } 
    return true; 
} 

void update() 
{ 

} 

void render() 
{ 
    //Clear color buffer 
    glClear(GL_COLOR_BUFFER_BIT); 

    //Render arrows 
    gArrowTexture.render(0.f, 0.f, &gArrowClips[ 0 ]); 
    gArrowTexture.render(SCREEN_WIDTH - gArrowClips[ 1 ].w, 0.f, &gArrowClips[ 1 ]); 
    gArrowTexture.render(0.f, SCREEN_HEIGHT - gArrowClips[ 2 ].h, &gArrowClips[ 2 ]); 

    //Update screen 
    glutSwapBuffers(); 

} 
void handleKeys(unsigned char key, int x, int y) 
{ 
    //If the user presses q 
    if(key == 'q') 
    { 
     gViewportMode++; 
     if (gViewportMode > VIEWPORT_MODE_N) 
     { 
      gViewportMode == VIEWPORT_MODE_C; 
     } 
     //Update the sprite rectangles so the texture change takes effect 
     updateSpriteAreas(); 
    } 
} 
+0

テクスチャを更新するためには機能しませんでしたので、各ビューポートモードで異なる色の2つの基本クワッドをレンダリングしようとしました。最初のクワッドはうまく描画されましたが、「q」(ウィンドウはちょうど同じままです)を押すと、2番目のウィンドウが表示されませんでしたので、これが私のビューポートで問題になると今は信じています。これは私がいつも私のビューポートを変更するのと同じ方法ですが、今まではこれまで何の問題もありませんでした。誰でも私がこれを解決するために何ができるのか知っていますか?他の選択肢はありますか? – PocketTNT

+0

私はそれをもう少し遊んで、qを押すとレンダリングするために赤いクワッドを得ました。新しい問題は、赤いクワッドがレンダリングされると、テクスチャが赤くなり、さらに悪くなると、qをもう一度押すとクワッドは削除されますが、テクスチャは赤くなります。 – PocketTNT

+0

私はqを押したときに明らかにすべてのテクスチャを白くするhandleKeys()関数に 'glDisable(GL_TEXTURE_2D);'を追加しようとしました。しかし、いったん 'glEnable(GL_TEXTURE_2D);を' gViewportMode ++;の後ろに追加すると、何もしなくなりました。しかし、私はそれを独自のキーコマンドに 'glEnable(GL_TEXTURE_2D);'を置くことによって、白い四角形からテクスチャに戻したり、逆に切り替えることができました。私は今は完全に困惑しており、Googleは必要な答えを持っていません。 – PocketTNT

0

私はその後、私のハンドルであれば、他if文を入れて、単純に2(画像のセットごとに1スプライトシート)に1つのスプライトシートを回すと0の値をint型を追加することで、私の問題を修正キーは、qが押されたかどうかをチェックしてから、intの値をチェックします。 if文で、qを押すとintの値が0の場合、画像が変更され、intに1が追加されます。 else ifステートメントでは、qを押したときにintの値が1であるかどうかをチェックし、イメージを変更してintから1を引きます。

関連する問題