SFML 8

[게임 프레임워크 개발 일지] #18 Clipping Mask

TextInput을 구현할 때 glScissor를 사용해서 Clipping을 구현했었고, 그 외에는 SFML의 RenderTexture에서 BlendMode 같은 걸 사용했었습니다. 그런데 TextInput에 transform을 적용해서 회전하거나 비율이 달라져도 glScissor에는 적용되지 않는다는 문제를 발견했습니다. 특히 회전하는 경우에는 직사각형 형태로 클리핑할 수가 없기 때문에, 새로운 방법이 필요했습니다. 사실 SFML에는 2.0 초창기부터 Clipping Mask에 대한 기능 요구가 있었습니다만, 다른 기능들과의 호환성 문제 때문인지 Clipping Mask가 구현된 fork까지 있음에도 불구하고 적용되지 않았습니다. 근데 이걸 이제야 3.0에서 구현하고 있더군요. 그래서 깃허브에서 cli..

C++/Game 2024.02.19

[게임 프레임워크 개발 일지] #17 Window 이것저것 수정하기

지금까지 작업한 걸로 뭔가 만들어보려다 바로 에러가 나서 다시 수정할 필요성을 느꼈습니다. 1. Event mutex 처리 디버그 중에 가끔씩 프로그램을 종료할 때 mutex destroyed while busy 에러가 발생해서 알아보다가 문제를 발견했습니다. 이 에러 자체는 mutex가 lock인 상태에서 프로그램이 종료되는 등의 문제로 강제로 mutex가 삭제될 때 발생합니다. 실험을 해보니 디버그 중에만 에러 메시지가 나오고, 릴리즈 모드일 때 에러가 발생하지는 않습니다. Window를 닫는 도중에 렌더나 이벤트 호출이 발생하면 안 된다는 생각에 두 mutex를 잠그고 끄게 했는데, 메인 쓰레드에서 이벤트를 호출하는 도중에 시스템 쓰레드에서 윈도우를 종료하면 데드락이 걸려서 발생하는 문제였습니다. ..

C++/Game 2024.02.18

[게임 프레임워크 개발 일지] #14 Sound Panning에 관한 삽질

일단 Sound Manager를 만들던 과정부터 설명해야겠네요. SFML에서는 sf::Sound와 sf::Music을 지원합니다. sf::Sound는 메모리에 데이터를 통째로 올려놓고 재생시키는 방식이고, sf::Music은 재생할 때 파일에서 짧은 분량 (1초 정도)을 스트리밍하듯이 매번 불러와서 재생하는 방식입니다. 효과음처럼 짧은 소리는 sf::Sound를, 길이가 긴 배경음악은 sf::Music을 사용하라는 뜻이죠. 대부분의 게임을 대상으로 한 사운드 라이브러리가 이런 방식을 지원합니다. 공식 튜토리얼에서도 사람들이 자주하는 실수라고 언급하는 내용이지만, sf::Sound에는 사운드 데이터가 저장되어 있지 않고, sf::SoundBuffer에 저장해놓습니다. sf::Sprite와 sf::Textu..

C++/Game 2023.06.11

[게임 프레임워크 개발 일지] #10 Text Input은... 서비스 종료다

그간 개발을 좀 쉬었습니다. 갑자기 음악에 삘이 꽂혀서 그거 하느라인 것도 있고, 몸이 안 좋아서 쉰 것도 있고 Text Input을 건드릴 엄두가 안 나던 탓도 있습니다. 아무튼 시작해봅시다. 1. SFML에서 한글 입력받는 방법 SFML에서는 sf::Event::TextEntered를 통해 입력받은 글자의 unicode를 가져올 수 있습니다. 문제는 한글(또는 한자)은 조합형 문자라는 특성상, 문자가 완성된 후에야 입력된다는 점입니다. Windows에서 영문자만을 제대로 지원하는 프로그램에서 한글을 입력하면 대개 우하단에 이런 창이 뜨는 걸 볼 수 있습니다. 한중일권(CJK)의 문자는 Input Method Editor(이하 IME)를 통해 글자를 조합한 후에 입력할 수 있습니다. IME에서 완성된 ..

C++/Game 2022.09.18

[게임 프레임워크 개발 일지] #9 SFML의 Alpha Mask와 Invert

