2012-04-09 6 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 (буфер) является частью System :: refresh_bottom(). Простите, если я не проясню. –

0

Хорошо, я понял. Я забыл инициализировать my_direction, поэтому спрайт обрезал бессмысленное место. Я закончил с черным изображением 32x32, которое затем я распространилось на черную поверхность, сделав ее невидимой.

Смежные вопросы