2017-01-31 9 views
3

に私の完全なコードのリリースに -どのように正しくキーを押しを検出し、SDL2

#include <SDL.h> 
#include <SDL_opengl.h> 
#include <GL\GLU.h> 
#include <fstream> 

using namespace std; 


int index = 0; 
int speed = 0; 
int frames = 0; 
int lasttime = 0; 
int mousex = 0; 
int mousey = 0; 
bool postRedraw = true; 

int screenWidth = 640; 
int screenHeight = 480; 
float screenAspect = screenWidth/screenHeight; 

bool init(); 
bool initGL(); 
void handleKeys(unsigned char key, int x, int y); 
void update(); 
void render(); 
void close(); 
void Initialize(); 
void handleEvents(); 


ofstream logFile; 

SDL_Window* gWindow = NULL; 
bool isRunning = true; 
SDL_GLContext gContext; 
float xpos = 0.0; 
float ypos = 0.0; 
float zpos = 0.0; 


void Initialize() 
{ 
    gluPerspective(60.0f, screenAspect, 1.0, 400.0); 
    glEnable(GL_COLOR_MATERIAL); 
    glEnable(GL_NORMALIZE); 
    glTranslatef(0.0f, 0.0f, -5.0f); 
    glFrontFace(GL_CCW); 
    glEnable(GL_LIGHT0); 
} 


void render() 
{ 
    glTranslatef(xpos, ypos, zpos); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(1.0, 0.0, 0.0); 
    glBegin(GL_TRIANGLES); 
     glVertex3f(-1.0f,0.0f,-1.0f); 
     glVertex3f(0.0f, 1.0f, -1.0f); 
     glVertex3f(0.0f, 2.0f, -2.0f); 
    glEnd(); 
    postRedraw = true; 
} 


void handleEvents() 
{ 
    const Uint8* keystates = SDL_GetKeyboardState(NULL); 
    if(keystates[SDL_GetScancodeFromKey(SDLK_w)]) 
    { 
     zpos += 0.01; 
    } 
    if(keystates[SDL_GetScancodeFromKey(SDLK_s)]) 
    { 
     zpos -= 0.01; 
    } else { 
    } 
} 

bool init() 
{ 
    bool success = true; 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     logFile<<"SDL could not initialize! SDL Error: "<<SDL_GetError()<<endl; 
     success = false; 
    } 
    else 
    { 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 
     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); 
     gWindow = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, screenWidth, screenHeight, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); 
     if(gWindow == NULL) 
     { 
      logFile<<"Window could not be created! SDL Error: "<<SDL_GetError()<<endl; 
      success = false; 
     } 
     else 
     { 
      gContext = SDL_GL_CreateContext(gWindow); 
      if(gContext == NULL) 
      { 
       logFile<<"OpenGL context could not be created! SDL Error: "<<SDL_GetError()<<endl; 
       success = false; 
      } 
      else 
      { 
       if(SDL_GL_SetSwapInterval(1) < 0) 
       { 
        logFile<<"Warning: Unable to set VSync! SDL Error: "<<SDL_GetError()<<endl; 
       } 
       if(!initGL()) 
       { 
        logFile<<"Unable to initialize OpenGL!"<<endl; 
        success = false; 
       } 
      } 
     } 
    } 
    logFile.open("log.txt"); 
    if(logFile.is_open()) 
    { 
     success = true; 
    } else { 
     success = false; 
    } 
    return success; 
} 

bool initGL() 
{ 
    bool success = true; 
    GLenum error = GL_NO_ERROR; 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    error = glGetError(); 
    if(error != GL_NO_ERROR) 
    { 
     logFile<<"Error initializing OpenGL! "<<gluErrorString(error)<<endl; 
     success = false; 
    } 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 
    error = glGetError(); 
    if(error != GL_NO_ERROR) 
    { 
     logFile<<"Error initializing OpenGL! "<<gluErrorString(error)<<endl; 
     success = false; 
    } 
    glClearColor(0.f, 0.f, 0.f, 1.f); 
    error = glGetError(); 
    if(error != GL_NO_ERROR) 
    { 
     logFile<<"Error initializing OpenGL! "<<gluErrorString(error); 
     success = false; 
    } 

    return success; 
} 


void close() 
{ 
    logFile.close(); 
    SDL_DestroyWindow(gWindow); 
    gWindow = NULL; 
    SDL_Quit(); 
} 

int main(int argc, char* args[]) 
{ 
    if(!init()) 
    { 
     logFile<<"Failed to initialize!"<<endl; 
    } 
    else 
    { 

     SDL_Event event; 
     Initialize(); 
     lasttime = SDL_GetTicks(); 
     while(isRunning) 
     { 
      while(SDL_PollEvent(&event) != 0) 
      { 
       if(event.type == SDL_QUIT) 
       { 
        isRunning = false; 
       } else if(event.type == SDL_MOUSEMOTION) { 
        SDL_GetMouseState(&mousex, &mousey); 
       } else if(event.type == SDL_MOUSEBUTTONDOWN) { 
        SDL_GetMouseState(&mousex, &mousey); 
       } else if(event.type == SDL_MOUSEBUTTONUP) { 
        SDL_GetMouseState(&mousex, &mousey); 
       } 
      } 
      handleEvents(); 
      if(postRedraw) 
      { 
       postRedraw = false; 
       render(); 
       SDL_GL_SwapWindow(gWindow); 
      } 
      if((SDL_GetTicks()-lasttime)>=1000) 
      { 
       lasttime = SDL_GetTicks(); 
       speed = frames; 
       logFile<<speed<<endl; 
       frames = 0; 
      } else { 
       frames++; 
      } 
     } 
    } 

    close(); 

    return 0; 
} 

上記のコードは、単にテストのために、私は問題がある最小限のコードがあるさ -

期待
void handleEvents() 
{ 
    const Uint8* keystates = SDL_GetKeyboardState(NULL); 
    if(keystates[SDL_GetSancodeFromKey(SDLK_w)]) { 
     zpos += 0.01; 
    } 
    if(keystates[SDL_GetScancodeFromKey(SDLK_s)]) 
    { 
     zpos -= 0.01; 
    } else { 
    } 
} 

: w/sキーが押されている間に、描画されたトングルが前後に移動します。

出力: 三角形は、キーが離されても希望の方向に移動し続けます。

+0

最後の2つの質問は無関係であり、この質問を広すぎて閉鎖する可能性が高いので、この2つの質問を削除することをお勧めします。彼らの答えに本当に関心があるなら、もう2つ質問してください。 – user4581301

+1

これはタイプミスですか? 'const Uint8 * keystates = SDL_GetKeyboardState(NULL); {'ここには' if'はありませんが、コードの大きなブロックに 'if'があります。 – synchronizer

+2

これは間違いで、私は質問を更新しました – ShadowDoom

答えて

4

時間の経過とともにマトリックスの変更が蓄積されます。 glTranslatefが変更されます現在マトリックスが翻訳されています。次のフレームは再びそれを変更する。もう一度、....

あなたはglLoadIdentity()と電話をリセットします。現在選択されている行列を変更し、Initializeで行列の変更を元に戻すことに注意してください(少なくともglTranslatef - 透視図はGL_PROJECTIONの行列になっていなければなりません)。

関連する問題