SDL2 및 Odin 프로그래밍 언어를 사용한 플레이어 이동 -- Space Shooter Game - Part 3 -

5413 단어 odingamedevsdl2

  • YouTube Video 출시 예정

  • SDL2 Scancodes
  • SDL2 Core Library
  • Odin Documentation



  • 플레이어 이동을 위한 키보드 입력을 처리하는 방법에는 여러 가지가 있습니다.

    지금까지 찾은 가장 쉬운 방법은 다음 부분으로 구성됩니다.
  • KEYDOWN/KEYUP 이벤트에 대한 SDL.GetKeyboardState() 또는 SDL.PollEvent()
  • (델타 시간 또는 강제 프레임 속도) * target_pixels_per_second

  • SDL.GetKeyboardState()



    이 기능을 사용하면 키보드의 어떤 키를 눌렀는지 확인할 수 있습니다. 코드에서 관심 있는 4개의 이동 키(WASD)의 상태를 기반으로 4개의 부울을 설정합니다.

    이러한 부울 플래그를 설정하는 다른 방법은 적절한 true 이벤트에서 KEYDOWN로 설정하고 해당 false 이벤트에서 KEYUP로 설정하는 것입니다. KEYDOWN는 키를 눌렀음을 의미합니다. KEYUP는 키가 해제되었음을 의미합니다.

    하지만 이 두 번째 방법에서는 KEYDOWN 또는 KEYUP 이벤트가 반복되는 이벤트인지 또는 해당 키를 처음 누르거나 떼는 것인지도 확인해야 합니다. 둘을 구별하지 않으면 이벤트 큐를 폴링할 때 이상한 동작이 발생할 수 있습니다.

    
    state := SDL.GetKeyboardState(nil)
    
    game.left = state[SDL.Scancode.A] > 0
    game.right = state[SDL.Scancode.D] > 0
    game.up = state[SDL.Scancode.W] > 0
    game.down = state[SDL.Scancode.S] > 0
    
    // versus ...
    
    if event.type == SDL.EventType.KEYDOWN
    {
        // not repeated
        if event.repeat == 0
        {
    
            if event.key.keysym.scancode == SDL.Scancode.A
            {
                game.left = true
            }
            /// ...
        }
    }
    
    if event.type == SDL.EventType.KEYUP
    {
        // not repeated
        if event.repeat == 0
        {
    
            if event.key.keysym.scancode == SDL.Scancode.A
            {
                game.left = false
            }
            /// ...
        }
    }
    
    


    키보드 상태를 확인하는 것이 보기에 훨씬 좋다는 데 동의하실 것입니다. 이 두 번째 옵션은 우리가 필요로 하는 것에 비해 너무 장황합니다.

    delta_time 및 델타 모션



    델타 동작은 이전 프레임을 완료하는 데 걸린 시간(델타 시간)을 기준으로 현재 프레임에 대해 계산된 증분 이동입니다. 실제로 이 델타 시간에 초당 픽셀로 측정된 원하는 이동 거리를 곱합니다. 이렇게 하면 프레임 속도가 시스템에서 시스템으로 변경될 때 이동 속도가 빨라지거나 느려지지 않습니다.

    
    delta_motion := PLAYER_SPEED * (f64(TARGET_DELTA_TIME) / 1000)
    
    if game.left
    {
        move_player(-delta_motion, 0)
    }
    
    if game.right
    {
        move_player(delta_motion, 0)
    }
    
    if game.up
    {
        move_player(0, -delta_motion)
    }
    
    if game.down
    {
        move_player(0, delta_motion)
    }
    
    


    또한 플레이어가 화면 밖으로 이동하지 않도록 하는 편리한 Odin 기능을 지적하고 싶습니다.

    
    move_player :: proc(x, y: f64)
    {
        game.player.dest.x = clamp(game.player.dest.x + i32(x), 0, WINDOW_WIDTH - game.player.dest.w)
        game.player.dest.y = clamp(game.player.dest.y + i32(y), 0, WINDOW_HEIGHT - game.player.dest.h)
    }
    
    

    clamp() 주어진 최소 인수와 최대 인수 사이에 있는 경우 주어진 값을 반환합니다. 그렇지 않으면 제공된 최소값 또는 최대값을 반환합니다.

    다른 게임에서는 기본적인 충돌 감지에 잘 작동하는 min()max()의 조합을 사용했지만 지금은 clamp()가 잘 작동합니다.

    SDL.RenderCopy()



    플레이어 위치 업데이트가 완료되면 해당 플레이어를 창에 렌더링할 차례입니다. 업데이트된 플레이어 위치는 아직 표시되지 않습니다. 백그라운드에서 이미지를 렌더링하고 다음에 SDL.RenderPresent()를 호출할 때 표시될 장면을 그립니다.

    오딘 하이라이트



    변수 선언



    Odin에서 콜론:은 변수 및 기타 유형 선언에 사용됩니다.
  • Variable Declarations
  • Constant Declarations

  • 플레이어의 속도에 대한 상수를 선언할 때 상수를 기본적으로 f64로 허용하는 대신 int 유형을 지정합니다.

    
    PLAYER_SPEED : f64 : 500 // pixels per second
    
    


    구조체 및 프로시저 선언이 동일한 패턴을 따르는 방법에 주목하십시오.

    
    Entity :: struct
    {
        tex: ^SDL.Texture,
        dest: SDL.Rect,
    }
    
    main :: proc()
    {
        //
    }
    
    


    패키지 이름 지정



    이 시리즈의 첫 번째 부분에서 우리는 패키지 이름을 "main"으로 지정했지만 이것은 임의의 이름일 뿐입니다. "main"패키지의 이름은 원하는 대로 지정할 수 있으므로 이름을 "game"으로 변경했습니다.

    
    package game
    
    import "core:fmt"
    import SDL "vendor:sdl2"
    import SDL_Image "vendor:sdl2/image"
    
    


    또한 가져온 패키지에 사용자 지정 이름을 지정했습니다.
    SDLSDL_Image 를 선택하지 않았다면 가져온 패키지를 다음과 같이 sdl2image 접두사로 참조하게 됩니다.

    
    assert(sdl2.Init(sdl2.INIT_VIDEO) == 0, sdl2.GetErrorString())
    assert(image.Init(image.INIT_PNG) != nil, sdl2.GetErrorString())
    defer sdl2.Quit()
    
    


    좋고 간단합니다!

    권장 운동



    플레이어 이동은 흥미로운 주제이며 더 깊은 이해를 위해 검색을 문서화한 몇 개의 비디오를 게시했습니다.

    여기에서 자세히 설명된 이동 도구 시각화 도구를 다운로드하는 것이 도움이 될 것입니다.

    연습하려면 움직임을 처리하는 다양한 방법을 실험해야 합니다. 아마도 SDL을 사용하여 게임 컨트롤러의 입력을 처리하는 방법을 알아낼 수 있을 것입니다.

    this video에 대한 의견에 진행 상황을 게시하십시오.

    행운을 빕니다!

    좋은 웹페이지 즐겨찾기