2011-12-29 26 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); 

...那麼,你希望你的代碼可能會工作。