【问题标题】:SDL Window won't change colors (C++)SDL 窗口不会改变颜色 (C++)
【发布时间】:2016-06-28 09:09:38
【问题描述】:

问题: 首先,我对 C++ 很陌生,所以我才刚刚开始。我目前正在进行的一项练习是让我创建一个“粒子爆炸”,如您在窗口标题中所见,然后让它闪烁不同的颜色,如您在 main.cpp 中所见。

我的问题: 每当我在 VS2015 中运行它时,我都会打开控制台,窗口会打开,但它不会闪烁任何颜色,它只是保持白色。一切似乎都运行良好,并且没有冻结或有任何错误。只是。没有。颜色。

有人看到我犯的错误吗?创建后,我将其与练习进行了比较,但一切似乎 100% 完全相同。

我正在使用 W7、VS2015 并使用 SDL2 库。

ma​​in.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();
};

}

【问题讨论】:

  • 您的渲染是在 Screen::update() 内部完成的,但看起来它从未被调用过。
  • 就是这样!新增 //绘制屏幕 screen.update();

标签: c++ window sdl sdl-2


【解决方案1】:

正如 Elderbug 所说,我只需要将函数添加到我的对象中即可进行渲染。

//绘制屏幕 screen.update();

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多