【问题标题】:How can I implement double buffering in my c++ game?如何在我的 C++ 游戏中实现双缓冲?
【发布时间】:2015-12-14 15:46:07
【问题描述】:

我有闪屏的问题,我知道我需要使用双缓冲来修复它,但我不知道如何以及在我的游戏中添加它的位置。如果由于某种原因我不能使用它,有没有其他方法可以减少闪烁,因为使用更大的地图会变得更糟。以下是部分代码:

    `const char HEIGHT=11, WIDTH=54;
     unsigned char maze[HEIGHT][WIDTH]={

     "##############################",
     "#  !#      # ###  ##         #",
     "# ### ###  # !!  ### ####### #        GAME OF THRANS",
     "#     #    #####  ## # !!  # #",
     "######## #  ##     # ####  # #      R-restart  Q-quit",
     "#  !   # #   #  #  #       # #            M-menu",
     "### ## # ### #  #! #### ######",
     "#   !# #  ## #  ####  # # !! #                  W",
     "# #### ## ## #   #    # #### #      Controls:  A-S-D",
     "#         ##   #   #         #",
     "##############################",
     };

     enemy1.x=14;
     enemy1.y=7;
     enemy2.x=22;
     enemy2.y=9;
     enemy3.x=10;
     enemy3.y=3;


      srand(time (NULL));

     while(on){

maze[ppy][ppx]=playerSprite;
maze[gpy][gpx]=goal;
maze[enemy1.y][enemy1.x]=enemy1.sprite;
maze[enemy2.y][enemy2.x]=enemy2.sprite;
maze[enemy3.y][enemy3.x]=enemy3.sprite;

for(int y=0; y<HEIGHT;y++){
    cout<<endl;
    for(int x=0;x<WIDTH;x++){
        cout<<maze[y][x];
    }
}
     for(;;){

randNum=rand()%randNumMax+1;
cout<<endl;


        movement=getch();
        switch (movement){
    case'w':
        if (maze[ppy-1][ppx]!='#' &&(maze[ppy-1][ppx]==' '||(maze[ppy-1][ppx]=='G','N','M','Y','!'))){
            maze[ppy][ppx]=' ';
            ppy--;
            moves++;
             if (maze[ppy][ppx]=='!'){
                Beep(400,150);
                points++;

             }`

【问题讨论】:

  • cout 输出许多字符会给你闪烁的屏幕/whateveryouwannacallit。如果你想使用“控制台图形”,你应该使用curses(特别是:ncurses for Linux and pdcurses for Windows)

标签: c++ double-buffering


【解决方案1】:

您不能真正使用标准 C++ 控制台 io 进行通常意义上的“双缓冲”。对于图形,双缓冲传统上意味着将所有渲染到屏幕外的后缓冲区,然后在 v-blank 期间将其与前缓冲区切换以避免闪烁。标准 C++ 中的控制台输出没有什么直接等价的。

您可以尝试一些“本着”双缓冲的“精神”。使用stringstream 构建您的最终字符串,而不是直接输出到cout,然后使用一次写入cout 一次性显示整个字符串。这可能会减少您的闪烁。

附带说明,您可能希望避免在输出的每一行之后使用endl,因为它会刷新不是您想要的输出流。请改用'\n',仅当您真正想在“帧”末尾刷新时才使用endl

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2012-05-21
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2014-10-10
    • 2010-12-23
    • 2018-12-22
    相关资源
    最近更新 更多