Visual c++ SDL同一屏幕上的多个动画闪烁

Visual c++ SDL同一屏幕上的多个动画闪烁,visual-c++,sdl,flicker,Visual C++,Sdl,Flicker,我正在玩SDL,试图制作一个简单的战斗游戏,比如街头斗士之类的,但我不知道如何在屏幕上一次制作多个动画而不闪烁。由于某些原因,当两个播放器在屏幕上空闲时,它们不会闪烁,但对于其他动画,第二个播放器会闪烁。代码如下所示: 职业球员1: void setrects\u idle(SDL\u Rect*clip)//从bmp图像加载帧 { 对于(int i=0;i9) 帧f=0; 其他的 frame_walkf++; } ******************** 职业球员2: 无效播放器2::空闲(

我正在玩SDL,试图制作一个简单的战斗游戏,比如街头斗士之类的,但我不知道如何在屏幕上一次制作多个动画而不闪烁。由于某些原因,当两个播放器在屏幕上空闲时,它们不会闪烁,但对于其他动画,第二个播放器会闪烁。代码如下所示:

职业球员1:

void setrects\u idle(SDL\u Rect*clip)//从bmp图像加载帧
{
对于(int i=0;i<10;i++){
clip[i].x=0+i*224;
clip[i].y=0;
clip[i].w=224;
clip[i].h=226;
}
}
void setrects_walkf(SDL_Rect*剪辑)
{
对于(int i=0;i<11;i++){
clip[i].x=0+i*224;
clip[i].y=0;
clip[i].w=224;
clip[i].h=226;
}
}
无效播放器::空闲(SDL_表面*屏幕)
{   
如果(!其他行动)
{
SDL_BlitSurface(播放器1_空闲和帧空闲[静态播放(帧空闲)]、屏幕和偏移);
SDL_翻转(屏幕);
如果(帧空闲>8)
帧_空闲=0;
其他的
frame_idle++;
}
}
void player::walkf(SDL_表面*屏幕)
{   
其他行动=正确;
SDL_BlitSurface(播放器1_walkf和帧_walkf[静态播放(帧_walkf)]、屏幕和偏移);
SDL_翻转(屏幕);
如果(帧f>9)
帧f=0;
其他的
frame_walkf++;
}
********************
职业球员2:
无效播放器2::空闲(SDL_表面*屏幕)
{   
如果(!其他行动)
{
SDL_BlitSurface(播放器2_空闲和帧空闲[静态播放(帧空闲)]、屏幕和偏移);
//SDL_Flip(screen);//有了这个注释,两个空闲的播放器上都没有闪烁
如果(帧空闲>8)
帧_空闲=0;
其他的
frame_idle++;
}
}
void player2::walkf(SDL_表面*屏幕)
{   
其他行动=正确;
SDL_BlitSurface(播放器2_walkf和帧_walkf[静态播放(帧_walkf)]、屏幕和偏移);
SDL_Flip(screen);//如果我对此进行评论,则player2根本没有动画。打开它时,它会闪烁。
如果(帧f>9)
帧f=0;
其他的
frame_walkf++;
}
*****************************
SDL_表面*屏幕;
屏幕=SDL_设置视频模式(800、600、32、SDL_表面| SDL_双BUF);
在主循环中:
player1.空闲(屏幕);
player2.空闲(屏幕);
...
案例SDLK\U d:
player1.b[1]=1;
打破
案例SDLK_j:
player2.b[1]=1;
打破
...
if(player1.b[0])
播放器1.walkb(屏幕);
其他的
player1.将_返回到_idle();
if(player2.b[0])
播放器2.walkb(屏幕);
其他的
player2.将_返回到_idle();

您可以多次调用SDL\u Flip。 在主循环中,只调用一次

  • 清除背景
  • 绘制所有对象
  • 翻一次

不要在函数walkf中翻页

为什么不改用SDL2.0?从SDL1.3迁移并不需要很多工作:好的,我正在考虑。我选择1.2是因为互联网上有很多关于它的教程。但是我不认为迁移到2.0会解决我的问题……值得一试。SDL1.2使用软件渲染,除非您使用的是OpenGL。但是SDL2使用开箱即用的硬件渲染。而且,如果您以正确的or方式进行渲染,它也是双缓冲的。
void setrects_idle(SDL_Rect* clip)  //loads the frames from a bmp image
{

    for(int i = 0; i < 10; i ++) {
        clip[i].x = 0 + i*224;                  
        clip[i].y = 0;
        clip[i].w = 224;
        clip[i].h = 226;
    }
}

void setrects_walkf(SDL_Rect* clip)
  {
    for(int i = 0; i < 11; i ++) {        
        clip[i].x = 0 + i*224;                
        clip[i].y = 0;
        clip[i].w = 224;
        clip[i].h = 226;
    }
  }

void player::idle(SDL_Surface* screen)
{   
 if (!other_action)
  {
    SDL_BlitSurface(player1_idle, &frames_idle[static_cast<int>(frame_idle)], screen, &offset);
    SDL_Flip(screen);
 if(frame_idle > 8)
    frame_idle = 0;
 else
    frame_idle ++;
  }
}

void player::walkf(SDL_Surface* screen)
{   
 other_action = true;
 SDL_BlitSurface(player1_walkf, &frames_walkf[static_cast<int>(frame_walkf)], screen, &offset);

 SDL_Flip(screen);

 if(frame_walkf > 9)
  frame_walkf = 0;
 else
  frame_walkf ++;
}

********************
Class player2:

void player2::idle(SDL_Surface* screen)
{   
 if (!other_action)
  {
    SDL_BlitSurface(player2_idle, &frames_idle[static_cast<int>(frame_idle)], screen, &offset);
    //SDL_Flip(screen); //with this commented, there is no flicker on both players idle
 if(frame_idle > 8)
    frame_idle = 0;
 else
    frame_idle ++;
  }
}

void player2::walkf(SDL_Surface* screen)
{   
 other_action = true;
 SDL_BlitSurface(player2_walkf, &frames_walkf[static_cast<int>(frame_walkf)], screen, &offset);

 SDL_Flip(screen); //if I comment this there is no animation for player2 at all. with it on, it flickers.

 if(frame_walkf > 9)
  frame_walkf = 0;
 else
  frame_walkf ++;
}

*****************************
SDL_Surface *screen;
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

In the main loop:

player1.idle(screen);
player2.idle(screen);
...
  case SDLK_d:
      player1.b[1] = 1;
      break;
  case SDLK_j:
      player2.b[1] = 1;
      break;
...
  if(player1.b[0])
    player1.walkb(screen);
  else
    player1.return_to_idle();

  if(player2.b[0])
    player2.walkb(screen);
  else
    player2.return_to_idle();