Coding & Programming/C, C++, SFML 12

[C/C++, SFML] 사이먼 게임(Simon Game) 만들기(Build a Simon Game)

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و 오늘 주제는 그동안 SFML 관련 자료를 포스팅한 기본윈도우 출력, 타이머 구현, 캐릭터 및 배경 이미지, 폰트 출력 등의 내용들을 일부 종합 정리하고 처음 연재 시작할 때 계획했던 사이먼 게임의 개발 과정을 소개하려고 합니다. 게임이라고 할 정도로 거창하진 않고요. 3월 24일날 처음 SFML에 대한 연재를 시작하면서 사이먼 게임을 말씀드린 내용이 있어 정리하고자 합니다. 사이먼 게임은 1978년 처음 세계에 알려진 이래 지금까지 판매되고 있는 정말 오랜된 게임으로 초창기 버전은 전자기기 형태로 출시되었다고 합니다. 70년대와 80년대는 대중 문화의 상징일 정도였다고 하니 정말 대단했던것 같습니다. 알고리즘 구현에 사용된 언어는 어셈블리어였으며 코드 대..

[C/C++, SFML] 11. 개체(Shape, Sprite) 충돌(Collision) 감지하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و SFML의 sf:Rect 클래스 내 intersects() 메소드는 사각형 영역에 대한 충돌(Collision) 감지를 지원합니다. 2개의 Sprite나 Shape가 존재하면서 서로 영역이 겹친다면 이를 충돌로 인식할 수 있습니다.이번 포스팅은 1:n의 RectangleShape 개체를 화면에 출력하고 1을 플레이어로 가정하여 n개의 개체들과 충돌하는 것을 공유하려고 합니다. 기본 컨셉은 먼저 MAX_ENEMY_COUNT 20개 만큼 enemies 에 저장합니다. 20개의 적들은 1~25 x 1~25의 랜덤한 크기로 1~500의 랜덤한 위치에서 등장합니다. 사용자는 상/하/좌/우 방향키로 플레이어(rect_player)를 조정하여 위에서 아래로 박스들과의..

[C/C++, SFML] 10. 키보드 이벤트(Event) 및 상태(State) 처리하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و sf::Keyboard 클래스는 눌린 키, 키눌림, 키 떼임 등의 키보드 상태에 대한 인터페이스를 제공합니다. Event::KeyPressed, Event::KeyReleased 이벤트를 이용하여 키의 눌림과 떼임 상태를 알 수 있으며 어떤 키가 눌렸는지 event.key.code의 값을 통해 눌린 키의 값을 확인할 수 있습니다. 예제는 상, 하, 좌, 우 방향키가 입력되면 이벤트를 입력받아 화면의 빨간색 사각형을 입력된 키 방향에 맞춰 -10, +10 만큼씩 움직입니다. 스페이스(Space) 키를 누를 경우 파란색 테두리의 작은 사각형에 move() 메소드를 이용하여 소소한 애니메이션 효과를 주고 애니메이션 효과가 끝나면 빨간색 사각형의 중앙으로 작은 ..

[C/C++, SFML] 9. 엔티티(Sprite, Text, Share 등) 위치, 로테이션, 스케일 등 모양 바꾸기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و Sprite, Text, Shape의 클래스들은 동일한 sf::Transformable 인터페이스를 통해 Sprite, Text, Shape들의 크기 변경, 회전, 이동 등을 지원합니다. 동일한 유형의 간단한 API를 통해 move, rotate, scale 변경이 가능한데 예를 들어 Text의 위치를 변경한다고 하면 아래와 같이 setPosition()를 통해 절대 위치를 정하고 move()를 통해 상대 위치로 엔티티를 이동 시킬 수 있습니다. 이 같은 절차는 Sprite, Shape들도 동일하게 적용됩니다. 아래 예에서 text.getPosition()의 결과는 setPosition(), move()에서 설정한 위치가 누적 반영되어 x는 110, y는..

[C/C++, SFML] 8. 마우스 이벤트(Event) 및 상태(State) 처리하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و 오늘 다룰 내용은 SFML에서 sf::Mouse 클래스와 마우스 이벤트 처리에 대한 내용입니다. sf::Mouse 클래스는 마우스의 이동(Moved), 키눌림(Pressed), 키 떼임(Released) 등 상태에 대한 인터페이스를 제공합니다. event.type과 event.key.code의 상태에 따라 Event::MouseButtonPressed, Event::MouseButtonReleased, Event::MouseMoved, Event::MouseWheelMoved:, Event::MouseWheelScrolled: 등에 따라 마우스의 상태를 파악할 수 있습니다. 다음 실행 화면은 마우스 상태를 콘솔에 출력하고 마우스 이동과 버튼 클릭에 따라 ..

