C SDL VS Изображение кода не отображается - PullRequest
1 голос
/ 11 апреля 2020

Я недавно начал изучать программирование игр на C. Я использую код виртуальной студии на linux Ubuntu, и изображение star.png не отображается на экране, нет ошибок или проблем, о которых сообщается в коде. Я попытался переустановить библиотеки sdl2-dev и sdl2-image-dev. Возможно, это проблема с SDL, или, может быть, с моим кодом (он был написан в 2013 году).

Код должен нарисовать белый прямоугольник, который я могу перемещать, на синем экране и поместить звезду в верхний левый угол окна. Он делает все, кроме размещения звезды.

Код: (не показывает "Cannot dinf star.png!", Так что я думаю, что это не так)

#include <SDL2/SDL.h> 
#include <SDL2/SDL_image.h>
#include <stdio.h>

typedef struct 
{
    int x, y;
    short life;
    char *name;
}Man;

typedef struct          
{
    //players
    Man man;

    //image
    SDL_Texture *star;
} GameState;


/////////////////////////////////////////////////////////////////////processEvents
int processEvents(SDL_Window *window , GameState *game)        
{

    SDL_Event event;
    int done = 0;
        //Check for events

        while (SDL_PollEvent(&event))       
        {
            switch (event.type)             
            {
            case SDL_WINDOWEVENT_CLOSE:     
            {
                if (window)
                {
                    SDL_DestroyWindow(window);
                    window = NULL;
                    done = 1;
                }
            }   
                break;
            case SDL_KEYDOWN:       
            {
                switch (event.key.keysym.sym)
                {
                case SDLK_ESCAPE:
                    done = 1;
                break;

                }
            }
            break;          
            case SDL_QUIT:     
            done = 1;
            break;
            }
        }

    const Uint8 *state = SDL_GetKeyboardState(NULL);    
    if(state[SDL_SCANCODE_LEFT])
    {
        game->man.x -= 1;
    }
    if(state[SDL_SCANCODE_RIGHT])
    {
        game->man.x += 1;
    }
    if(state[SDL_SCANCODE_UP])
    {
        game->man.y -= 1;
    }
    if(state[SDL_SCANCODE_DOWN])
    {
        game->man.y += 1;
    }
    SDL_Delay(10);
    return done;

}

/////////////////////////////////////////////////////////////////////////////////////doRender
void doRedner(SDL_Renderer *renderer, GameState *game)      
{

        SDL_SetRenderDrawColor(renderer , 0, 0, 255, 255); //blue

        //screen clean up into blue
        SDL_RenderClear(renderer);

        //set color
        SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

        SDL_Rect rect = {game->man.x, game->man.y, 80, 80};       
        SDL_RenderFillRect(renderer, &rect);        

        //draw a star
        SDL_Rect starRect = { 50, 50, 64, 64 };                  
        SDL_RenderCopy(renderer, game->star, NULL, &starRect);      

        SDL_RenderPresent(renderer);

}

/////////////////////////////////////////////////////////////////////////////////////main funkction

int main(int argc, char *argv[])
{
    GameState gameState;
    SDL_Window *window = NULL;            
    SDL_Renderer *renderer = NULL;   
    SDL_Surface *starSurface = NULL;       

    SDL_Init(SDL_INIT_VIDEO);       

    gameState.man.x = 340-40;
    gameState.man.y = 240-40; 

    window = SDL_CreateWindow("Game Widnow",            
    SDL_WINDOWPOS_UNDEFINED,                            
    SDL_WINDOWPOS_UNDEFINED,                            
    640,                                                
    480,                                                
    0                                                   
    );
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);       

//load image
starSurface = IMG_Load("star.png");
if(starSurface = NULL)
{
    printf("Cannot find star.png!\n\n");
    SDL_Quit();
    return 1;
}

gameState.star = SDL_CreateTextureFromSurface(renderer, starSurface);       
SDL_FreeSurface(starSurface);                                              

int done = 0;   
    while(!done)        
    {
        //check events
        done = processEvents(window, &gameState);    

        //render
        doRedner(renderer, &gameState);


    }

    SDL_Delay(1000);

    //exit game and free memory
    SDL_DestroyTexture(gameState.star);

    //destroy and close window
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);

    SDL_Quit();

return 0;
}

1 Ответ

0 голосов
/ 11 апреля 2020

TL; DR: вы хотите выполнить сравнение, но вместо оператора сравнения ==.


вы используете оператор присваивания (т. Е. =).

Условное выражение в вашем выражении if:

if(starSurface = NULL)
{
   ...  
}

не проверяет, является ли starSurface NULL. Выражение starSurface = NULL присваивает NULL starSurface и оценивает NULL. Следовательно, условие оценивается как ложное, и сообщение об ошибке не отображается.

Вместо этого вы должны написать (обратите внимание на двойной = ниже):

if (starSurface == NULL)

или просто:

if (!starSurface)
...