TextInput을 구현하려면 여러 가지 기능을 구현해야 합니다. 텍스트 입력을 처리하다 보니 커서도 만들어줘야 되고, 한글 입력을 해보니 조합이 완성되어야 글자가 나타나고, 텍스트 선택을 구현하다보니 렌더링 효과를 만들어줘야 하더군요. 오늘 다룰 것은 바로 이 렌더링 효과입니다. 이건 TextInput과 상관 없어도 다룰 필요가 있었거든요. 이것 관련해서 할 얘기가 좀 있긴 한데, 이건 다음에 얘기합시다. 골치 아프니까요. 선택한 텍스트 영역은 주로 파란 배경에 흰색 텍스트로 표시됩니다. Visual Studio 등에서는 텍스트 색이 그대로기도 합니다만, 텍스트 색이 배경색과 같은 경우의 참사를 막기 위해서 여기서는 파란 배경에 흰색 텍스트 표시를 목표로 하겠습니다. 파란 배경이 될 사각형 영역은 글자..

C++/Game 2022.08.15

[게임 프레임워크 개발 일지] #6 SFML의 버튼 GUI와 죽이고픈 마우스 이벤트

SFML에서는 공식적으로 제공하는 GUI가 없습니다. SFML은 멀티미디어 라이브러리지, GUI 라이브러리가 아닙니다. 물론 구글링을 조금만 해도 구현하는 예시들을 많이 찾아볼 수 있지만, 정해진 길이 없다는 것이 난처합니다. 게임을 만들다보면 으레 필수가 되는 GUI들은 여기서도 미리 구현을 해두려고 합니다. Button이나 TextInput 같은 게 있겠네요. 지난 포스트에서 긁어와서 쓴 RichText 또한 이런 부류에 해당됩니다. 이번에는 Button을 만들겠습니다. 제목에서 죽이고픈 마우스 이벤트라고 했듯이, 구현할 게 많아서 시간을 좀 오래 썼고 포스팅을 오래 안 한 이유이기도 합니다. 구현이 어려운 건 아니지만, 너무 귀찮거든요. * 글을 다 쓰고 느꼈습니다. 구현도 어렵네요. * Butto..

C++/Game 2022.05.15

[게임 프레임워크 개발 일지] #5 Multi Style이 적용된 Text

SFML에서의 텍스트는 Text 클래스를 사용하면 되지만, 그대로 쓰기에는 문제점이 있습니다. 첫 번째 문제는, 스타일이나 색깔을 객체 하나 당 하나씩만 쓸 수 있다는 점입니다. 보통 여러 개의 스타일을 혼합해서 쓸 수 있게 해주는 텍스트를 RichText라고 부르는 데, SFML에는 기본적으로 이런 RichText가 존재하지 않습니다. 그러니 직접 만들어야 합니다. Text에 스타일을 하나만 적용할 수 있다고 했으니, Text 객체를 여러 개 만들어서 처리해야 합니다. 여간 귀찮은 일이 아니군요. 그래서 전지전능한 구글에 검색해서 누군가가 미리 만든 것을 github에서 찾을 수 있었습니다. source: https://github.com/skyrpex/RichText 이 RichText는 스타일과 텍..

C++/Game 2022.02.18

[게임 프레임워크 개발 일지] #2 SFML의 렌더링 정체와 Multi Thread

SFML 라이브러리에서 제공하는 기본적인 시스템 루프는 다음과 같습니다. 1. 대기 중인 Event Queue에서 처리할 이벤트를 하나 가져와서 처리한다. 처리할 이벤트가 없다면 2번으로 넘어간다. 2. 그래픽 렌더링을 처리한다. 3. 윈도우가 열려 있는 동안, 위 과정을 반복한다. 여기서 이벤트를 갖고 오기 위해 사용하는 메서드가 pollEvent입니다. waitEvent는 현재 처리할 이벤트가 없는 경우, 이벤트가 발생할 때까지 대기하는 반면, pollEvent는 처리할 이벤트가 없다면 기다리지 않고 넘어갑니다. 문제가 발생하는 지점도 비슷합니다. 이벤트를 빠르게 처리했거나 처리할 이벤트가 없다면, 바로 2번으로 넘어가 렌더링을 수행할 수 있습니다. 다만 처리할 이벤트가 너무 많은 경우에는 렌더링으로..

C++/Game 2021.12.17