2009年11月13日金曜日

物体と背景について



 ゲームをプレイしてて自機が背景にまぎれてしまい見失うということがときどきある。未然に防ぐにはどうすればいいか適当に思いついた案でテストして差をみてみた。

左列は何の変哲もない背景&文字。
右列は文字に発光エフェクトをかけたも。最近のケイブがちょいちょい使ってる感じ。
上から普通、背景モノクロ、背景暗め、背景荒め、背景の陰影薄め、背景ぼかし、となっている。

 工夫次第で見易さが変わるのはご覧のとおりだが、おもったより差が出にくかったのはテスト画像が悪いのか。それにしても発光エフェクトが万能で手間の割りに効果が大きのがいいね、オブジェクトが軽く見えるのは弱点だが。


 背景ぼかしは最近の3Dゲーや、ジオラマ風な写真なんかでちょいちょい見るのだけど、同人2Dでは見ない気がする。試したことがないが他のオブジェクトにあわせにくかったりするのかな、見た目面白くなりそうだけど。

2009年11月11日水曜日

C言語で拡張子判別

 だが、記述はC++だという


#include <cstring>
#include <cstdio>


bool CheckExtention( const char* filename, const char* ext )
{
  if ( filename && ext )
  {
    return 0 == std::strcmp(std::strrchr(filename, '.'), ext);
  }

  return false;
}


int main()
{
  const char* ext1 = ".png";
  const char* ext2 = ".jpg";
  const char* filename = "filename.png";
  std::printf("%s\n", CheckExtention(filename, ext1) ? "true" : "false");
  std::printf("%s\n", CheckExtention(filename, ext2) ? "true" : "false");

  return 0;
}


 実行結果


true!
false!



 おおよそこんな感じか。strcmpでは大文字小文字を区別してしまうので良くないんだけど、C言語標準にはstricmpがないので適当に自作しなければならない。strlenしてtolowerしながら比較すればいいのかな?
 WINAPIならPathFindExtensionってのがあるのでそれとlstrmpiあたり。
tchar.hをつかうならば_tcsrchrと_tcsicmpあたりか。

 拡張子チェックするだけなのに意外に手間取った。文字列操作はちょっとした鬼門だ。


int stricmp( const char* s1, const char* s2 )
{
  while ( (*s1) && std::tolower(*s1) == std::tolower(*s2) )
  {
    s1++;
    s2++;
  }
  return std::tolower(*s1) - std::tolower(*s2);
}


 stricmpを調べてみたら大体このようなことをするらしい。

2009年11月9日月曜日

WM_MOUSEWHEELとWM_MBUTTONDOWNで

 マウスのホイールをそのまま回すのは日常よく使用すると思うが、押し下げたまま回すことも可能なようだ。押し込んだまま回すという動作で何か出来ないかな?

 マウスホイール周りの処理をテストしていたのだけど、マウスのホイールを押したままホイール回すと、ホイールを離したってフラグが立つのかな? と実験してみたら、そのまま押し下げた状態をちゃんと維持する。
 ブラウザ上でホイールをクリックすると▲▼マーカーがでてきてスクロールが可能になるが、その状態でホイールを回すと通常の状態に戻るから、てっきり両立不可能だと思っていたが別にそんなことはなかった。どちらもスクロール関係だからキャンセルされるんだろう。

 プログラム上ではホイールの処理は別々になってて
・ホイール(正確にはマウスの真ん中ボタン)押し込みにはWM_MBUTTONDOWN
・ホイール押し込みからの解放つまり離しにはWM_MBUTTONUP
・ホイール回転にはWM_MOUSEWHEEL
のウィンドウメッセージが飛んでくるので、対応した処理を書くだけ。ホイールがおされているかどうかは変数を巧みに使うかGetKeyState的な関数をしようすれば判別も可能かな。ひょっとしたらマウスによっては動作そのものが不可能かもしれないが、ホイールついてないやつもあるし気にしなくてもいいか。

 ちなみに自分が使っているノートPCについてるタッチパッドには真ん中ボタンがあるが、どこをどう押そうがWM_MOUSEWHEELは飛んでこない。ドライバの問題かと思われるが。



 適当なアプリケーションで試してみた。
・ペイント - そもそもホイールにも対応してない
・Excel 2003 - 押し込んだ状態では回転は無視される
・PictBearSE - 押し込みに非対応
・explorer - 押し込みに非対応
・MetasequoiaLE R2.4 - 押し込んだ状態では回転は無視される

2009年11月3日火曜日

日記ちゃん

 早くもしもやけが出来て、もう笑うしかない。この部屋寒すぎるよ!

しもやけ - Wikipedia
http://ja.wikipedia.org/wiki/%E3%81%97%E3%82%82%E3%82%84%E3%81%91

 いわく、
治療法には、40℃位のお湯と5℃位の冷水に患部を交互に付ける(必ず、水よりお湯につける時間は長くし、お湯から始めてお湯で終わるように)

とあるが、今まで生きてきて何度かこの方法を実行したことがあるが直ったためしがない。

2009年10月27日火曜日

日記ちゃん

 父上が突然無線ルータを買ってきて「今すぐ設定して使えるようにしろ、このウジ虫!」
というので、適当にセッティングした。ほぼデフォルト設定。

 ところが自分のノートPCの無線は壊れて機能しない上に、外付けHDD等の関係で移動も出来ず、またiPhoneや携帯ゲーム機も存在しない。父上もPCを1ヶ月に1回程度しか使わないので、無線の恩恵にほとんどあやかれない悲惨な状況になってる。ののしられ損である。なきたい。

2009年10月25日日曜日

