SDL2 및 Odin 프로그래밍 언어를 사용한 플레이어 이동 -- Space Shooter Game - Part 3 -
YouTube Video 출시 예정
플레이어 이동을 위한 키보드 입력을 처리하는 방법에는 여러 가지가 있습니다.
지금까지 찾은 가장 쉬운 방법은 다음 부분으로 구성됩니다.
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에서 콜론
:
은 변수 및 기타 유형 선언에 사용됩니다.플레이어의 속도에 대한 상수를 선언할 때 상수를 기본적으로
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"
또한 가져온 패키지에 사용자 지정 이름을 지정했습니다.
SDL
및 SDL_Image
를 선택하지 않았다면 가져온 패키지를 다음과 같이 sdl2
및 image
접두사로 참조하게 됩니다.
assert(sdl2.Init(sdl2.INIT_VIDEO) == 0, sdl2.GetErrorString())
assert(image.Init(image.INIT_PNG) != nil, sdl2.GetErrorString())
defer sdl2.Quit()
좋고 간단합니다!
권장 운동
플레이어 이동은 흥미로운 주제이며 더 깊은 이해를 위해 검색을 문서화한 몇 개의 비디오를 게시했습니다.
여기에서 자세히 설명된 이동 도구 시각화 도구를 다운로드하는 것이 도움이 될 것입니다.
연습하려면 움직임을 처리하는 다양한 방법을 실험해야 합니다. 아마도 SDL을 사용하여 게임 컨트롤러의 입력을 처리하는 방법을 알아낼 수 있을 것입니다.
this video에 대한 의견에 진행 상황을 게시하십시오.
행운을 빕니다!
Reference
이 문제에 관하여(SDL2 및 Odin 프로그래밍 언어를 사용한 플레이어 이동 -- Space Shooter Game - Part 3 -), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/patrickodacre/player-movement-with-sdl2-and-the-odin-programming-language-space-shooter-game-part-3--3l8m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)