2012-04-09 107 views
0

我正在开发一款游戏,而我似乎无法画出屏幕。当我调用SDL_BlitSurface时,没有任何反应。但是,它不返回错误代码。我编写了一个类来处理图像精灵,当我用调试器进行扫描时,我发现它正在返回表面的非空值,以便传输到主视频表面。但是,当我打电话给我的绘图功能时,它什么都不做。我已经确认像素值完全不会改变表面。我究竟做错了什么?SDL_BlitSurface()没有效果

这里是我的main.cpp:

//Standard libs 
#include <SDL.h> 

//Our gaming base 
#include "game_base.h" 

//SDL redefines main as winmain, but this is a console application so we don't want that 
#undef main 

const int MAX_FPS = 80; 

int main (int argc, char* argv[]) { 
    //Initialization 
    System game(false, 640, 480, "Platformer", MAX_FPS); //Create a game that is not fullscreen with a resolution of 640x480 
    SDL_Surface *buffer = NULL; 
    Input *input = NULL; 
    buffer = game.get_buffer(); 
    Image_Sprite *player_sprite = NULL; 
    player_sprite = new Image_Sprite("data/player.bmp", 1, 4); 
    SDL_Rect hitbox; 
    hitbox.w = 32; 
    hitbox.h = 32; 
    hitbox.x = 0; 
    hitbox.y = 0; 
    Player player(100, 100, hitbox, 1.0, RIGHT, player_sprite); 
    //Main game loop 
    while(!game.check_is_done()) { 
     game.refresh_top(); 
     player.draw(buffer); 
     game.refresh_bottom(); 
    } 

    //Cleanup 
    delete input; 
    delete player_sprite; 
} 

这是我使用的绘制函数:

void Character::draw(SDL_Surface *destination) { 
    SDL_Rect coordinates; 
    SDL_Surface *sprite; 
    sprite = my_sprite->get_frame(my_frame, my_direction); 
    coordinates.x = (int)get_x(); 
    coordinates.y = (int)get_y(); 

    SDL_BlitSurface(sprite, NULL, destination, NULL); 
} 

最后,这里是纽约get_frame()函数:

SDL_Surface* Image_Sprite::get_frame(int x, int y) { 
    SDL_PixelFormat *format; 
    format = my_sprite->format; 
    SDL_Surface *frame = SDL_CreateRGBSurface(my_sprite->flags, my_frame_width, my_frame_height, format->BitsPerPixel, 
                format->Rmask, format->Gmask, format->Bmask, format->Amask); 
    SDL_Rect *frame_crop = new SDL_Rect; 
    frame_crop->x = my_frame_width * x; 
    frame_crop->y = my_frame_height * y; 
    frame_crop->w = my_frame_width; 
    frame_crop->h = my_frame_height; 

    SDL_Rect *coordinates = new SDL_Rect; 
    coordinates->x = 0; 
    coordinates->y = 0; 

    SDL_BlitSurface(my_sprite, frame_crop, frame, coordinates); 
    delete frame_crop; 
    return frame; 
} 

回答

0

您需要使用每帧功能SDL_Flip()才能使视频表面的更改可见。该函数的参数是一个指向你窗口的SDL_Surface的指针。

+0

SDL_Flip(buffer)是System :: refresh_bottom()的一部分。我很抱歉如果我没有说清楚。 – 2012-04-09 23:29:35

0

好吧,我想通了。我忘记初始化my_direction,因此精灵正在裁剪一个无意义的位置。我最终得到了一张32x32的黑色图像,然后我将其拍摄到黑色表面上,使其不可见。