日記ちゃん

 バニラオイルとバニラエッセンスって何が違うんだろうと売り場で悩んだことがある。そのときはよくわからないから購入は次回にしようと見送ったのだけど、そのとき分かったことはバニラエッセンスよりバニラオイルのほうが高いということだけだった。値段が2倍ぐらい違う。
 今日になってふと思い出したのでググって見たら、どうやらバニラエッセンスのほうが熱に弱く、加熱すると香りが飛びやすいらしい。熱を加えるお菓子なんかにはバニラオイルを使おう、というお話。熱を加えないお菓子って何があったっけとすぐには思いつかないけど。あー、アイスがあるか。
 バニラの風味の主要成分にバニリンってのがあるらしい。まんまだ。バニリンのインパクトはすごいな、たぶんこの先一生忘れないと思うわ。バニリン。バニリン。

[参考]

バニラ - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%8B%E3%83%A9

2009年10月14日水曜日

クリップボード関係のウィンドウメッセージ

 CF_DIBからデータ抜き出すのに疲れたよ。
ところがCF_DIBがくるときは大抵CF_BITMAPも来てるんでCF_BITMAPで事足りるうえに、CF_BITMAPはとくに加工せずにそのまま描画できちゃうから、CF_BITMAPだけでいいんじゃないかと妥協したくなる。


休憩だ……っ!


 画像ソフトからコピーを行ったときに、どういうデータでクリップボードにセットされるのか調べてた。
・Microsoft (R) ペイント ver 5.1
 CF_BITMAP(2), CF_METAFILEPICT(3), CF_DIB(8), CF_ENHMETAFILE(14), CF_MAX(17)
・プリントスクリーン
 CF_BITMAP(2), CF_DIB(8), CF_MAX(17)
・PictBear ver2.0
 [背景]CF_BITMAP(2), CF_DIB(8), CF_MAX(17)
 [レイヤー]送られてこない
・AzPainter2 ver2.05
 [コピー]送られてこない
 [他へ出力→クリップボード]CF_BITMAP(2), CF_DIB(8), CF_MAX(17)
・Microsoft (R) Office Excel 2003
 [画像データを選択しコピーしたとき]CF_METAFILEPICT(3), CF_ENHMETAFILE(14)

おまけ
・エクスプローラでファイルをコピー
 CF_HDROP(15)
・InternetExplorerにて画像を右クリック→コピー
 CF_BITMAP(2), CF_DIB(8), CF_HDROP(15), CF_MAX(17)

といったような感じ。
 レイヤー関係はクリップボードを使わないみたいだが、だから不便なんだよ。32bitにしてAlphaColorを0にでもすればいいんじゃないかと思わんでもないが、そんな簡単な問題でもないんだろうな。
 Officeに関しては、クリップボード関係を調べてたら一例で乗ってたので実験がてら。


 ところでCF_MAXってなんじょい?


#if(WINVER >= 0x0500)
#define CF_MAX 18
#elif(WINVER >= 0x0400)
#define CF_MAX 17
#else
#define CF_MAX 15
#endif


 とWinUser.hにあり、値がまちまちのようだ。結局なんのパラメータ?

2009年10月9日金曜日

&&より&のほうが速いか?

 trueが1になることを意識して最適化しようと思うとどうすればいいのかとアセンブラとにらめっこしていたが、


for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) && (num<100))!=0 ? 1 : 0;
}




for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) & (num<100))!=0 ? 1 : 0;
}


では、後者のほうが高速になると思われる。前者にはjgeとjmp,jiが含まれるが、後者にはjiしかない(forの分かと思う)。



 ほかに


for (int i=0; i<100; ++i)
{
  num += (((i & 3)==0) & (num<100)) ? 1 : 0;
}




for (int i=0; i<100; ++i)
{
  num += ((i & 3) == 0) & (num < 100);
}


だと、後者のほうが数命令少ないため、おそらく高速。実際、1億回回して時間を計ると後者が200ms程度速かった。

コンパイラ: VisualC++ 2005 Express Edition
CPU: Intel(R) Pentium(R) M processor 1400MHz
速度優先(/O2)で最適化してコンパイルした。


 よっぽどコアな部分のプログラムでもない限り意識する必要はないかと。速度が重要ならアルゴリズムを見直すほうが効果がある。

2009年10月7日水曜日

c++ではtrueは1

boolをfloatに暗黙の型変換?
http://sumishiro.blogspot.com/2009/08/boolfloat.html


 以前こんなことを書いたが考えてみれば、bool -> int -> floatで変換されたと思えばどうということはないな。クラスでこんな一足飛びな型変換ができちゃうのかなと少し試してみたが、再現できなかった。一足飛びな型変換は出来ないのかもしれない。

 また


C++言語仕様では、boolはintに変換でき、false→0/true→1 となっています。

--- ISO/IEC FDIS 14882:1998(E) ---

4.5 - Integral promotions [conv.prom]
...
-4- An rvalue of type bool can be converted to an rvalue of type int,
with false becoming zero and true becoming one.


true/falseは、1/0と保障されている?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200504/05040024.txt
より引用。
 とあり、trueはc++では1らしい。


#include <cstdio>
#include <cstring>
int main()
{
bool b;
std::memset( &b, 2, sizeof(b) );
if ( b == true ) std::printf("b == true\n");
if ( b == 2 ) std::printf("b == 2\n");
return 0;
}


output:

b == true
b == 2

2009年10月6日火曜日

311号

http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name311.ogg
2.3MB

製作時間:2時間程度
ツール:ピストンコラージュ ver0.9.1.4
音源:デフォルトの

 地味にテンションが高いが、これといって主張もしないので「何を表現したいんだ!」といらいらする、そんな曲に仕上がりました。うーん。