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コマンドを使用してスワップすることができないということです。
ビューポートの切り替えはこれでは機能しませんか? はいの場合は、代替手段はありますか? いいえの場合は、修正/変更する必要はありますか?
'handleKeys()'では、なぜ 'gViewportMode == VIEWPORT_MODE_C'と等しいかどうかテストして、結果を無視していますか? – genpfault
それはサイクルを続けるのを助けるはずだったが、あなたは私がそのif文を完全に削除できると思っていると言ったので、残念ながら私は自分の家とコンピュータから離れているので、今はそれをテストすることはできません。私はすぐにアップデートを投稿します。 – PocketTNT
更新: 'if(key == 'q')を削除しました { gViewportMode ++; if(gViewportMode> VIEWPORT_MODE_N) { gViewportMode == VIEWPORT_MODE_C; } } ' – PocketTNT