首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >擦除线的SDL2函数?

擦除线的SDL2函数?
EN

Stack Overflow用户
提问于 2019-05-12 15:45:20
回答 1查看 201关注 0票数 0

我正在制作一个创建线条的程序,我如何擦除一行呢?有什么功能吗?

我已经尝试过使用SDL_RenderClear(),但是它没有起作用。(请注意,我是一个初学者,我不是美国本土人,我也只有10岁,所以用简单的方式来解释。)

下面是我创建代码的行:

代码语言:javascript
复制
#include <iostream>
#include <SDL.h>

using namespace std;

int main( int argc, char * argv[] )
{
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window *janela = NULL;
    SDL_Renderer *renderer = NULL;
    bool roda = true;
    SDL_Event evento;
    int x;
    int y;
    int x2;
    int y2;
    janela = SDL_CreateWindow( "janela" , SDL_WINDOWPOS_CENTERED , SDL_WINDOWPOS_CENTERED ,500 , 500 , SDL_WINDOW_RESIZABLE);
    renderer = SDL_CreateRenderer(janela , -1 , SDL_RENDERER_ACCELERATED);


    while (roda) {
    SDL_Event evento;
    while (SDL_PollEvent(&evento)) {
       switch(evento.type){

         case SDL_QUIT:
         roda = false;
         break;

         case SDL_MOUSEBUTTONDOWN:{
         x = evento.motion.x;
         y = evento.motion.y;
         break;}

         case SDL_MOUSEBUTTONUP:
         while(roda){
         x2 = evento.motion.x;
         y2 = evento.motion.y;
         SDL_SetRenderDrawColor(renderer , 255 , 0 , 0 , 255);
         SDL_SetRenderDrawColor(renderer , 125 , 234 , 253 , 255);
         SDL_RenderDrawLine(renderer , x , y , x2 , y2);
         SDL_RenderPresent(renderer);
         break;}

         case SDL_KEYDOWN:{
         switch(evento.key.keysym.sym){
         case SDLK_b:{


          SDL_RenderClear(renderer);


             }
            }
           }
          }
         }
        }


    SDL_DestroyWindow(janela);
    janela = NULL;
    SDL_DestroyRenderer(renderer);
    renderer = NULL;
    SDL_Quit();

    return 1;
}

我所期待的是,线将被删除,但它没有发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-13 17:11:20

典型的主回路基本上如下:

代码语言:javascript
复制
while(!quit) {
    while(pool_event()) {
        // change state to react to event
    }

    clear_previous_frame();
    for each line {
        draw_line();
    }
    present();
}

因此,您应该始终清除并重新绘制线条,如果事件是这样的,则添加新的行状态(但还不能绘制它--事件处理不应该这样做,否则就会变得非常编译)。保留以前帧的内容并添加更多行是有问题的;简短的解释是因为RenderPresent文档表示The backbuffer should be considered invalidated after each present (而长解释基本上是它这么说的原因列表)。

要跟踪要绘制的线条,您需要将它们保存在某个地方。std::vector可能是一个简单的选项,如果您的需求不违背它。

总之,您的问题修改后的代码中有一些注释:

代码语言:javascript
复制
#include <vector>
#include <SDL.h>

struct line {
    int x0, y0, x1, y1;
};

int main( int argc, char * argv[] )
{
    SDL_Init(SDL_INIT_EVERYTHING);

    SDL_Window *janela = NULL;
    SDL_Renderer *renderer = NULL;
    bool roda = true;
    int x;
    int y;
    janela = SDL_CreateWindow( "janela" , SDL_WINDOWPOS_CENTERED , SDL_WINDOWPOS_CENTERED ,500 , 500 , SDL_WINDOW_RESIZABLE);
    renderer = SDL_CreateRenderer(janela , -1 , SDL_RENDERER_ACCELERATED);

    std::vector<line> lines;

    while (roda) {
        SDL_Event evento;
        while (SDL_PollEvent(&evento)) {
            switch(evento.type){
            case SDL_QUIT:
                roda = false;
                break;

            case SDL_MOUSEBUTTONDOWN:
                // save starting coordinates
                x = evento.motion.x;
                y = evento.motion.y;
                break;

            case SDL_MOUSEBUTTONUP: {
                // add new line to draw
                line l = { x, y, evento.motion.x, evento.motion.y };
                lines.push_back(l);
            } break;

            case SDL_KEYDOWN:
                if(evento.key.keysym.sym == SDLK_b) {
                    // drop lines
                    lines.resize(0);
                }
                break;
            }
        }

        // clear previous contents - in most cases, screen content is
        // invalidated after RenderPresent and you need to draw again
        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);    // your 'clear' colour
        SDL_RenderClear(renderer);

        // draw all accumulated lines
        SDL_SetRenderDrawColor(renderer, 125, 234, 253, 255);    // your lines colour
        for(const line &l : lines) {
            SDL_RenderDrawLine(renderer, l.x0, l.y0, l.x1, l.y1);
        }

        // all drawn - present
        SDL_RenderPresent(renderer);
    }


    SDL_DestroyWindow(janela);
    SDL_DestroyRenderer(renderer);
    SDL_Quit();

    return 0;   // 0 is 'success' return code, non-0 is failure
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56100868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档