2016-06-28 140 views
-2

問題: 首先,我對C++很陌生,所以我剛剛開始。我現在正在練習的一個練習是讓我創建一個「粒子爆炸」,就像你在窗口標題中看到的那樣,然後讓它閃爍不同的顏色,就像你在main.cpp中看到的那樣。SDL窗口不會改變顏色(C++)

我的問題: 當我在VS2015中運行它時,我的控制檯打開,窗口打開,但它不閃爍任何顏色,只是保持白色。一切似乎都工作得很好,它不凍結或有任何錯誤。只是。沒有顏色。

有沒有人看到我犯的錯誤?一旦我創建它,我將它與練習相比,但似乎100%完全一樣。

我在W7,VS2015和使用SDL2庫。

的main.cpp

#include <iostream> 
#include <SDL.h> 
#include "Screen.h" 
#include <math.h> 
#undef main 

using namespace std; 
using namespace caveofprogramming; 


int main() { 

    Screen screen; 
    if (screen.init() == false) { 
     cout << "Error initialzing SDL." << endl; 
    } 

    while (true) { 
     // Update particles 

     // Draw Particles 
     int elapsed = SDL_GetTicks(); 
     unsigned char green = (1 + sin(elapsed * 0.001)) * 128; 
     unsigned char red = (1 + sin(elapsed * 0.002)) * 128; 
     unsigned char blue = (1 + sin(elapsed * 0.003)) * 128; 

     for (int y = 0; y < Screen::SCREEN_HEIGHT; y++) { 
      for (int x = 0; x < Screen::SCREEN_WIDTH; x++) { 
       screen.setPixel(x, y, red, green, blue); 

      } 
     } 

     //Draw the screen 

     // Check for messages/events 
     if (screen.processEvents() == false) { 
      break; 
     } 
    } 

    screen.close(); 

    return 0; // usually when your program runs ok it returns 0 
} 

Screen.cpp

#include "Screen.h" 
    #include <iostream> 

    namespace caveofprogramming { 

     Screen::Screen() : 
      m_window(NULL), m_renderer(NULL), m_texture(NULL), m_buffer(NULL) { 

     } 

     bool Screen::init() { 
      if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
       return false; 
      } 

      m_window = SDL_CreateWindow("Particle Fire Explosion", 
       SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, 
       SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 

      if (m_window == NULL) { 
       SDL_Quit(); 
       return false; 
      } 

      m_renderer = SDL_CreateRenderer(m_window, -1, SDL_RENDERER_PRESENTVSYNC); 
      m_texture = SDL_CreateTexture(m_renderer, SDL_PIXELFORMAT_RGBA8888, 
       SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT); 

      if (m_renderer == NULL) { 
       SDL_DestroyWindow(m_window); 
       SDL_Quit(); 
       return false; 
      } 

      if (m_texture == NULL) { 
       SDL_DestroyRenderer(m_renderer); 
       SDL_DestroyWindow(m_window); 
       SDL_Quit(); 
       return false; 
      } 

      m_buffer = new Uint32[SCREEN_WIDTH * SCREEN_HEIGHT]; 

      memset(m_buffer, 0, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32)); 

      return true; 
     } 

     void Screen::clear() { 
      memset(m_buffer, 0, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32)); 
     } 

     void Screen::setPixel(int x, int y, Uint8 red, Uint8 green, Uint8 blue) { 

      if (x < 0 || x >= SCREEN_WIDTH || y < 0 || y >= SCREEN_HEIGHT) { 
       return; 
      } 

      Uint32 color = 0; 

      color += red; 
      color <<= 8; 
      color += green; 
      color <<= 8; 
      color += blue; 
      color <<= 8; 
      color += 0xFF; 

      m_buffer[(y * SCREEN_WIDTH) + x] = color; 
     } 

     void Screen::update() { 
      SDL_UpdateTexture(m_texture, NULL, m_buffer, SCREEN_WIDTH * sizeof(Uint32)); 
      SDL_RenderClear(m_renderer); 
      SDL_RenderCopy(m_renderer, m_texture, NULL, NULL); 
      SDL_RenderPresent(m_renderer); 
     } 

     bool Screen::processEvents() { 
      SDL_Event event; 

      while (SDL_PollEvent(&event)) { 
       if (event.type == SDL_QUIT) { 
        return false; 
       } 
      } 
      return true; 
     } 

     void Screen::close() { 
      delete[] m_buffer; 
      SDL_DestroyRenderer(m_renderer); 
      SDL_DestroyTexture(m_texture); 
      SDL_DestroyWindow(m_window); 
      SDL_Quit(); 
     } 
    } 

Screen.h

#pragma once 
#include <SDL.h> 
namespace caveofprogramming { 


class Screen { 
public: 
    const static int SCREEN_WIDTH = 800; 
    const static int SCREEN_HEIGHT = 600; 

private: 
    SDL_Window *m_window; 
    SDL_Renderer *m_renderer; 
    SDL_Texture *m_texture; 
    Uint32 *m_buffer; 

public: 
    Screen(); 
    bool init(); 
    bool processEvents(); 
    void update(); 
    void clear(); 
    void setPixel(int x, int y, Uint8 red, Uint8 green, Uint8 blue); 
    void close(); 
}; 

} 
+1

您的渲染是在'Screen :: update()'內部完成的,但它看起來像它永遠不會被調用。 – ElderBug

+0

就是這樣!添加 //繪製屏幕 screen.update(); – nyk

回答

0

正如Elderbug說,我只需將該函數添加到我的對象進行渲染。

//繪製屏幕 screen.update();

謝謝!