2011-12-29 22 views
0

如果我只是翻转单个曲面(我从SDL_SetVideoMode返回的曲面),我一直试图翻转曲面并取得了成功。如果我尝试翻转表面,我从SDL_DisplayFormat回来,没有任何反应。我附上显示我的问题的演示代码:SDL:无法翻转多个表面

#include <stdio.h> 
#include <stdlib.h> 
#include "SDL/SDL.h" 

void main() 
{ 
    int i; 
    SDL_Surface *mysurface1; 
    SDL_Surface *mysurface2; 
    char *pxl; 

    SDL_Init(SDL_INIT_EVERYTHING); 

    mysurface1 = SDL_SetVideoMode(640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE); 

    for (i = 0; i < 20; i++) 
    { 
      pxl = (char *)mysurface1->pixels + i*mysurface1->pitch + i; 
      *pxl = 100; // Red Line 
    } 

    SDL_Flip(mysurface1); // Works, we see a red line 

    sleep(5); 
    printf("Sleeping for 5...\n"); 

    mysurface2 = SDL_DisplayFormat(mysurface1); 

    for (i = 0; i < 20; i++) 
    { 
      pxl = (char *)mysurface2->pixels + i*mysurface2->pitch + i; 
      *pxl = 255; // White line 
    } 

    SDL_Flip(mysurface2); // White line doesnt appear 

    printf("Done... No white line\n"); 

    sleep(10); 
} 

有没有人见过这个?再次,我想我跟踪到的表面不会显示,如果它的表面我从SDL_DisplayFormat回来。如果我在表面上做到这一点,我从SDL_SetVideoMode回来,然后我看到红线,一切正常。

回答

0

您只能翻转主显示面(使用SDL_SetVideoMode创建的面)。为了让您的其他表面可见,您需要将其粘贴到主表面上。查询SDL_BlitSurface了解如何做到这一点的详细信息。

0

将屏幕传递到SDL_Flip函数。翻转功能修改screen->pixels的值,使其指向屏幕上不可见的表面。

但是,这只适用于视频设备,如SVGA和DGA。在X11上,拨打SDL_Flip(screen)相当于拨打SDL_UpdateRect(screen, 0, 0, 0, 0)

#include <stdio.h> 
#include <stdlib.h> 
#include "SDL/SDL.h" 

void main() 
{ 
    int i; 
    SDL_Surface *screen; 
    char *pxl; 

    SDL_Init(SDL_INIT_EVERYTHING); 
    screen = SDL_SetVideoMode(640, 480, 8, SDL_DOUBLEBUF|SDL_HWSURFACE); 

    printf("Drawing the red line ...\n"); 
    printf("screen->pixels = %p\n", screen->pixels); 
    for (i = 0; i < 100; i++) 
    { 
     pxl = (char *)screen->pixels + i*screen->pitch + i; 
     *pxl = 100; // Red Line 
    } 

    printf("Flip screens\n"); 
    SDL_Flip(screen); // Display the red line 

    printf("Drawing the white line ...\n"); 
    printf("screen->pixels = %p\n", screen->pixels); 
    for (i = 0; i < 100; i++) 
    { 
     pxl = (char *)screen->pixels + i*screen->pitch + i; 
     *pxl = 255; // White line 
    } 

    sleep(3); 
    printf("Flip screens\n"); 
    SDL_Flip(screen); // Display the white line 

    sleep(10); 
} 

在我的Linux笔记本,这款打印:

Drawing the red line ... 
screen->pixels = 0xb6c8c008 
Flip screens 
Drawing the white line ... 
screen->pixels = 0xb6c8c008 
Flip screens 

screen->pixels的价值是一样的,但是这仅仅是因为X11翻页操作是一个空操作。在诸如SVGA或DGA的视频设备上,这两个值将会不同。

0

首先,看起来SDL_Flip()仅适用于与屏幕或窗口相对应的表面,如SDL_SetVideoMode()创建的表面。你的其他表面不在屏幕上;双缓冲(或翻转它)没有多大意义,并且它很可能不是双缓冲。作为屏幕外的表面,只有在您使用SDL_BlitSurface()或类似功能将其显示到显示器表面时,它才会出现 - 然后,您在下一次翻转显示器表面时就会看到更改。

本质上,mysurface2实际上并没有显示在您的显示屏上,除非您将它放在显示屏上,将其拍到的表面上。如果更换了以下内容:

SDL_Flip(mysurface2); // White line doesnt appear 

有了这个:

SDL_BlitSurface(mysurface2,NULL,mysurface1,NULL); 
SDL_Flip(mysurface1); 

...那么,你希望你的代码可能会工作。