아직 C++에서 native로 drawing을 지원하지 않기 때문에 SFML 라이브러리를 사용하기로 했다.
OS 및 개발환경에 따른 SFML초기환경 세팅은 여기를 참고하자. (필자는 Windows 10 / Visual Studio 2019 환경)
SFML로 기본적인 2D 드로잉 해보기
아래 코드를 입력해서 기본 drawing canvas를 띄워보자
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main(void)
{
RenderWindow window(VideoMode(800, 600), "2D");
while (window.isOpen())
{
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed) window.close();
}
window.clear(Color::Blue);
window.display();
}
return 0;
}
가장 간단한 기본 형태인데 왜 while문이 2개나 있는지 궁금하실 수 있는데, 아주 간단하게 언급하고 넘어가자면, while문 형태의 무한루프가 없으면 return 0;으로 프로그램이 바로 종료되어 버리기 때문이다, 그리고 움직임을 표현하려면 반복적으로 그려주는게 필요해서 기본적으로 while 무한루프형태가 필요하고, 창을 닫는등의 이벤트를 받기위해 간단한형태의 이벤트 루프가 필요하기 때문에 안쪽의 while루프 하나가 더 들어간다고 보면 된다. (이런 이벤트 루프가 없으면 창을 닫아도 c프로그램에서 알 방법이 없기 때문에 while문들을 다 벗어나서 return 0;으로 프로그램을 종료할 방법이 없다.)
아래 코드를 입력해서, 랜덤색깔을 가진 점들을 랜덤위치에 표시해보자.
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main(void)
{
RenderWindow window(VideoMode(800, 600), "2D");
auto draw_dots = [&]()
{
for (int i = 0; i < 1000000; i++)
{
Vertex point(sf::Vector2f(rand()%800, rand()%600), Color(rand()%255, rand()%255, rand()%255));
window.draw(&point, 1, Points);
}
};
while (window.isOpen())
{
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed) window.close();
}
window.clear(Color::Blue);
draw_dots();
window.display();
}
return 0;
}
아래 코드를 입력해서, 랜덤색깔을 가진 선들을 랜덤위치에 표시해보자.
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main(void)
{
RenderWindow window(VideoMode(800, 600), "2D");
auto draw_lines = [&]()
{
for (int i = 0; i < 1000; i++)
{
Color c1 = Color(rand() % 255, rand() % 255, rand() % 255);
Color c2 = Color(rand() % 255, rand() % 255, rand() % 255);
sf::Vertex line[2] = {
{Vector2f(rand() % 800, rand() % 600), c1},
{Vector2f(rand() % 800, rand() % 600), c2}, };
window.draw(line, 2, Lines);
}
};
while (window.isOpen())
{
Event e;
while (window.pollEvent(e))
{
if (e.type == Event::Closed) window.close();
}
window.clear(Color::Blue);
draw_lines();
window.display();
}
return 0;
}
처음 tutorial은 여기를 참고했는데, 기본적으로 딸려 나오는 모듈이라그런지 사용도 무척 쉬웠다.
만약 리눅스에 ssh로 접속하고 있다면 x-server를 사용해야하는데,
나의 경우 라즈베리파이에 깔린 라즈비안에 윈도우에서 MobaXTerm으로 접속하는데, 메뉴에서 Start X-Server만 해주면 바로 동작했다.
(집과 회사등 여러군데에서 ssh로 접속하는 경우는 실행할때 충돌나면서 안되는 경우가 있었는데, 이때는 여기참조해서 터미널(?) 하나를 죽여주면 잘 동작함을 확인)
한글로 레이블을 만들면 텍스트가 깨져보이는데, 이게 생각보다 고치기 쉽지 않네 ㅠ 검색도 잘 안되고.. 일단 그냥 영어버전으로 만들기로 하고(...) 넘어감
String으로 된 radiobutton 컨트롤의 경우 위링크에서 추가적으로 여기를 참조해야 초기값 세팅이 가능했다.
위젯간 align을 위해서 grid()를 사용하거나 pack()을 사용하거나 place()를 사용하는거 같은데, 나는 단순하게 하기 위해서 grid()를 사용했다(위의 tutorial에서 소개한 방법이기도 하고).. 섞어 쓰기 보다는 하나만 선택해서 써야하는 것 같은 인상을 받았다.
그런데 grid()의 경우 columnspan을 사용하거나, Frame()으로 그룹핑해주지 않으면 가상의 테이블 때문에 내가 원하는대로 배치가 되지 않는 현상이 있었다. 위짓간 align을 위해서는 sticky라는 키워드를 사용해야했는데, 좀 거지 같은 설계인것 같다.
" search
set hlsearch " highlights all search patterns
set ignorecase
set smartcase " if you type, '/Copyright' it will be case sensitive
" auto indent
set autoindent " 새로운 줄 시작시 이전줄의 들여쓰기를 복사
set cindent
set smarttab " tab누르면 공백들이 대신 들어감(들여쓰기할때만)
set smartindent " 중괄호나 주석등에 반응하여 들여쓰기 조정
set showmatch " 중괄호등 짝보여주고 이동 가능
" tab size
set tabstop=4 " how many columns vim will use to print tab
set shiftwidth=4 " vim use when you hit >> or vim does auto indenting
set softtabstop=4 " vim use when you hit tab in insert mode
set expandtab " tab will be converted to spaces
" scroll
set scrolloff=5 " when page up/down(ctrl + F/B)
" etc
syntax on " syntax coloring
set number " line number
set backspace=indent,eol,start " backspace key will delete everything
set visualbell
set showcmd " when you type 'y2d', intermediate command will be shown
map <leader>b Oimport pudb; pudb.set_trace()
" set colorcolumn=80
set termguicolors
vim plugin manager
vim을 정말 visual studio 수준의 IDE로 쓰려면 plugin manager를 통해 여러 plugin을 설치해서 써야한다.
plugin manager 자체도 여러가지가 있는데, 국산이기도 하고 심플하고 강력한 vim-plug를 추천
texteditor 색깔에 대해서는여기를 참조하는걸 추천(사용가능한 airline theme list는여기 참조)