0

ゲームを開発していますが、画面にまったく描画できないようです。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 );
}

最後に、ここに ny 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;
}
4

2 に答える 2

0

SDL_Flip()ビデオ サーフェスへの変更を表示するには、フレームごとに関数を使用する必要があります。関数の引数は、ウィンドウの SDL_Surface へのポインタです。

于 2012-04-09T23:27:41.447 に答える
0

わかりました。my_direction を初期化するのを忘れていたので、スプライトが意味のない場所をトリミングしていました。最終的に 32x32 の黒のイメージになり、それを黒の表面にブリットして非表示にしました。

于 2012-04-11T14:05:48.743 に答える