【问题标题】:SDL C++ Moving a rectangle automaticallySDL C++ 自动移动矩形
【发布时间】:2016-01-12 22:08:25
【问题描述】:

我正在尝试创建一个较小的游戏,我需要一个矩形在窗口内从左向右移动。请注意,这不是完整的代码。下面是一个创建的窗口类的sn-p和它的run函数。

我可以画出矩形,现在它也在移动。但是,当我向上/向下按下时,它也会向右移动,但我希望它自动完成。如果我将调用movement() 的for 循环移动到while 之外(我认为它应该......?),矩形就会消失。

另外需要注意的是,运动应该通过矢量pcEnhet 调用,因为稍后我将与其他精灵一起使用它。

void Spelplan::run() {

    SDL_RenderClear(render);
    for (PCKomponent* k : pcEnhet) 
        k->draw();
    SDL_RenderPresent(render);

    bool spela = true;
    while (spela) {
        SDL_Event eve;

        while (SDL_PollEvent(&eve)) {
            switch (eve.type) {
            case SDL_QUIT:
                spela = false;
                break;
            case SDL_KEYDOWN:
                switch (eve.key.keysym.sym) {
                case SDLK_DOWN:
                    for (PCKomponent* k : pcEnhet)
                        k->knappNer(eve);
                    break;
                case SDLK_UP:
                    for (PCKomponent* k : pcEnhet)
                        k->knappUpp(eve);
                    break;
                }//keysym switch

                SDL_RenderClear(render);
                for (PCKomponent* k : pcEnhet) 
                    k->draw();
                SDL_RenderPresent(render);
            }//eve.type switch
            for (PCKomponent* k : pcEnhet) {
                k->movement();
                k->draw();
            }
        }//while SDL_Poll

    }//while spela

}

void Spelare::movement() {
    area.x++;
}
void Spelare::draw() {

    SDL_RenderCopy(sp->getPlan(), spelareTexture, NULL, &area);
}

【问题讨论】:

    标签: c++ while-loop sdl


    【解决方案1】:

    不要在while (SDL_PollEvent(&eve)) 中进行渲染,而是在while (spela) 中进行渲染。您的项目必须移动/绘制,而不取决于输入是否正在注册。

    while (SDL_PollEvent(&eve)) {
    ...
    }
    
    SDL_RenderClear(render);
    
    for (PCKomponent* k : pcEnhet) {
        k->movement();
        k->draw();
    }
    
    SDL_RenderPresent(render);
    

    删除您在bool spela = true; 行上方的“预渲染”代码,并记住从现在开始使您的事件循环与此类似。

    请注意,除了移动所有对象之外,您还可以将它们视为静止的并仅移动相机(视口),您可以使用相机在其draw 函数中计算对象的绝对坐标。

    另外,从两者中选择一个:

    spela = false; // will render one last frame
    break;         // ^ will not, and does not require spela variable at all
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2014-12-02
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多