C SDL VS 代码图像未显示

C SDL VS Code image is not displaying

我最近开始用C语言学习游戏编程。我在linux Ubuntu上使用虚拟工作室代码,并且图像star.png没有显示在屏幕上,有vs 代码没有报告任何错误或问题。我试过重新安装 sdl2-dev 和 sdl2-image-dev 库。可能是 SDL 的问题,也可能是我的代码(2013 年写的)。

代码应该在蓝色屏幕上绘制一个我可以四处移动的白色矩形,并在 window 的左上角放置一个星号。除了放置一颗星星,它什么都做。

代码:(没有显示 "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;
}

TL;DR:您的意图是执行比较,但您使用的是 赋值运算符 (即 =)而不是比较运算符 ==.


您的 if 语句中的条件表达式:

if(starSurface = NULL)
{
   ...  
}

不检查 starSurface 是否为 NULL。表达式 starSurface = NULLNULL 赋值给 starSurface 并求得 NULL。因此,条件评估为 false,并且不显示任何错误消息。

相反,您应该这样写(注意下面的双 =):

if (starSurface == NULL)

或者只是:

if (!starSurface)