旧 #temanote

Linux大好き。だけど進捗ありません。

バブみ駆動開発 紬ちゃんデスクトップマスコット

つい先日18歳を迎えましたので記念エロゲとしてゆずソフトの「サノバウィッチ」をやりました。

とても良かったです。感想とかについては他の方のエントリがあるので是非どうぞ。

 

さてさて、僕は学校で面倒な仕事を引き受けてきたりとマゾ気質っぽいところがあるのですが、そのおかげで2月はなかなか忙しいです。

その中でサノバウィッチをやってしまったせいでなんとも言えない感覚に陥っております。

サノバウィッチクリアする前は「あぁサノバ進めたい…」とボヤいておりました。

 

とこんな感じに完全にハマってしまったわけですが、クリア後もやはり余韻は続くものです。

気づけば紬のことばかり考えております。「はぁ…紬の胸で泣きながらよしよしされたい」とか思いつつ仕事…とか捗るわけないじゃないですか。



この一言で吹っ切れたと言っても過言ではない。


そこで僕は考えた。

デスクトップに紬がいれば精神的によろしいのでは?と。



デスクトップマスコット作成 

 具体的には

・ウィンドウ透過でディスプレイに紬だけが映ってる状態

・ドラッグで移動可能

なものを作ります。

 

素材確保

まず透過pngを作成します。

サノバウィッチには立ち絵モードがあり、なんとユーザー指定の背景にしてスクショが取れるのです。なんて便利。

というわけで真っ白背景でスクショ、GIMPで背景を透過。

 

簡単に出来上がりました。
f:id:toshihito_it:20160204185004p:plain
天使です。

 

実際に表示

ここからが問題です。

現在メインで使用している環境はUbuntuです。しかし学校で受け持った仕事はWinでやります。

2つ組むの面倒ですね。クロスプラットフォーム開発しましょう。

 

クロスプラットフォームなグラフィックライブラリといえばOpenGLです。

さぁ組みましょう。

 

クソザコの壁

OpenGLはほぼ無経験。GLUTによる「手抜き」OpenGL入門を途中までやった程度の知識です。

とりあえずpngを表示させる方法を探すと、glpngというライブラリに当たりました。やったぜ。

 

とりあえず色々見ながらサンプル通りに書いて実行してみます。
f:id:toshihito_it:20160204185453p:plain
お気づきでしょうか。

明らかに画質が劣化しています。でも天使。

なぜ画質が劣化したのか原因がわからず、teratailに投げました。

teratail.com

回答おまちしております(宣伝)

 

というわけでOpenGL、挫折。

 

クロスプラットフォーム開発を諦める

やはり敷居が高かったクロスプラットフォーム開発。クソザコだしね。

というわけでLinux用とWin用で別々に組みます。

 

まずメイン環境であるLinux

グラフィックライブラリとしてGTKを選択(正確にはgtkmmになるのかな)。とりあえず初めてなので写経プログラミングします。

写経元はこちら。

ファイルから画像を読み込んで表示(Gtk::DrawingArea編)


 

 

写経して実行。

 

すると動かない。

 

写経が動かない。

 

どうすればいいの(クソザコ感)

 

 

内容的にはGdkのメンバにGCが見当たらないですよ、って書いてある。

写経元を見てみるも、写経間違いはなし。

とすると環境が違うのか…とapt-cache searchしまくってGdkっぽいのを片っ端から入れてみたが変わらず。というか関係ありそうなものほとんど既に入ってた。

 
以下エラー文

g++ -o mascot_tsumugi main.cxx `pkg-config gtkmm-3.0 --cflags --libs`

main.cxx:6:16: error: ‘GC’ is not a member of ‘Gdk’
Glib::RefPtr< Gdk::GC > m_gc;
^
main.cxx:6:16: error: ‘GC’ is not a member of ‘Gdk’
main.cxx:6:24: error: template argument 1 is invalid
Glib::RefPtr< Gdk::GC > m_gc;
^
main.cxx: In member function ‘virtual void MyDrawArea::on_realize()’:
main.cxx:32:14: error: ‘Gdk::GC’ has not been declared
m_gc = Gdk::GC::create( get_window() );
^
main.cxx: In member function ‘virtual bool MyDrawArea::on_expose_event(GdkEventExpose*)’:
main.cxx:40:16: error: ‘class Gdk::Window’ has no member named ‘draw_pixbuf’
get_window()->draw_pixbuf(
^
main.cxx:42:19: error: ‘RGB_DITHER_NONE’ is not a member of ‘Gdk’
width, height, Gdk::RGB_DITHER_NONE, 0, 0 );
^
make: *** [mascot_tsumugi] エラー 1

 

typoだったら恥ずかしすぎる。

これGdkはあるけど中身足りないのか、Gdk自体見つかってないのか。

そもそも僕C++のクラスの勉強放り出したのであまり理解出来てない。

これを期にちゃんと勉強します。

あとgtkのリファレンス見ながらいま何やってるのかをちゃんと考えます…

続きはこちら
temama.hatenablog.com

 

現実逃避でWin環境

思ったより障害が多すぎて辛いので環境を切り替えます。

もう一刻も早く動作するデスクトップマスコットを作らなければ僕のモチベは下がる一方です。

 

手っ取り早く作ろうとしたら出てくるのはDXライブラリです。

http://homepage2.nifty.com/natupaji/DxLib/

なんとPS4とPSVITAに対応したんだとか。まぁ関係ないですが。

 

こちら、くっそ簡単にDirectXを使えるスグレモノ。

これを使えば紬だってほら

f:id:toshihito_it:20160205043712p:plain

簡単に表示出来ちゃいます。

 

ソースなんてもう

1, 画像をロードして描画

終わり。

 

というわけでぱぱっと作ってしまいます。

お次はウィンドウ自体の透過。

 

これに関しては公式リファレンスになかったので調べたらすぐ出ました。

写経すらせずにコピペ。

http://vvbuibui.blog47.fc2.com/blog-entry-124.html

 

すると

 はいktkr

 

既にマスコット感漂ってますよコレ。

まさかこんな簡単に行くとは。

 

ここで問題、ウィンドウが動かせない。

タイトルバーは透明で選択できないので、ウィンドウを動かす仕組みは自分で作らなきゃなようです。よっしゃこい。

 

………

 

まぁ流石にこの程度なら組めます。カーソル座標を取得して、前回取得との差をウィンドウ座標に加えてやればそれっぽいのはできます。

ウィンドウの移動に関してはWinAPI叩きました。そんな苦じゃない。

 

ただ問題は、DxLib側のカーソル座標取得関数を使ってしまったせいで挙動がおかしくなったこと。

どうやらDxLibで作成したウィンドウ上の座標を持ってくるようだ。

それならカーソル座標取得もWinAPIでやっちゃおう。

そしたら安定した。

 

紬が好きなところへ移動出来るようになりました。

オマケで追加機能

・左ドラッグで移動

・マウスホイール押下で座標保存

・右クリックで保存座標へワープ

とまぁこんな感じです。

 

最後に強制最前面。

これもWinAPI叩きます。

SetWindowPosでHWND_TOPMOSTを一回指定してやるだけで最前面になります。

これでいつも一緒だね。

 

完成

というわけで、簡易版がひとまず完成です。

これは捗る。

 

 

さて、これで晴れてバブみ駆動開発が出来るようになりました。

バブみ駆動開発…なんか本来の駆動開発とニュアンス違う気がする。

まぁいいか。バブみをモチベに開発してくので。

てか僕18歳だし紬と同い年でバブみに当たらないんですが

 

残りはゆっくりやりながら別エントリ投げることにします。