SDL2와 Odin을 사용한 우주 슈팅 게임 - 2부 - 렌더 플레이어

2826 단어 gamedevodinsdl2

2부 :: 이미지 렌더링


  • Github Repo
  • YouTube Video

  • SDL2 Image Library
  • SDL2 Core Library
  • Odin Documentation



  • 이미지를 렌더링하려면 SDL Image 라이브러리를 초기화해야 합니다.

    이미지를 렌더링하는 단계


  • 사용할 자산 파일 유형에 대해 SDL_Image를 초기화합니다.
  • 텍스처 로드
  • 엔티티의 위치도 추적하는 엔티티 구조체에 해당 텍스처를 유지합니다.
  • SDL.RenderCopy() 이전 장면에 엔티티를 그리기 위해 SDL.RenderPresent()

  • SDL_Image.Init()

    이미지 라이브러리는 SDL_Image.INIT_PNG 플래그를 사용할 때 .png 이미지를 사용할 수 있도록 코어 라이브러리를 확장합니다.

    SDL_Image.LoadTexture()

    2d용으로 렌더링하고 이미지를 조작할 필요가 없는 경우(크기 조정 및 위치 변경 제외), LoadTexture()가 이미지 자산을 로드하는 가장 효율적인 방법입니다. https://wiki.libsdl.org/SDL_image/IMG_LoadTexture을 참조하십시오.

    
    player_texture := SDL_Image.LoadTexture(game.renderer, "assets/player.png")
    assert(player_texture != nil, SDL.GetErrorString())
    
    

    SDL_Image.LoadTexture()는 오류가 발생하면 nil을 반환하므로 코드를 계속 진행하기 전에 확인하는 것이 좋습니다.

    아래 코드에는 실수가 있으며 여기에서 assert()를 사용하지 않은 경우 player.png가 로드되지 않는 이유를 이해하지 못할 수 있습니다.

    
    // try using an assert here to see the problem:
    player_texture := SDL_Image.LoadTexture(game.renderer, "/assets/player.png")
    
    


    엔티티::구조체

    엔티티 구조는 SDL.RenderCopy() 에 대한 후속 호출에 필요한 엔티티 위치 및 로드된 텍스처를 추적하는 간단한 방법입니다.

    
    Entity :: struct
    {
        tex: ^SDL.Texture,
        dest: SDL.Rect,
    }
    
    


    스프라이트가 많은 스프라이트 시트를 사용하는 경우 스프라이트 시트에서 이미지의 소스 위치도 추적해야 합니다.

    
    Entity :: struct
    {
        tex: ^SDL.Texture,
        source: SDL.Rect,
        dest: SDL.Rect,
    }
    
    


    코드의 이 시점에서는 전체 이미지를 로드하고 있기 때문에 소스를 추적할 필요가 없습니다.

    SDL.RenderCopy()

    전체 이미지를 로드하고 있으므로 소스nil 구조체 대신 SDL.RenderCopy() 함수에 SDL.Rect를 전달할 수 있습니다.

    
    SDL.RenderCopy(game.renderer, game.player.tex, nil, &game.player.dest)
    
    

    SDL.RenderCopy()는 모든 입력이 처리되고 플레이어 구조체의 위치가 업데이트된 후에 호출됩니다.

    좋은 웹페이지 즐겨찾기