2012-01-28 86 views
1

當我運行此代碼以嘗試開始編程一個俄羅斯方塊克隆它將屏幕打印到一個小矩形(< 30 * 30),屏幕的所有其他部分都是黑色的(它應該是綠色的)SDL小屏幕

我知道我不應該放棄所有的代碼,但我真的不知道哪來的錯誤

#include <string> 
#include <vector> 
#include "SDL/SDL.h" 

using namespace std; 

const unsigned short SCREEN_WIDTH = 640; 
const unsigned short SCREEN_HEIGHT = 480; 
const unsigned short SCREEN_BPP = 32; 

const unsigned char Block_Length = 20; 

enum Color { 
    Blue = 0, 
    Cyan, 
    White, 
    Red, 
    Yellow, 
    Magenta, 
    Green 
}; 

struct Point { 
    int x, y; 
}; 

struct Block { 
    public: 
     Point l; 
     Color c; 
}; 

vector<Block> blocks; 

SDL_Surface *Screen = NULL; 

void apply_surface(SDL_Surface *Source, SDL_Surface *Target, int x, int y, SDL_Rect *clip = NULL); 
bool init(); 
bool clean_up(); 
void show_blocks(); 

int main(int argc, char** argv) { 
    init(); 

    SDL_FillRect(Screen, NULL, 0x00FF00); 

    for (int i = 0; i < 4; i++) { 
     Block b; 
     b.c = Red; 
     b.l.x = i; 
     b.l.y = i; 
     blocks.push_back(b); 
    } 

    show_blocks(); 

    if (SDL_Flip(Screen) == -1) 
     return 1; 

    SDL_Delay(5000); 

    clean_up(); 

    return 0; 
} 

void apply_surface(SDL_Surface *Source, SDL_Surface *Target, int x, int y, SDL_Rect *clip) { 
    SDL_Rect o; 

    o.x = x; 
    o.y = y; 

    SDL_BlitSurface(Source, clip, Target, &o); 
} 

bool init() { 
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1) 
     return false; 

    if (!(Screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE))) 
     return false; 

    SDL_WM_SetCaption("Hey Tetris!", NULL); 

    return true; 
} 

bool clean_up() { 
    SDL_Quit(); 
} 

void show_blocks() { 
    SDL_Surface *s = SDL_CreateRGBSurface(SDL_SWSURFACE, Block_Length, Block_Length, 32, 0x0, 0x0, 0x0, 0x0); 
    for (int i = 0; i < blocks.size(); i++) { 
     Uint64 bColor; 
     switch (blocks[i].c) { 
      case Blue : bColor = 0x0000FF; break; 
      case Cyan : bColor = 0x00FFFF; break; 
      case White : bColor = 0xFFFFFF; break; 
      case Yellow : bColor = 0xFFFF00; break; 
      case Red  : bColor = 0xFF0000; break; 
      case Magenta : bColor = 0xFF00FF; break; 
      case Green : bColor = 0x00FF00; break; 
     } 
     SDL_FillRect(s, NULL, bColor); 
     apply_surface(s, Screen, blocks[i].l.x * Block_Length, blocks[i].l.y * Block_Length); 
    } 
    SDL_FreeSurface(s); 
} 

回答

1

第一眼,我來到了一個問題: 是SDL_Rect在apply_surface()集是否正確?只設置x和y而沒有寬度和高度,因爲堆棧垃圾會給出一個未定義大小的矩形,因爲矩形不會被默認的構造函數afaik清零。我會設置這些成員等於來源,像這樣:

o.x = x; 
o.y = y; 
o.w = Source->w; 
o.h = Source->h; 
+0

感謝,但沒有它沒有這樣做,問題是與整個渲染的事情,因爲當我充滿屏幕的綠色通過SDL_FillRect只罷了那個小廣場 – 2012-01-28 20:26:54

+0

嗯,剪輯是否啓用? Screen.clip_rect可能很小,可以使用SDL_SetClipRect進行設置。 – Sam 2012-01-28 22:21:05

+0

等待它的工作,我不知道爲什麼剪輯設置得太小,非常感謝。 – 2012-01-29 12:58:17