[C/C++, SFML] 7. 오디오(음악, 효과음) 파일 읽고 재생하기(SoundBuffer, Sound)

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و 오디오 파일은 sf::SoundBuffer 클래스를 통해 메모리로 읽을 수 있습니다. 전반적인 절차는 폰트를 읽고 화면에 Text를 출력하는 것과 유사합니다. 폰트의 경우 sf::Font 클래스의 loadFromFile() 메소드를 이용하여 읽고 sf::Text 클래스를 이용하여 색, 위치, 크기 등을 지정했듯이 오디오 파일의 경우도 sf::SoundBuffer 클래스를 이용하여 오디오 파일을 읽고 sf::Sound 클래스를 이용하여 피치 설정, 플레이 등을 수행합니다. 오디오 데이터를 파일 뿐만 아니라 스트림 또는 메모리로부터도 읽을 수 있습니다. SFML이 지원하는 오디오 파일 포멧은 WAV, OGG, FLAC이며 MP3는 라이센스 이슈로 현재 지원하..

[C/C++, SFML] 6. 폰트(font) 파일 읽고 화면에 출력하기(Font, Text)

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و sf::Font 클래스는 대부분의 폰트 타입을 지원하며 여러 형태의 폰트 파일을 메모리로 로딩합니다. 로딩된 폰트 정보는 sf::Text 클래스를 통해 화면에 출력되는데, sf:Text 클래스는 글자의 사이즈, 스타일, 컬러, 위치, 로데이션 등을 옵션으로 설정할 있습니다. Font font; //폰트 파일 로드 font.loadFromFile("resources/DS-DIGIB.ttif"); //폰트를 사용할 text 생성 Text text; text.setFont(font); //폰트 text.setCharacterSize(size); //크기 text.setPosition(x, y); //x, y 위치 text.setFillColor(color); ..

[C/C++, SFML] 5. 캐릭터, 배경 등 이미지(Texture, Sprite) 출력하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و 지난 시간에 이어 이번에는 배경 또는 캐릭터 이미지를 읽어서 화면에 출력하는 클래스인 Texture, Sprite 클래스에 대해 정리합니다. Texture, Sprite 클래스는 아래 그림과 같이 화면에 파일로 부터 읽은 png, jpg 등의 이미지 파일을 임의 위치에 표현할 수 있는 기능을 제공합니다. Texture는 파일로 부터 읽어 들인 이미지를 뜻하고 Sprite는 사각형, 원, 삼각형 등의 모양 틀에 Texture를 입힌 것으로 개념을 설명하고 있습니다. 예제 코드를 통해서도 알수 있듯이 Sprite는 이미지 데이터(Texture)를 가지고 목적에 맞게 어떻게 Texture를 그려낼지 결정합니다. SFML 사이트에서도 "A sprite is no..

[C/C++, SFML] 4. 타이머(Timer) 구현하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و 타이머는 게임 뿐만 아니라 여러 프로그램에서 사용되는 기능입니다. SFML에서도 Time 클래스를 이용하여 일종의 타이머 기능을 구현할 수 있습니다. SFML의 Time 클래스는 현재의 날짜(년, 월, 일, 시, 분, 초)를 나타내는 것이 아닌 시간의 양을 표현하는 용도로 사용됩니다. 예를 들어 일정 시간단위로 어떤 기능을 수행해야 한다면 경과 시간을 측정하고 시계를 다시 재시작하기를 반복하면서 일정 주기로 특정 코드를 실행할 수 있습니다. Clock 클래스는 경과 시간을 측정하기 위해 초(asSeconds()), 밀리초(asMilliseconds()), 마이크로초(asMicroseconds()) 단위로 측정할 수 있는 메소드를 지원합니다. 경과 시간 통..

[C/C++, SFML] 3. 기본 윈도우(RenderWindow) 출력하기

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و SFML의 기본 윈도우(RenderWindow)를 출력해 보겠습니다. RenderWindow는 그래픽 모듈의 메인 클래스이며 부모 클래스는 Window, RenderTarget, 최상위 클래스는 GlResource, NonCopyable 클래스로 구성되어 있습니다. Window 클래스와 같이 RenderWindow 클래스도 OpenGL 항목을 렌더링 할 수 있습니다. RenderWindow 클래스의 생성자(Constructor)는 다음과 같습니다. 디폴트 생성자 sf::RenderWindow::RenderWindow ( VideoMode mode, const String & title, Uint32 style = Style::Default, const C..