note.html (2763B)
1 <h1>Xlibで遊んでみる</h1> 2 <time>2022-12-16</time> 3 4 <h2>はじめに</h2> 5 <p>X11でGUIのプログラミングをしてみようと思い、してみた。X11用の低レベルのライブラリはXlibとxcbの二つがあるようだ。x.orgのウェブページを見てみると、Xlibは古く、xcbに置きかわりつつあるという。そのため、新しくなにかを作る場合はxcbを使うようにとのことである。ところがこのxcbはドキュメンテーションに乏しく、X11を触るのが初めての人間にはなにをどうすればいいのかほとんど分からなかった。知らない関数や構造体やらがでてきても(殆ど全部知らないものだが)、その関数なり構造体なりの説明がどこにも見当たらない。manページもない。あるのはdoxygenなるものでソースコードのコメントから自動生成したいい加減なものだけで、使いものにならない。</p> 6 <p>とりあえずX11のことを少しは理解してからでないと初められそうもないと思い、もう少しましな情報があるXlibから始めることにした。</p> 7 8 <h2>初期設定</h2> 9 <p>ディスプレイを開き、ウィンドウを作成する。tsodingの動画が分かりやすかった。</p> 10 <p>適当な四角形のものを表示し、その位置を時間の関数として動かしてみる。</p> 11 <p>文字を表示。<code>XDrawString</code></p> 12 13 <h2>キーボード入力</h2> 14 <p>キーボードの入力を受け付けるようにする。入力によって四角形の位置や速度を変化させる。</p> 15 <p>ここまでできればかなりなんでもできるようになる。</p> 16 17 <h2>FPSの固定</h2> 18 <p>前のフレームからの経過時間を計測して1/FPSを越えるまで待機させる。このときに<code>nanosleep</code>を使うとなぜか上手くいかなかった。OSに処理をブロックされる為か?とりあえず<code>while</code>ループの中でひたすら時刻を読んでいるのだが、これでいいんかな。リソールの無駄遣いではないんかな。</p> 19 20 <h2>メニューの実装</h2> 21 <p>メニューとゲームの推移を実装した。</p> 22 23 <h2>当たり判定</h2> 24 <p>とりあえず適当に実装した。2体間の衝突のみ判定しているので近くに別の物体がいるとめりこむ場合がある。</p> 25 26 <h2>改行のテスト</h2> 27 <p>行末の改行 28 は 29 半角スペース 30 に変換される。 31 </p> 32 33 34 <h2>参考</h2> 35 <ul> 36 <li><a href="https://tronche.com/gui/x/xlib/">The Xlib Manual(html conversion)</a></li> 37 <li><a href="https://www.youtube.com/watch?v=764fnfEb1_c">X11 App in C with Xlib(youtube video by tsoding)</a></li> 38 </ul>