2009年12月27日日曜日

フルパスからフォルダ名を取得

 文字列操作とか面倒だなー、何か適当な関数ないかなーと探し回った。

 ざっくりいえばファイルパスをPathRemoveFileSpec()でフォルダパスにして、 PathFindFileName()でフォルダ名だけ取り出せばいける。
これらの関数を使うのに「shlwapi.h」と「shlwapi.lib」のリンクが必要。



以下実験
#include <cstdio>
#include <tchar.h>
#include <windows.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
 
int main()
{
  TCHAR path[ MAX_PATH ] = {0};
  GetModuleFileName( NULL, path, sizeof(path) );
  _tprintf( TEXT("%s\n"), path ); 
 
  PathRemoveFileSpec( path );
  _tprintf( TEXT("dir: %s\n"), path ); 
  
  _tprintf( TEXT("dirName: %s\n"), PathFindFileName(path) );
 
  return 0;
}

実行結果


D:\develop\study\test_cv2012\Debug\test.exe
dir: D:\develop\study\test_cv2012\Debug
dirName: Debug
続行するには何かキーを押してください . . .


 といった具合。
GetModuleFileNameで自分の実行ファイルパスを取得。
PathRemoveFileSpec()でパスの一番後ろにある「\」以降の文字をバッサリカットしてフォルダパスに。
PathFindFileName()で一番後ろの「\」以降の文字のみを取得でき、これがフォルダ名となる。
 PathRemoveFileSpec()に渡せるパスがファイルかフォルダか不明瞭な場合はPathIsDirectory()でフォルダかどうか確認するのが手っ取り早い。
またフォルダパスの後ろに「\」がついていたりいなかったりする場合が考えられるなら、PathRemoveBackslash()で後ろの「\」をなくせるので利用したい。



以下私事。
PathCombineは"..\\filename.ext"と一個上のフォルダを指定してもちゃんとパスを修正してくれるが、"../filename.ext"とするとうまく動かない。\でないといけないみたい。

 起動時にGetCurrentDirectoryでフォルダパスを保存しておいて、
終了時にそのフォルダパス+ファイル名としてデータを保存していたのだけど、これが大失敗。
 ファイル選択ウィンドウなどでカレントを移動したあと
ShellExecute( NULL, TEXT("open"), execPath, NULL, NULL, SW_SHOWDEFAULT );
などと新しくexecファイルを実行すると、そのexecファイルのカレントフォルダも自身のパスにかかわらず、起動する側のカレントフォルダが反映される。
そのため終了時にデータ保存すると実行ファイルのフォルダとは別の場所に保存される問題が発生した。
 自分のフルパスからフォルダパスを得て、そこにファイル名をくっつけることでこの問題を回避した。
いけてないランチャからプログラムを呼び出された場合似たようなことが起こるかもしれないので、対策しておくといいも知れない。

[参考]
フルパスからフォルダを階層分割するには?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200810/08100010.txt



2013-05-23:
 記事を書き直しました。
フォルダ名とフォルダパスをはき違えていた内容だったので。



2009年12月19日土曜日

日記ちゃんが大人の科学

Vol.26 ミニエレキ | 大人の科学マガジン | 大人の科学.net
http://otonanokagaku.net/magazine/vol26/index.html

 わずか3500円ぐらいでギター的なものが手に入っちゃう。なんちゃってピックも付いてる!
製作時間は約2時間程度。作り方説明がガンプラ並みに丁寧なので詰まることはないと思う。
必要なのは単3電池2本、+ドライバー、セロテープぐらい。
コイル巻くなんて何十年ぶりよ、小学生のとき以来で懐かし。
作ったにもかかわらずエレキギターが何で音が鳴るのかさっぱり分からない、これなんで音出るの?
 
 それはそうと弾くとか弾かないとか以前にチューニングが難しい。
弦のはじき方で地味に音が変わってあわせられないよ!
適当に近い音にしてCコード弾いてみたが、指が引っかかって音が出ないという。
友人がじゃんじゃんバリバリ弾いてたが、信じられんねこれ、難しい!
押せばチャラチャラポンポォンって音が出るピアノとは大違い。爪が長いと弾けないもの!
 
 近所の本屋には山積みされてたから、手に入りやすいと思う。
暇つぶしに買ってみるのはどうだろうか。

2009年12月14日月曜日

日記ちゃん半透明合成


for (BYTE i=0; i<256; ++i)
{
}


とかやっちゃってたぜ。ふへへ。死ぬがよい。

BYTEはWinDef.hで
typedef unsigned char BYTE;
です。



 半透明合成を実装する必要が出てきたので昔作ったやつを流用。とっても遅いのでどうにかしたい。


DWORD alpha = src >> 24;
DWORD colorRB = ((dest&0xFF00FF)*(256-alpha) + (src&0xFF00FF)*alpha) & 0xFF00FF00;
DWORD colorG = ((dest&0xFF00)*(256-alpha) + (src&0xFF00)*alpha) & 0xFF0000;
dest = ((colorRB | colorG) >> 8) | (dest & 0xFF000000);


 1ピクセル32bit限定でAABBGGRRとデータ並んでいる、普通のDIBデータ。
見てのとおり赤と緑を一度に計算、その後緑を計算し、くっつけて256で割るということを行っている。
各色を別個に計算するよりは速いが、高速化というと微妙なところ。
あと割り算をビットシフトにしてるが普通に「/256」と書いてもコンパイラの最適化がいいようにしてくれると思う。
 アルファ値は下地のままにする。
というか50%の下地に50%を上から合成したらアルファはなんぼになるべきなのか良く分からなかったので。25%? 50%? うーん。
下地100%に上から50%半透明合成をすると、結果100%のままなほうが自然か。
 これでも1024*768を80msぐらいでレンダリングできるのでまったく使えないわけでもない。
dest=srcなべた塗りだと20msぐらいの環境で。

 ちなみに普通の半透明合成の式は
color = (dest*(256-alpha) + src*alpha ) / 256
を各色。



●おまけ


dest = (dest & src) + (((dest ^ src) & 0xfefefefe) >> 1);


 50%限定半透明合成。

他にも、


DWORD color = (dest & 0x00fefefe) + (src & 0x00fefefe);
DWORD mask = color & 0x01010100;
dest = color | (mask - (mask >> 8));


 加算合成。


DWORD mask = ((( ( ((~dest & src)<<1) + ((~dest ^ src) & 0xfefefe) ) & 0x1010100 )>> 8 ) + 0x7f7f7f) ^ 0x7f7f7f;
dest = (dest | mask) - (src | mask);


 減算合成。

 昔どこだかで拾って使っていたもの。
特に加算合成には大変お世話になりました。
とりあえず、自分が考えたわけではないということを明記しなければならない。
それならブログに乗っけるなという話であるが、意外に合成式関係はググっても出てこないので。
誰かのお役に立てば幸い。
 最初の半透明合成だけは自力、ビットも糞もないのが笑える。

2009年12月11日金曜日

ふたご座流星群

ふたご座流星群の観察Q&A:国立天文台
http://naojcamp.nao.ac.jp/phenomena/20091211/observe.html

 13日:夜中から明け方
 14日:22時から3時頃まで
見る方向は気にしなくて良い。
また16日は新月で、月明かりに邪魔されずに観測できる。

とのこと。しし座のときですらかなり寒かったから、防寒対策はしっかり行いたい。

/** 15日 0:37 追記 */
いってくるぜー。

/** 0:45 追記 */
めちゃめちゃ曇ってた!

2009年12月5日土曜日

ステータスバーとアイコン


 ステータスバーにアイコンを表示するときは

SendMessage( hStatusWnd, SB_SETICON, 0, reinterpret_cast<LPARAM>(hIcon) );

などとすればいいが、アイコンの読み込み方によって表示のされ方に違いが出るようだ。上の画像はLoadImage関数で読み込んだもの。LoadIcon関数で読み込むと下の画像のようになる。要注意。




 ステータスバーに区切りを付けたいとき、


int iRight[] = { 100, 200, 380, 450 };
SendMessage( hStatusWnd, SB_SETPARTS, sizeof(iRight)/sizeof(*iRight), reinterpret_cast<LPARAM>(iRight) );


のようにする。このとき自分がはまったのが、指定する数値はてっきり横幅だとばかり思っていて

int iRight[] = { 100, 100, 100, 100 };

とかやって、おっかしいなあ、ぜんぜん区切られないけどなんなのこれ? と歯をギリギリしてた。正しくは位置を設定する。要注意。



 使用するアイコンをすべてリソースに追加したところ、実行ファイル.exeのアイコンが意図しないものになった。実行ファイルに設定されるアイコンはIDが一番若いものになるので、#defineなどで数値に置換し、実行ファイルに設定したいアイコンが一番若いIDになるよう修正する。要注意。プログラム中でアイコンを読み込む時は
LoadIcon( hInstance, TEXT("ICON_RESOURCE_NAME") );
から
LoadIcon( hInstance, MAKEINTRESOURCE(ICON_RESOURCE_NAME) );
といった具合に変更する。

2009年11月27日金曜日

VC++2005EEで謎の強制終了


CONFIG_WIN DIALOG 30, 30, 200, 170
CAPTION TEXT("設定")
{
}


 VC++2005EEにはリソースエディタが付いてないので自分で書くことになるんだけど、上記のようなコードを書いてコンパイルしようとすると強制終了する。エラーも出さずに落ちるもんだから最初まったくわけが分からなかったが、どうも「設定」て字がいかんらしい。文字コード問題?
 「設」「定」だけでも問題ないが「設定」はダメっぽい。ファイルはSJISで保存されている。再現性の確認はしてない。文字セットは「UNICODE」でも「設定なし」どちらであっても強制終了する。
 とりあえずWM_INITDIALOGでSetWindowTextすれば問題を回避可能か。

2009年11月17日火曜日

しし座流星群

しし座流星群2009:しし座流星群の観察Q&A:国立天文台
http://naojcamp.mtk.nao.ac.jp/phenomena/20091118/observe.html


 18日午前4時から5時ぐらい。方向は気にせず全体を見ること。
だけど今日はあいにくの雨で期待できないできない。オリオン座のときも見には行ったんだけど結局1つも見られなくて残念だったし、星には縁がないのかもしれん。

/** 追記 22時ごろ */
 昼過ぎには雨もやんで、夜現在では雲が30%ぐらいの晴れ具合、夜明けごろどうなるか分からないがこの調子でいけば楽しい天体観測が可能かもしれないね。


/** 追記 午前5時ごろ */
 4時前後は割とひょいひょい飛んでってた印象で、4時半ぐらいになるとぜんぜん見かけなくなった。5~6個ぐらい見られたような気がするので満足。とりあえず寒くてたまらん。

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
音源:デフォルトの

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

2009年9月30日水曜日

アクティブなウィンドウのハンドルからファイルパス取得

 以前ちょっと話題に出した「Manic Time」が面白かったため、似たような機能を作ってみたい! ってことでちょちょいと調べてみた。


●アクティブなウィンドウのタイトルを取得する
 GetForegroundWindowって便利な関数があるのでそれで一発。ウィンドウハンドルが得られるからあとはGetWindowTextするだけ。簡単。

GetForegroundWindow 関数
http://msdn.microsoft.com/ja-jp/library/cc364732.aspx

GetWindowText 関数
http://msdn.microsoft.com/ja-jp/library/cc364815.aspx



●ウィンドウハンドルからファイルパス取得
 「Manic Time」にはプログラム別に色分けして表示する機能があるので、プログラムでユニークな情報が必要そう。「Manic Time」ではどうしているのか知らないけれど、ファイルパスでどうにかできそうなのでファイル名を取得する。ウィンドウハンドルだけからファイルパスを直接取得する関数がないので、いくらか段階を踏む必要がある。

GetWindowThreadProcessIdでプロセスIDを取得
↓
OpenProcessでプロセスハンドルを取得
↓
EnumProcessModulesでモジュールハンドルを取得
↓
GetModuleFileNameExでファイルパスを取得

 といった流れ。GetModuleFileNameExでプロセスとモジュールのハンドルが必要になるので適当にデータを取ってくる。作業。

GetWindowThreadProcessId 関数
http://msdn.microsoft.com/ja-jp/library/cc364779.aspx

OpenProcess 関数
http://msdn.microsoft.com/ja-jp/library/cc429278.aspx

EnumProcessModules 関数
http://msdn.microsoft.com/ja-jp/library/cc429387.aspx

GetModuleFileNameEx 関数
http://msdn.microsoft.com/ja-jp/library/cc429403.aspx


●サンプル

#include <windows.h>
#include <cstdio>
 
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
 
 
bool getWindowFileName( HWND hWnd, LPSTR lpFileName, DWORD nSize )
{
  DWORD processID;
  GetWindowThreadProcessId( hWnd, &processID );
  HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
  bool ret = false;
  if ( hProcess )
  {
    HMODULE hModule;
    DWORD cbReturned;
    if ( EnumProcessModules( hProcess, &hModule, sizeof(hModule), &cbReturned ) )
    {
      ret = 0 != GetModuleFileNameEx( hProcess, hModule, lpFileName, nSize );
    }
    CloseHandle( hProcess );
  }
 
  return ret;
}
 
int main()
{
  for (;;)
  {
    HWND hWnd = GetForegroundWindow();
 
    TCHAR title[ 1024 ];
    ZeroMemory( title, sizeof(title) );
    GetWindowText( hWnd, title, sizeof(title)/sizeof(*title) );
 
    TCHAR fileName[ 1024 ];
    ZeroMemory( fileName, sizeof(fileName) );
    getWindowFileName( hWnd, fileName, sizeof(fileName)/sizeof(*fileName) );
 
    std::printf("%s [%s]\n", title, fileName );
    Sleep( 1000 );
  }
}



●ほか
 あとは収集したデータをグラフィカルに表示すればOKといったところだろうけど、そこが一番面倒くさい。

 以下のサイトを参考にしました。感謝。
Win32 API でアプリケーションを列挙する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;175030

ファイル名を取得するには
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200504/05040053.txt

 
 
/** 11-06-05 */
 hProcessを閉じ忘れていたのを修正

2009年9月27日日曜日

ノートPCのファン清掃

 最近、ウギギギギっギャンゴギャンゴッとPCのファンが鳴いてたので分解して埃の除去を行った。
参考にしたサイトは以下

サーマルセンサーエラー|caraldo.net | MT Blog
http://blog.caraldo.net/2007/09/post_9.php


MG50G~MG50シリーズ分解のページ
http://sakurapapa.hp.infoseek.co.jp/MG50G1.htm


 だいぶ静かになったが、まだちょっとうるさい。起動時にサーマルセンサーエラーが出なくなったのでよしとする。ねじが一本あまったが、それもまあよしとする。


/***/


 まる一日経過したが、気が付いてみればファンが回らなくなってた。なんか静かだと思ったよ。CPUを使っていないときのHDD温度は50℃前後、CPUをしばらく使うと55℃ぐらいになる。60℃を超えるとHDDが死ぬというからそこそこキテると思われるが、どうしたものかな。

 とりあえず、割り箸で すのこ的なものを作ってPCの下に敷いておいたが、どれだけの効果が期待できるのかは不明。うかつにCPUをつかうエロゲが出来なくなったが、かえってよかったかもしれない。
 うちわでぱたぱたしてたら45℃まで下がった。分解したときに知ったけど、キーボードの裏側に薄く広い金属板があって、それで熱を分散してるみたい。だから全体を冷やすように風を当ててもそれなりに冷えるようだ。そこらへんノートPC様々といったところ。しかし扇ぐの面倒だな、このままでは左手がむきむきになってしまう。

/***/

 普通に扇風機をそばに置いた。手が冷える冷える。

2009年9月25日金曜日

ドラッグ&ドロップ + [Alt+Tab]

画像処理でボコーダーエフェクト - Radium Software
http://d.hatena.ne.jp/KZR/20090925/p2

 を見ていて、操作に驚いた。ファイルをドラッグしたまま[alt+tab]でウィンドウをトップに表示し、ドロップしていた。その発想はなかった!

 ドラッグ&ドロップは誰でも良く使うんじゃないかと思う。画像編集ソフトに画像ファイルをドロップして開くとか、メディアプレイヤーに音楽ファイルをドロップしてリストに追加するとか。
 Alt+Tabは使わない人も中にはいるかもしれない。[alt]キーをおしながら[tab]キーを押すと、ウィンドウ選択画面が出てきて、選んだウィンドウをトップに表示することができるショートカット。[alt]をおしながら[tab]で次のウィンドウ、[alt]をおしながら[shift+tab]で前のウィンドウを選択できる。

 自分は今までどうしていたかというと、
・ファイルをドラッグしたままタスクバーにカーソルを移動。
・ドロップ先ウィンドウ名の上でしばらく待機するとそのウィンドウがトップに表示される
・ドロップ
ってな感じ。ドラッグしたままタスクバーで待機ってのも普通しない動作だと思うが、対応しているWindowsもすごい。おそらくXp以降でのみ可能。

2009年9月24日木曜日

大胸筋強制サポーター

 ゲームパッド部分のプログラムを見直してみてる。


↑入りっぱなし状態になってしまって
ゲームできない・・・


って書き込みが某所にあって気になってたので。

 今のところ詳細な原因不明だけど、スティックの中央値を0x8000に固定してるのが原因かなと踏んでる。ちょっと調べなおしてみたところ(wXmax-wXmin)/2あたりを中央値としたほうがよさげ。そこからスティックの遊び値を計算に入れればOKっぽい。
 自分の環境ではwXmaxは65535, wXminは0なので中央値は(0xFFFF - 0x0000)/2 = 0x7FFFで、1しか差がないので問題ないといえばない。

 joyGetThreshold 関数
http://msdn.microsoft.com/ja-jp/library/cc410477.aspx

の解説に、


移動しきい値は、デバイスをキャプチャしたウィンドウに WM_JOYMOVE メッセージが送信される前に、ジョイスティックを動かさなければならない距離です。しきい値の初期値は 0 です。


とあり、キャプチャして使用している場合にのみ使う関数のような気がする。いままで遊び値を取得するのに使っていたが大きな間違いで、おそらく自分で設定しない限りは0が帰るんじゃないかと。遊びを取得する関数がないかと探してみたが見つからない。ないのかな? 

 それはそれとして、メモリの無駄遣いがひどいので修正じゃ!

 ゲームパッドのパラメータ取得には以下の関数を使用しています。
joyGetPosEx
joyGetThreshold
joyGetNumDevs
joyGetDevCaps
 検索助長なのか検索妨害なのか微妙なところ。DirectX使わなくてパッドを使用可能に出来るから、みんなゲーム作るときは組み込んでね、というおはなしじゃったんじゃ。結構「パッドが使えれば」って書き込みを某所でよく見るので。

2009年9月20日日曜日

事故怖い怖い


 すごい見覚えのある風景に思わず。
免許とっても車乗らない自分まじ賢いと思わざるを得ない。

2009年9月15日火曜日

ローカル変数のメモリ配置?


#include <stdio.h>
 
int main()
{
  int num = 0x00737569;
  int num2 = 0x61726144;
  printf("%s\n", (char*)&num2 );
  printf("%p, %p\n", (void*)&num, (void*)&num2 );
  return 0;
}

 というようなプログラムを実行したところgcc4.1.2では

Daraius
0xbfa284e8, 0xbfa284e4

 と、出力されたが、VisualC++2005EE(Debug)では

Daraフフフフフフフフius
0012FF4C, 0012FF40

 と表示された。Releaseだとgcc4.1.2と同じ結果になった。

 普通こんな使い方はしなけど面白半分にテストしてみたら自分の予想とは違った結果になった。
宣言した順番とは逆方向にメモリが確保されているのに「うん?」と思ったが、スタック構造なのを考えると納得はいく。構造体のイメージでいると「やっちゃったよ!」てな事態になるかもしれない。
 VC(debug)だと、intにもかかわらず12byteもの領域があるらしい。オプションの設定かなんかでそうなってるんだろうけど、Debugでは動くけどReleaseでは動かないなんて事態が容易に想像できるのが泣ける。


#include <stdio.h>
 
struct Block
{
  int num;
  int num2;
};
 
int main()
{
  struct Block b;
  b.num = 0x61726144;
  b.num2 = 0x00737569;
 
  printf("%s\n", (char*)&b.num );
  printf("%p, %p\n", (void*)&b.num, (void*)&b.num2 );
  return 0;
}

 を実行すると、gccでもVC(debug)でも同一の結果になった。「プログラミング言語C 第2版」の付録A8.3に構造体のメンバーは、宣言の順序に増えていくアドレスをもつ。とあるので、メモリ配置に関しては信用できる。intが4byteとは限らないし、char*に変換したときに[0]44,[1]61,[2]72,[3]61となるとも(おそらく)限らないので、結局環境依存だけど。

 いままで、ノリと勘だけでやってたから、知らんことばっかりじゃ。

2009年9月9日水曜日

立体的だと感じるには? 実験2

 前回に引き続き、オブジェクト配置後に回転させた。前回はオブジェクトを直接回転させてたんだけど、今回は視点のほうを回転させた。けれど結果に違いが出なかったというか、メタセコだと視点を動かしてるのに影の位置が変わらないらしい。仕様?


■実験1
 多重スクロールではないが、近くのものは早く、遠くのものは遅くを基本に、回転なしで。FCとかみたいな表現がもっとも立体感の出せる表現方法なのではないか? と、思ったため実験。
 結構ゲームでも似たいような表現をよく見るため新鮮さはないが、水平飛行すればだいたいこうなるのでしかたのない部分も。シンプルながら面白い。


送信者 生産がす

■実験2
 情報量が少ないのかと思い、むやみやたらとオブジェクトを増やして回転させたら、ぐちゃぐちゃしてよくわからなくなった例。
 ただ、画像上のほうの位置があまり変わらないオブジェクトに注視すると、動きの激しい部分との対比でちょと立体的に見える。
*この画像だけうまくアップできなかったので直接リンク貼る。



■実験3
 前回のとかわらないが、視点を動かしているにもかかわらず、影の位置が変わってないのにここでようやく気づく。



■実験4
 実験1、2から、情報量をほどほどにし、近くと遠くにオブジェクトを置いて回転させた。
 なかなか立体的だと感じる。どうも回転していることを確認できる範囲が広いほど立体的と感じるような気がする。オブジェクトが多すぎると、遠くのものが隠れて見えなくなるので立体感が減るのではないだろうか。見えないものはないと同じ。動きを確認できる範囲が縮小して小さい範囲だけが動いているように見えるとか、そんな感じか。
 遠くが見えていればいいので、チリのような小さいものを漂わせて立体感をだす演出はかなり効果的だと思われる。

2009年9月6日日曜日

日記ちゃん

 バニラエッセンスを買ったので、フレンチトーストに作る際使用してみた。ふんわりと甘い香りがして美味! ナイフとフォークで食べたのですげえ優雅な感じに。

 ついでに新しい歯磨き粉を買った。ピーチ味のやつ。歯磨きも優雅!

 最近マウスがいかれてきてて、クリックするとダブルクリックに化ける。ホイールクリック利かないとひどい状況になってる。無線が便利すぎてはずすわけにもいかず。近いうちに買い換えたい。
 ちなみに、クリックがダブルクリックになるような現象のことをチャタリング(Wikipedia)というらしい。この先、生きててこの単語を使うことはまずあるまい。

2009年8月31日月曜日

ポップコーン

 ポップコーンのはじける前のコーンが偶然目に付いたので衝動買いした。とりあえずサラダ油と塩でオーソドックスに作ってみたが、なかなかうまい。あほの子みたいに体積が膨張して吃驚した。コーンも安いし、酒のつまみにオススメ。

 他にどんな味があるのかと調べてみたが、醤油、バター、砂糖、インスタントラーメンの粉、黄粉、マヨネーズ、青海苔、唐辛子など、結構いろんなのがあるようだ。



誠 Biz.ID:3分LifeHacking:「ネットのしすぎ」「Twitterのしすぎ」をログで把握する
http://bizmakoto.jp/bizid/articles/0908/31/news025.html

 紹介されてる「Manic Time」がなかなか面白い。一日自分が何をしていたかが一目瞭然。

2009年8月28日金曜日

IMEショートカット


 半角で打ち込んだつもりが全角だった、ということは良くある。
そういう場合は「ctrl+t」か「F10」をおすことで半角に変換することが出来る。



そのほかに、
「ctrl+u」か「F6」で、全角ひらがな
「ctrl+k」か「F7」で、全角カタカナ
「ctrl+o」か「F8」で、半角カタカナ
「ctrl+p」か「F9」で、全角英数字
に変換できるので、覚えておくと便利。個人的にはファンクションキーよりはctrl+?のほうがスムーズに入力できる気がするが、uだのkだの覚えにくい。困ったときはF6~F10を適当に押してみれば何とかなる。


 また「ctrl+F10」で画像のようなウィンドウがでる。
辞書登録やIMEパッドをぱっと使いたいときに役立つ。

2009年8月16日日曜日

boolをfloatに暗黙の型変換?


#include <cstdio>

void func( float num )
{
  std::printf("%f\n", num);
}

int main()
{
  func( true );
  return 0;
}


 エラーも警告も表示されないのが納得いかない。
boolからfloatにって無理がないかい? 逆はともかく。

VC2005EE
警告レベル4



*追記09/08/29
 ぶらぶらしてたら以下のようなコードを見かけた。

dayofweek(y, m, d) /* 0 = Sunday */
int y, m, d; /* 1 <= m <= 12, y > 1752 or so */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}


随想録: 400年に一度の閏年
http://www.futatsugi.net/misc/essays/blog/archives/000003.html


 日付から曜日を求めるプログラムだそうだが、ぱっと見さっぱり分からない。それはともかく、y -= m < 3;というのは興味深い。trueはかならず1になるのだろうか。0以外なのは確かだが。

2009年8月14日金曜日

カジノのルーレット


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/Roulette.zip
10.9KB
ソース同封

 数字が連続で出ない確率を計算するプログラムを作って、いざ実践とばかりに無料オンラインのとこでテストしてみたら大負けしたよ! 赤が15回連続で出てすっからかんになりました、本当にありがとうございました。

 これまでに赤が連続で4回続いていた場合、計算式は(1 - 18/38)^4とした。いまひとつあっている自信は無い、悲しいことに。
連続で続けば続くほど0に近づく。15回連続で赤がでる確率は0.0000658712623。

 なんぼ計算しても結局次に何がくるかなんて、過去に何が出てるかが影響しない。赤が何億回続こうが次に黒が出るかどうかはおおよそ1/2となる。Theギャンブル。やめどきが大切。
 それはそれとして機械相手だと時々吸い取ってくるので注意。メダルなんかでも筐体によっては時間帯で排出率だかなんだかが決められるらしいしね。本当かどうかはしらないけど。

 ほどほどにまとめられたサイトを見かけたのでリンクを張っておく。
分かったことはルーレットはやめとけ、もしくはプレイ前にセーブしてまけたらロードしなおせって所か。
戦争ゲームとルーレット
http://aiai321.hp.infoseek.co.jp/nichiro02.htm

2009年8月10日月曜日

立体的だと感じるには? 実験

 特に根拠はないが、立体的だと感じるアニメーションには回転運動が重要かと思い、いくつか回転するアニメーションを作ってテストしてみた。
 結論から言えば、どれもいまひとつ立体感は得られなかった。単純な回転運動だけでは立体的だとは感じられないらしい。
 もっとこう、オブジェクトが動いてるっていうより、カメラが動いてるってことを強調する動きにしないとだめなのかな? 関係ないが、画面全体の動きが大きいほうが面白いとは思った。何かに利用できるかも。

以下、テストした画像。
各種画像はアニメーションGIFなので開くと動くんじゃないかな。











アヌビス ZONE OF THE ENDERS
http://www.konami.jp/gs/game/zoe2/japanese/
 自分の中で、3Dをもっとも感じられるゲームの一つがこれ。Downloadからゲームショウのムービーでどういった感じか確認できる。
 なぜか64マリオだと立体的だとは思わないんだよなあ。うーん。

2009年8月5日水曜日

サマーウォーズ

 みてきた。
CMではまったく面白そうに見えなかったのでぜんぜん期待しなかったんだけど、見るとかなり面白かった。

 3DCGの使い方がうまい。どのCGのシーンでも立体感を感じられる。これが簡単なようで難しい。オブジェクトをありえない速度で動かしたり、ありえない位置においたりしないとなかなか立体的と感じる絵にならないんだけど、仮想空間って設定を生かしたのかぐるぐる動く動く。色使いも結構素敵だったし、CGの部分は勉強になったなあ。これぐらいがリアルタイムでレンダリングできる時代はいつ来るんだろうかと思ったり思わなかったり。

 音も派手目なのが多くて面白い。エヴァかなんかがステレオを過剰に使って左右の離れたところから音が流れてきて面白いと思ったけど、こちらは音そのものが華やかで素敵だ、使い方は普通だけれど。ときどきおとぼけ音(なんだそりゃ)があって結構遊んでる気がする。

 花札が出てくるんだけど、自分はルールを知らないんで何をやってるのかよくわからなかった。なんかすごいことしてるんだろうなーとしか。これからみようと思う人は予習したほうが、より楽しめるかもしれないし、そりゃないだろとげんなりするかもしれない。

 全体的に演出がきつめだったけど、普通の人はついてこられるのかしら。
花札中の変身シーンに笑いそうになった。いるのかあれ。いるよ!

2009年7月25日土曜日

スタックオーバーフロー

 特に再帰をしてるわけでもないのに、スタックあふれちゃってなんでだろ? 深すぎるのかな? と、調べてたら、なんのことはない。参照にし忘れて、オブジェクトがコピーされてた。
このうっかりさんめ。

 そんなことが起こらないよう、コピーコンストラクタと代入演算子は中身かかかずにprivateにしておこう。boostに便利クラスがあるから、それを使うのもよし。

letsboost::noncopyable
http://www.kmonos.net/alang/boost/classes/noncopyable.html

2009年7月24日金曜日

nkc


 画面周りのデザインを作成中。
CAVEなノリで適当にエフェクトつけてみたら、結構ごまかしがきいてビックリした。
 とりあえずPictBearでちょちょっと数値置いてみてるんだけど、PCのメモリが640MBだからかレイヤー10枚ぐらいで限界を感じる。絵描きがメモリほしがるのもわかるわ。1手戻すのに30秒ぐらいかかるとか、ばかじょん。

 昨日、うっかりアクセス中のHDDのケーブルをひっこぬいたら、HDDにアクセスできなくなってすごいあせった。chkdskしたら直った。FAT32だったら死んでたね、きっと。

2009年7月5日日曜日

法線



 いまさらながら法線データを入れられるよう修正した。
これでライトが当たってる面とあたらない面の差がくっきり出る。各頂点に法線データが加わったことで処理速度に差が出るかと思ったが、べつに変わらなかった。ここらへんはよくわからない。

 ライト等の処理は当然重たいんだけど、背景を描くときだけライトをonに、書き終わったらライトをoffにして2D描画に備えることで、実用的な処理速度を保てた。
 Zバッファについても同様で背景を描くときだけonに。常時Zバッファを使用するとものすごく重い。理屈では無駄な描画が減らせるので軽くなりそうなもんだけど、Zバッファに触れるだけで結構コストがかかるらしい。



 全然関係ないが部屋の模様替えをした。
というのも、部屋にベッドを導入したので、ベッドの設置場所確保のためにあれこれ動かしたんだけど、もともと4.5畳しかない部屋なのですげえ狭くなった。PCやルーターが無造作に床に置かれてて歩きにくいし、椅子を動かすスペースが無いし、クローゼット閉められないしで大変なことになってるよ。死にたい。

2009年7月2日木曜日

にっきち

 買ってきた。大変愉快!
何にも調べなかったからプログラムはPCから転送でもすんのかと思ったが、本体で直接打ち込むようだ。
そのおかげで布団にもぐりながらちょこちょこと触れて楽しい。
 音がピッピなるんだけど、これが結構うるさくて夜中に触るのはちょっと躊躇する。スピーカーの線きっちゃえばいいけどな。
 いくらかプログラムがプリセットされているので別に打ち込まなくてもそこそこ遊べる親切設計。
 単三電池3本使用するので、あらかじめ用意しておかないとならないのに注意。

 2500円でアセンブラチックなことができるんだけど、LED光らせるのも命令1個とかなり簡易で非現実的な気がする。なんつーか頑丈というか。

 シャンプーにtsubakiを買ってみたんだけど、すげー匂い! 濃い!

2009年6月30日火曜日

にっきちゃ

Vol.24 4ビットマイコン 大人の科学マガジン 大人の科学.net
http://otonanokagaku.net/magazine/vol24/index.html

 ひゃっはー! はつばいびだー!
かいにいく。


/***/

 書店にいったら発売日が7/1、近日入荷となってた。The ぬか喜び!
あと、ついでにシャンプーとボディソープを買おうと思ってたのにすっかり忘れてた。

2009年6月26日金曜日

日記ちゃん

 たわむれに1km走ってみたら体温がもりもり下がって凄い寒い。
あと2時間ほどたつのに息切れが収まらないよ! 歳だ!

*追記
 熱中症らしい。
(1)熱中症招く「無知と無理」 : 健康プラス : 医療 : 医療と介護 : YOMIURI ONLINE(読売新聞)http://www.yomiuri.co.jp/iryou/medi/plus/20090804-OYT8T00487.htm?from=yoltop


 関係ないけど「もりもり」って擬音(?)が今自分の中でブームだ。
語感がかわいらしい。「しゃりしゃり」とかも好き。

2009年6月24日水曜日

にっきちゃん



 ペンギン作って遊んでた。
それにしてもおなかすいたなぁ

 お寿司食べに行って、
コーン巻きとシーチキン巻きとお稲荷さんとかっぱ巻き食べてきた。
おなかいっぱいになった。564円

 なんか急に父上の持ち物がなくなってた。
なんだろ? 離婚でもすんのカナ。

2009年6月22日月曜日

日記ちゃんがmemory pool

 メモリプールの挙動が怪しかったので、取得と解放を繰り返すだけのプログラムを書いて動かしたらメモリリークした。たかが128Byteのメモリプールをうまくコントロールできないとか涙が出る。
 ここ数週間ずっとそんなかんじ。

 たぶん解決した。
メモリ最適化のときに、空きメモリを指すポインタがおかしい値になってた。これを修正したらとりあえずリークしなくなった。

 修正したメモリプールをゲームのほうに適用したら、まだエラー出たんで、なんでよーって具合。
メモリプールはおかしくない!俺は常に正しい!俺が間違うことはない!
犯人はお前だ! 撲滅! オーバーフロー!
って、勘でoggをデコードするプログラムを見直したら、範囲外にもりもりファイル読み込んでた。
直したらエラーでなくなった。
たたかいはおわった。

 

 以下、使用中のメモリプール。
newと比較したところ10000000回で1000ms程度の差。つまりほとんど差なし。
resizeできたら面白いかなーと思ってvectorを使用しているけど、std::allocとかのほうが速いと思う。
参考程度に。

●基本イメージ
□□□□□□□□□□□□
↓メモリ頂戴
■■■■□□□□□□□□
↓メモリ頂戴
■■■■■■■■□□□□
↓返すよ
□□□□■■■■□□□□

こんな感じ。


●メモリ最適化イメージ
■■■■□□□□■■■■□□□□
[■4][□4][■4][□4]
↓返すよ
□□□□□□□□■■■■□□□□
[□4][□4][■4][□4]
↓最適化
□□□□□□□□■■■■□□□□
[□8] [■4][□4]



●欠陥
以下のような状況が頻繁に発生する
□□□□□□□□
↓1つ頂戴
□□□□■□□□
↓5つ頂戴
□□□□■□□□空きが無いから無理



#include <limits.h>
#include <windows.h>
#include <cstdio>
#include <tchar.h>
#include <vector>
 
 
 
class Pool
{
private:
  struct PoolObject
  {
    size_t blockNum;
    bool use;
 
    // デバッグ用オーバーフローチェック
    unsigned short check;
    enum { CHECK_PARAM = 0x5353, };
  };
 
 
 
  /** プール */
  std::vector<PoolObject> m_pool;
 
  /** 使用したメモリ量 */
  size_t m_useBlockNum;
 
  /** 次に確保しようとするメモリの先頭位置 */
  PoolObject* m_head;
 
public:
 
 
  /**
   * compaction
   * 隣り合った空きメモリを結合する。
   */
  void compaction()
  {
    m_head = NULL;
    size_t space = 0;
 
    const PoolObject* lastPoint = &m_pool[0] + m_pool.size();
    PoolObject* runner = &m_pool[0];
    for (; runner<lastPoint; runner+=runner->blockNum)
    {
      // err
      if ( runner->blockNum == 0 )
      {
        OutputDebugString(TEXT("Memory Pool Error...(object size == 0)\n"));
        abort();
        break;
      }
 
      if ( runner->use && space )
      {
        (runner - space)->blockNum = space;
        space = 0;
      }
      else if ( runner->use == false )
      {
        if ( !m_head ) m_head = runner;
        space += runner->blockNum;
      }
    }
 
    if ( space )
    {
      (runner - space)->blockNum = space;
    }
 
    if ( !m_head )
    {
      m_head = &m_pool[0];
    }
  }
 
 
 
private:
  /**
   * searchSpace
   * 空きメモリを探す。
   * @param blockNum 確保したいメモリ量(ブロック単位)
   * @return 見つけた空きメモリのポインタ。確保できないようであれば NULL。
   */
  PoolObject* _searchSpace( size_t blockNum )
  {
    // search
    const PoolObject* lastPoint = &m_pool[0] + m_pool.size();
    for (PoolObject* runner=m_head; runner<lastPoint; runner += runner->blockNum)
    {
      if ( runner->use == false &&
        runner->blockNum >= blockNum )
      {
        return (m_head = runner);
      }
    }
 
    // compaction
    compaction();
 
    // search retry
    for (PoolObject* runner=m_head; runner<lastPoint; runner += runner->blockNum)
    {
      if ( runner->use == false &&
        runner->blockNum >= blockNum )
      {
        return (m_head = runner);
      }
    }
 
    // space none
    return NULL;
  }
 
 
 
  /** sizeToBlockNum */
  static inline size_t sizeToBlockNum( const size_t size )
  {
    // ヘッダ用とデータ用で2は必ずいる
    return size / sizeof(PoolObject) + 2;
  }
 
 
 
  /** blockNumToSize */
  static inline size_t blockNumToSize( const size_t blockNum )
  {
    return blockNum * sizeof(PoolObject);
  }
 
 
 
public:
 
 
  /**
   * constructor
   * @param 作成するプールサイズ
   */
  explicit Pool( size_t size )
    : m_pool( sizeToBlockNum(size) + 8 )
    , m_useBlockNum( 0 )
    , m_head( NULL )
  {
    if ( size > 0 )
    {
      PoolObject* po = &m_pool[0];
      po->blockNum = m_pool.size();
      po->use = false;
      m_head = po;
    }
  }
 
 
 
  /**
   * destructor
   */
  ~Pool()
  {
#ifdef _DEBUG
    if ( m_useBlockNum )
    {
      Debug::outputDebugString( TEXT("[Pool]memory reak!: %dbyte, poolSize: %d\n"), getUseSize(), getPoolSize() );
    }
#endif
  }
 
 
 
  /**
   * alloc
   * プールからメモリを取得する。
   * @param size 取得したいメモリ量
   * @return 使用可能なアドレス。取得に失敗すればNULLが戻る。
   */
  void* alloc( size_t size )
  {
    // はなから空きがないのでお帰りください
    const size_t newBlockNum = sizeToBlockNum( size );
    if ( m_pool.size() - m_useBlockNum < newBlockNum )
    {
      return NULL;
    }
 
    PoolObject* po = _searchSpace( newBlockNum );
    if ( !po )
    {
      Debug::outputDebugString( TEXT("noneSpaceError: %d\n"), size );
      return NULL;
    }
 
 
    // もしも空きサイズが取得したいサイズよりも大きければ、空きサイズを減少させる
    if ( po->blockNum > newBlockNum )
    {
      PoolObject* next = po + newBlockNum;
      next->use = false;
      next->blockNum = po->blockNum - newBlockNum;
 
      // ここにこなかった場合ぴったりサイズなので設定しなおさなくていい
      po->blockNum = newBlockNum;
    }
 
#ifdef _DEBUG
    po->check = PoolObject::CHECK_PARAM;
#endif
    po->use = true;
    
    m_useBlockNum += newBlockNum;
    m_head = po + newBlockNum;
 
    // PoolObject一つ分だけずらしたアドレスを戻す
    return (po + 1);
  }
 
 
 
  /**
   * free
   * @param 返却するメモリのアドレス。
   */
  void free( void* obj )
  {
    if ( obj )
    {
      PoolObject* po = static_cast<PoolObject*>( obj ) - 1;
#ifdef _DEBUG
      if ( po->use == false )
      {
        Debug::outputDebugString( TEXT("2重解放? - [%p]size: %d\n"), obj, blockNumToSize(po->blockNum) );
      }
      else if ( po->blockNum == 0 || po->check != PoolObject::CHECK_PARAM )
      {
        Debug::outputDebugString(TEXT("オーバーフローの疑い: %p\n"), obj);
      }
      else
#endif
      {
        po->use = false;
        m_useBlockNum -= po->blockNum;
      }
    }
  }
 
 
 
  /** プールのサイズ取得 */
  size_t getPoolSize() const { return blockNumToSize( m_pool.size() ); }
  /** プールのメモリ使用量を取得 */
  size_t getUseSize() const { return blockNumToSize(m_useBlockNum); }
};



 空きメモリをリストにして、要求があればリストから渡すようにすれば高速化できそう。
ただメモリ最適化のときに、空きメモリリストもいじらないといけなくなるので処理時間が気になる。メモリ要求回数が圧倒的に多いから、全体的には速くなると思うが。

2009年6月6日土曜日

273号

273号
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name273.ogg

size: 1.7MB
製作時間: 5時間ぐらい
ツール: ピストンコラージュ ver 0.9.1.4
音源: PEPOFONT ver0.70

 Bメロが凄い苦手で、研究がてら。
AからBへは調が一緒なら(もっと的確な言葉がある気がする)割と強引に行っても大丈夫っぽい。
つなぎ方がいまひとつよくわからないから適当に作らざるを得ない。

2009年5月29日金曜日

日記ちゃん

 小腹が空いたんでおにぎりを作ったんだ、おにぎり。おむすび。さんかくの。
シーチキンマヨネーズおにぎりを作ったんだけど、シーチキンの油でおにぎりが炒飯のようにぱらぱらになってうまく握れないんだ。
もちろん、シーチキンの油はちゃんと切って使用したんだけど、なかなかうまくいかないもんだね。
あとマヨネーズの味がしない。

 マヨチキおにぎりを作るときは、シーチキンの油をクッキングペーパー等でがっちり取ろう。マヨネーズはありえないほど使おう。と、いう話だったさ。
もしくはおにぎりを作るな。

2009年5月17日日曜日

IndexBuffer

 DrawIndexedPrimitive()しかないものだとばかり思っていたがDrawIndexedPrimitiveUP()も存在することに昨日気がついて、それから今までずっと実装してた。
 std::vector< Vertex >とstd::vector< WORD >にデータをつめこんだあと、DrawIndexedPrimitiveUPでレンダリングする。
 ビデオカードによってはIndexBufferが使えないのもあるようなので、DrawPrimitiveUPでもレンダリングできるよう互換性ももたせる。いまどきそんなPC使う人いんのかよと思わんでもないが。それを言ったら、いまどき頂点つみこみとかせんか。

 やることは簡単なんだけど、デバッグにいちいち表示して確認してたもんだから時間がかかってしょうがないわ。

以下アバウトな実装

/** 頂点情報 */
struct Vertex
{
  float x, y, z;
  D3DCOLOR color;
  float tu, tv;

  // 頂点FVF
  enum { FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1, };
};


/** 頂点バッファ */
std::vector< Vertex > m_vertex;
/** インデックスバッファ */
std::vector< WORD > m_index;



/** 三角ポリゴンの追加*/
virtual bool addPolygon(
  const Vertex& vertex1,
  const Vertex& vertex2,
  const Vertex& vertex3 )
{
  const WORD baseIndex = static_cast( m_vertex.size() );
  m_index.push_back( baseIndex + 0 );
  m_index.push_back( baseIndex + 1 );
  m_index.push_back( baseIndex + 2 );

  m_vertex.push_back( vertex1 );
  m_vertex.push_back( vertex2 );
  m_vertex.push_back( vertex3 );

  return true;
}


/** 描画 */
bool render( LPDIRECT3DDEVICE9 device )
{
  if ( m_index.size()/3 > 0 && device )
  {
    device->SetFVF( Vertex::FVF );
    device->DrawIndexedPrimitiveUP(
      D3DPT_TRIANGLELIST,
      0,
      static_cast( m_vertex.size() ),
      static_cast(m_index.size()/3),
      &m_index.at(0),
      D3DFMT_INDEX16,
      &m_buffer.at(0),
      sizeof(Vertex) );

    return true;
  }

  return false;
}

 注意点として、D3DFMT_INDEX16と指定している以上65535以上のインデックス番号はオーバーフローしておかしくなる。適当にエラー処理は必要。

2009年5月7日木曜日

261号

261号
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name261.ogg

サイズ: 2.0MB
ツール: ピストンコラージュ v.0.9.1.4
     SoundEngine Free ver 3.09
音源: Timidity + eawpatchesFluid - Release 3

 ベースにハープを使うありえない音系。
楽器ごとの音域を把握したほうがいいんだろうね。
ソプラノってどこからどこまで? とかいってる俺は無縁。
近いうちに勉強したい。

 あと、音源を盛大に勘違いしてた。ありえない耳の悪さにびびれ!

2009年5月2日土曜日

日記ちゃん

『何回噛んでる?』片噛みじゃない方、教えて下さい。 -OKWave
http://okwave.jp/qa4852225.html?check_ok=1

 生まれてこの方、ご飯は片方の歯で噛むものだと思ってたけど違うんだ。
ショックを隠しきれない……。
食べ物が左右に半分こされるとか信じられないよ。
ガムとかどうやって噛むん?

259号

http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name259.ogg
259号
サイズ: 1.7MB
製作時間: 1時間ぐらい
ツール: ピストンコラージュ v0.9.1.4

 音源を1年半ほど前に使っていたものに戻してみました。
Timidityにeawpatchesって音源を設定しwavに録音したものを使用。素直にmidiでやれ。

 同じコード進行の繰り返しをメロディの変化でごまかす実験。

2009年4月26日日曜日

にっきty


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090426.zip

 ダッシュの実装
ダッシュボタンを押した瞬間から10F間移動速度が2倍
その後6Fはダッシュボタンを押してもダッシュしない。
ダッシュのエフェクトにはわっかと適当な線、さらにパーティクルを描画している。


 既存のゲームとか見てると、少ないエフェクトを効果的につかっててすげえと感心する。
必要最小限というか、よく見るとエフェクトすくないんだけど、変な感じがしない。
GBなんかだとさすがにエフェクトがんばれよと思うものもあるんだけど、GBでも後期の作品になるとエフェクト1個しかないのにすごいかっこいいのとかあったり。
 自分のはとりあえず沢山だしとけって感じに、ぼこぼこ表示してるけどいまひとつ印象に残らない。

2009年4月21日火曜日

FontToBitmap


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/FontToBitmap.zip
size: 36.7 KB

□概要
 文字をasciiコードの順番で描画し、Bitmapファイルに出力します。

□使い方
 FontToBmp.exeを起動することで、同フォルダにfont.bmpが出力されます。
 細かい設定はconfig.iniに記述します


 似たようなのを探すと意外にこれというのがない。
文字が足りなかったり、位置調整が出来なかったり、フォントが選べなかったり。
そんなわけで自分用に作成がてら、少し汎用的にして外にも公開。

 Windows98SEではGetPrivateProfileSectionが正しく動かないので、動作対象外。
確保したメモリ先にデータが流れてこない。

error C2857


error C2857: /Ycstdafx.h コマンド ライン オプションで指定された '#include' ステートメントは、ソース ファイルに含まれていません。

 Debugビルド時のみこのエラーがでてコンパイルが出来ない問題が発生した。
Releaseだとこのエラーは出ないから、オプションが何かしらの影響を与えているらしい。

 「プリコンパイル済みヘッダーを使用しない」や「ランタイムライブラリ」をいじったりとあれこれしてみたが解決できず。
「前処理済みファイルの生成」をいいえから変更すると、それとなくコンパイルが通るんだけど、結局別の問題が発生する。

 結局、新規にプロジェクトを生成しなおして、ファイルを追加してコンパイルしたら通った。
原因はわからずじまいだけど、動かないままよりは幾分ましか。応急処置。
ググっても具体的な解決方法が出てこなかったので、一応参考までに。

2009年4月20日月曜日

nikkichan

 なんか最近PCの動作重いなーとか思って、
ふとデフラグ分析したら全面真っ赤だった。
そんなわけでデフラグ中。

 その間暇なんで、古いPCでちょこちょこ遊んでる。
CPU: Mobile AMD Duron 800Mhz
メモリ: 256M
ビデオメモリ: 4M
  ATI RAGE MOBILITY-CL AGP
サウンド: VIA Audio
のようなスペック。DirectXSDKを入れるのに3時間かかった。貧弱。

 適当に現在作成中のプログラムを動かしたところ、
表示はされるものの、2秒に1フレームと超低速。
以前作成したGDIの某STGはさくさく動くのに、DirectXにしたとたん満足に動かないとは。
ちなみにDirectXSDKを入れる前はエラーも出さずに即終了していた。少しまずい。
 多少いじくってみたところ、Zバッファを切るとかなり速くなった。20FPSぐらい。
背景3Dはあきらめざるを得ない。もしくはZバッファを使わなくてすむように頂点を調整するか。
 またテクスチャレンダーがうまく機能しない。
CreateTextureにD3DUSAGE_RENDERTARGETを指定しているけど、関数が失敗する。
D3DFMT_A8R8G8B8が対応してないのか。いや、それはないか。
 シェーダは1.0すら動かない。ごみじゃねえか!
そのほかはかねがね普通に動くようで、スクリーン、加算、乗算、半透明合成は正しく表示される。
東方の紅魔郷(体験版)だと加算合成だかの表示がおかしかったので、てっきり動かないものかと思ってた。
D3DMATRIXA16もMMXだか3DNow!だかしらんが何か動いてるらしく、
D3DX: (INFO) Using AMD optimizationsと表示される。
音周りもとくに不具合は見当たらない。

dxinfo
http://www.netsphere.jp/dxinfo/
にデータがなかったので、ずうずうしくもレポートを送信した。
何かの役に立てば幸い。

2009年4月14日火曜日

3Dオブジェクト



 ようやく当初の目的である、背景3Dな2DSTGっぽいことが出来るようになってきた。
前はMesh使わないとオブジェクトを設置できなかったけど、なんとか自力で描画できるようになった。
頂点情報をプログラムで算出してるから、複雑な形状は不可能。
外からデータを取ってこれるようにすればそれっぽいのかな。




D3DXMatrixPerspectiveFovLH(
  &proj,
  Math::degToRad(120.f),
  800.f/600.f,
  0,
  5000
);

 プロジェクション設定を上記のように間違えてて、
Zバッファがうまく動かねえってしばらく詰まってた。正しくは、

D3DXMatrixPerspectiveFovLH(
  &proj,
  Math::degToRad(120.f),
  800.f/600.f,
  1,
  5000
);

のように、パラメータを0→1にする。0ではうまく動かないらしい。
このミス、前もした気がする。


 頂点座標の計算は

D3DXMATRIXA16 mat, calc;
// 拡大
D3DXMatrixScaling( &mat, 省略 );
// 回転
D3DXMatrixRotationYawPitchRoll( &calc, 省略 );
mat *= calc;
// 平行移動
mat._41 += moveX;
mat._42 += moveY;
mat._43 += moveZ;

 とかやると、拡大回転移動成分でできた行列が出来るので、

D3DXMATRIXA16 tmp;
D3DXMatrixIdentity( &tmp );
tmp._41 = 元データの頂点位置X;
tmp._42 = 元データの頂点位置Y;
tmp._43 = 元データの頂点位置Z;
tmp *= mat;

 のように、行列に3Dモデルの頂点座標をセットしてから掛けてやると、
回転や移動後の座標が得られる。
 動かしてみたらうまく動いたからこのようにしてるけど、
論理的に正しいのかどうかは分からん。
 行列って数ⅢAかなんかだったっけ。まったく覚えてないね!
*090420追記
 数ⅠA、ⅡB、ⅢCって区分だと後からわかった。何よⅢAって。
いかにわかってないかがわかる。俺の背中。俺スタイル。

2009年4月10日金曜日

日記ちん

Vol.24 4ビットマイコン 大人の科学マガジン 大人の科学.net
http://otonanokagaku.net/magazine/vol24/index.html
2009年6月下旬発売予定
予価:2,500円(税込)

 これは買わざるを得ない。世代じゃないけど興味心身だ。

2009年4月1日水曜日

constなメンバ変数を持つクラス


class Test
{
private:
  const int m_val;

public:
  Test( int num )
    : m_val( num )
  {}

  int getVal() const { return m_val; }
};

 ってなクラスを作成しコンパイルしたところ、
warning C4512: 'Test' : 代入演算子を生成できません。
と怒られてしまった。
メンバからconstをはずすと問題なくコンパイルが通る。

 考えてみれば、

Test t(10), tt(100);
t = tt;

なんてこともできちゃう訳だけど、メンバがconstだからコピー出来ない。
 そんなわけで、

class Test
{
private:
  int m_val;
  const Test& operator = ( const Test& );

public:
  Test( int num )
    : m_val( num )
  {}

  int getVal() const { return m_val; }
};

と、このように明示的にコピーを不可能にすることで、コンパイルが通るようになる。

 30分ほどなんでよーって悩んだ。
コンパイルが出来たり出来なかったりして意味がわからなかったが、
共通点を探すとコピー不可にしていたことから、あー、なるほどってな具合。
ググってもぱっと出てこなかったので記述しておく。

にっきちゃん

 車のナンバーの値を足して遊びながら散歩してたら、道に迷った。
線路沿いに歩いていけば隣に駅に到着できるよねー、
とか言って線路沿いを歩いていたのに、なぜか出発駅に到着する七不思議。
頭がどうにかなったのかと思ったわ。

 5+7とか6+7とか8+7がすげえ苦手なことが分かった。
12だか13だか混乱する。頭悪い。
何がハッピーセブンだ、死んでしまえ!

2009年3月27日金曜日

日記ちゃん


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090327.zip


 特にこれといって技術的進歩はない。
ただ、減算合成より乗算合成のほうが軽かったため、黒くなるエフェクトは乗算合成に切り替えた。
ほかに武器レベルアップ処理を追加したり、一部エフェクトが増えたり、
武器が少し増えてたり、気分転換にマップチップを切り替えてたり、
フォント描画処理を改良したり。


 テクスチャの限界サイズがいくらなのかちょろっと調べた。
http://www.netsphere.jp/dxinfo/
を参考にした。
オンボードでも2048*2048ぐらいは読めるみたい。
大きいものだと8192*8192なんてものもあって、ちょっとしたゲームならテクスチャ一枚でいけちゃう。
最小は256*256らしいが、Windows98とかの時代のものなので無視してもいいように思う。
特に根拠はないが自分は512*512にしてる。
心境的には256*256にしたいが小さすぎてやりにくい。

 最近、体を動かすと体調が良くなることが分かったので、しょっちゅう散歩に出かけてる。
町をぐるっと一周したり、前に住んでいたところを探索してみたりすると楽しい。
ただ散歩するだけというのももったいないので、ドクペを売っているところがないか探している。
スーパーは一通り周ったが、今のところ売ってるのを見たことがない。

2009年3月10日火曜日

ソード


 http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090310.zip

 ソード的な何かを実装。
判定処理を少し改良したので、ちょっとぐらいなら複雑な判定も可能に。
1フレーム中に小さな□の判定をすこしづつずらしながら、複数回判定チェックを行う力技。
判定なんて□か○のどっちかなことが多いし、他に方法はないんじゃないかと思うけどね。
特に更新ねたもないし、バックアップがてらに。

2009年2月23日月曜日

壁(3)



 普段ロープレとか壁があるゲームやらないから知らなかったけど、
壁の角に引っかからないようにするのが普通らしい。

2009年2月22日日曜日

壁(2)


 つないだ。
つながりパターンを全部紙に出してみて、
効率の良い方法がないか模索してみた結果、以下のような配置になった。



 結局力押しな感じに。

2009年2月21日土曜日

壁



 シレンやトルネコみたく、
壁を上下左右つながったグラフィックにしてみようと試してみたが、
ぜんぜんうまくいかなかった。
結構手を抜いてるように見えて、すげえ枚数いるぞあれ!

 具体的に何枚いるのかざっと計算すると、壁のみで47パターン。
床も合わせるとさらに増える。
水辺とか階段とかトラップとか考えると100枚超えるんじゃないか。
いったいどこにそんなグラフィックを格納するメモリがあるのか不思議でならない。





 あれこれ考慮したマップチップを作って適当に並べてみた。
ってかRPGツクールGBかなんかで壁チップ見習えば早かったんだ。
なんでわざわざ紙面上で全パターン考えたりしたんだろう。
馬鹿じょん。時間の無駄じょん。
 膳は急げとGBC起動してみたが、
ツクールGBはマップチップ編集がそもそもなかった。参考にならない。


 字を書くためにわざわざペンタブ引っ張り出したよ。
すっごいひさしぶりにペンタブさわった。




 全チップを適当につめたもの。
プログラミングすることをぜんぜん考えてなかったが、
たぶん効率のいい置き方があると思われる。
ツクールシリーズはマップチップを手動で置くので乱雑におかれてるはずだけど、
シレンとかトルネコとかの不思議のダンジョンシリーズだと
マップが自動生成なのでうまい具合にチップを配置してるんじゃないかな?
パクリたい。

2009年2月14日土曜日

日記ちゃん


 ミニマップの表示とoggのストリーミング再生に対応してBGMを鳴らせるように。
テクスチャレンダーもZ使わなければ軽い?
ってか去年試したときは重くて仕方なかったけど、なんだったんだ。
 ミニマップのアルゴリズムがバグっててうまく動かない。
計算式が思いつかないまま、半日ほど行き詰った。
あと表示が邪魔。どうしよ。

2009年2月13日金曜日

効果音をoggに

http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090213.zip
0.7MB

 効果音をwavからoggにしたよ。
oggのライブラリ分exeのサイズが200KB増えたけど、
wavファイルをoggにした分で、音データ量が1.38MBから0.15MBに減少したから、
全体的には小さくなったのかな?
 読み込みに時間がかかってるはずだけど、今のところは一瞬だなあ。
ファイル数少ないし、まあそんなもんか。
 ストリーミングも実装しなきゃで、テスト段階ではとりあえず動いてるんだけど、
Thread周りの終了処理が怪しいからなあ。怖いなあ。


 あれこれ調べたり実装したりで10時間プログラミング。
ゆうちゃんはやればできる子だって、母上も言ってた!

2009年2月12日木曜日

236号

http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name236.ogg
236号

 風邪で寝込んでる間に作った曲。これといったテーマはない。
ピストンコラージュ付属のptNoizeでClap音を作ろうとあれこれ弄繰り回したけど、
Snareみたいな音にしかならんかったよ。
とりあえずそれ使ってぽいぽい。微妙にテンションが高くて疲れる曲が出来上がった。

ツール: ピストンコラージュ v0.9.1.3
音源: デフォルト+α
製作時間: 3時間ぐらい

2009年2月9日月曜日

ogg -> wav

Ogg Vorbis入門編http://marupeke296.com/OGG_main.html

 ココのサイトさんを参考にしてたんだけど、「その2」ですでにつまってたのが昨日。
PlaySoundでならないけどなんでだろ?
めんどくせぇ、いったんファイルに吐き出してみて、
他のツールでwavに変換したファイルと比較してみよう!

で、原因が分かった修正したら無事音が鳴るようになった。

memcpy( fmt, "fmt ", 4 );
を
memcpy( fmt, "fmt", 4 );
と書いてたのが問題だった。
バイナリでは0x20でないといけないのに0x00になってたのが原因。
なんというか、まあ。
馬鹿じょん。

2009年2月8日日曜日

お店


最近行った実装:
・ショップ的なもの。
 買うとなくなる仕様にしたら、操作がやや不鮮明に。お値段ランダム。
・カスリ
 演出だけ。
・ワイドショット、テールガン、ロングショット
 ショップの品数を増やすために無理矢理。
・フォースフィールド
 3回ダメージ回避のアレ。ショップで購入可能。
・レベルアップ
 ようやく。
そんな感じ。
oggのストリーミング再生を実装しようとして詰まってる。
ファイル読んでwaveに変換してWinAPIでPlaySoundするも音ならない。
エラーも出てないから何が悪いのかよくわからん。waveデータがおかしいんだと思うが。

2009年2月7日土曜日

233号

233号
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name233%7C_2.ogg
1.1 MB

DC#BAが使いたかっただけ。
冬っぽい。

random

良い乱数・悪い乱数
http://www001.upp.so-net.ne.jp/isaku/rand.html


static long x=1;
void srand(long s) { x=s; }
long rand() { x=x*1103515245+12345; return x&2147483647; }

 シンプルすぎて惚れる。

 まあそれはともかく
どうもマップ生成に再現性がなくて困っている。これではリプレイが実装できない。
 いままでMersenne Twister を使ってたんだけど、
コピペで使ってはいるが、実は使い方を間違ってるんじゃ? と思って検索をかけた。
 SFMT ってMTの弟が出来てた事が分かったが、
盛大にスルーして最初に書いたサイトさんにあったXorShift を試してみることにした。



unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; w="(w^(w">>19))^(t^(t>>8)) );
}

 それなりに高速でそれなりに実用的とのこと。

 ランダム生成部分を書き換えて実行してみたところ、
やはりマップ生成に再現性はなかった。
 分かったことはランダムの使い方は間違ってなかった。
自分のプログラムが糞だった、という当然の結論だった。

 必要最小限のプログラムをためしてみると問題なく同じマップが生成されるので、
どこかで何かがrand()を呼び出してるんだとは思うが、どこかわからん。

リプレイ? もう知らん。

 

2009年2月6日金曜日

ピストンコラージュあれこれ

ピストンコラージュ Part2スレより引用


42 :名無しサンプリング@48kHz:2007/06/03(日) 19:16:43 ID:Zw2KVKlO
KEY PORTAの使い方がよく分からん

43 :41:2007/06/03(日) 21:57:54 ID:01JkLZwz
KEY PORTAは音を滑らかにうねうねさせる感じが直感的に

KEY CORRECTは音の高さを微妙に 数Hz下げたり上げたりするためのものなの?

KEY CORRECTで検索してみるんだけど 一向にそれっぽいのがヒットしない。

あと、1行だけのわけの分からない質問してごめん。

44 :名無しサンプリング@48kHz:2007/06/03(日) 22:18:05 ID:u3LrGDzJ
2つ同じユニット作って、
KEY CORRECTで微妙に音程をずらして再生するとちょっとうれしい効果


 自分にもよくわからなかったので試してみたが、
keyCorrectを2にすると元の音より1オクターブ高い音が流れた。
1オクターブ12音なので、1/12ずつ変化させればきりの良い音が出るかと思ったけど、
そう単純ではないようだ。




635 :名無しサンプリング@48kHz:2008/03/31(月) 09:10:19 ID:lORjQiJx
質問。
キーを変えるとテンポも変わってしまうんだが、
これってどうにもならない?

636 :名無しサンプリング@48kHz:2008/03/31(月) 13:17:18 ID:Bfjt6hIs
>>635 音源そのものを工夫するしかないような気がする。
ビデオとかで早送りとかスロー再生とかすると
音が高くなったり低くなったりするあれと同じ原理だから(多分)。


891 :名無しサンプリング@48kHz:2008/09/02(火) 20:44:41 ID:TTQvfZVD
音声を適当に切り取ってwavで保存して突っ込んだら
音符を伸ばしても音が伸びません!どうしたらいいでしょう?

892 :名無しサンプリング@48kHz:2008/09/02(火) 20:47:40 ID:IXtBZo9/
wavの長さが足りないんじゃない?
高い音符を置く時はそれなりに長くないと途中で切れるよ。


 気にしたら負けだと思ってあきらめてる。
特に困ったことはないけど、Stringsとか高い音で鳴らすと途中で途切れちゃったり。





974 :名無しサンプリング@48kHz:2008/11/13(木) 21:46:54 ID:iBcHp8Yu
PAN(TIME)・・・演奏者の立ち位置を決める

って認識でいいのでしょうか?

975 :名無しサンプリング@48kHz:2008/11/13(木) 21:54:15 ID:eZJCeqGi
>>974 と言うかボリュームもタイムも、どっちのPANもそう。ずらせば、ずらした方向から音が鳴る。
とりあえずオーケストラ楽曲でステージの配置どおりに曲を演奏させるのでなければ、メインメロディが真ん中になるな。

ボリュームパンは、右と左の音量に差をつけることで、立ち位置を感じさせる。
タイムパンは、右と左の鳴るタイミングを微妙にずらすことで、立ち位置を感じさせる。


  この機能がよくわからなくて調べてたんだ。スレはもう死んじゃってるしメモがてら保存。

2009年1月31日土曜日

日記ちゃん

 google先生の反逆。
どういうオチに行き着くか少し楽しみ。
あと、体重が夢の40台前半にいきついたぜ!
死ぬ。



(追記)
米Google、検索結果すべてに警告が表示された件で謝罪と説明http://internet.watch.impress.co.jp/cda/news/2009/02/01/22283.html

 凡ミスらしい。よくある。
自分も、うっかり作ったゲームの無敵設定忘れて公開したこととかあるよ。
バックアップするためにファイル整理しててソース全消しにしたこととか。
今さっきだって、記事をアップしようとしたらエラー出て無かったことに。
備えあれば憂いなし。出来ることからこつこつと!

2009年1月28日水曜日

ホーミングミサイル


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090128.zip

 ホーミングは良い。心が躍る。
当たるとしばらく爆風が発生してダメージを与えられる仕様。

 ほかにエフェクトを描画しすぎて白くなっても、とりあえず壁は見えるように修正。
エフェクトよりも上にもう一度壁を半透明率25%でレンダリングした。
半透明合成は下地と同じ色を塗っても色が変わらない特性を利用した。
 おなじことをエスプガルーダ2のボスなんかがやってて、
ボスにショットをあててもエフェクトでボスが隠れない。実に細かい。さすが10年保障だ。

日記ちゃん


 大復活サントラ来た。
今回、なんか大きな箱に入ってたから中に何が入ってるんかと思ったら、
中身はいつもどおりだった。
以前は封筒に入ってたのに。破損が多いのかな?
 
 今日、中古ゲームショップへ行ったらワゴン棚が出来てたので適当にあさってきた。
・ゼルダの伝説 時のオカリナ
・星のカービィ64
・スターツインズ
を、それぞれ280円で購入。
そのうち一つはカセットの裏に「もりた すぐる」ってひらがなで書いてある。

2009年1月25日日曜日

まるちぷる


 白くてよくわからない。
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090125.zip

 前作同様オプション完備。
とりあえず12個の金魚の糞があなたの戦闘をサポートします!
Zキー:ショット(押している間角度固定)
Xキー:ウェポン(回数制限あり)
Cキー:ウェポン変更(ランダムで)
Vキー:ポーズ(デバッグ情報が表示されます)
 どうせまた仕変するから別に詳しく書かなくていいよね。誰も見ないし。

 つーことで、自分のPCではすでに処理できないからどうにか予定変更しなければならない。
敵の数が増えていく展開はだめだ。
あと世界観とかぼちぼち決定しないと、グラフィックがかけない。

2009年1月22日木曜日

ホーミングレーザー的なもの


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090122.zip
 ホーミングレーザーの実装と経験値アイテムの実装。

 ホーミングレーザーは生成後16Frameは正面方向に向かって誘導し、
16F以降は近くの敵に誘導する。
旋回角度は初期が16度で、1Fごとに0.125度づつ増加。
最終的には1Fで26度、旋回可能になる。
 レンダリングはかなり適当で
レーザー現在位置に「-」の形をした画像を回転して設置しているだけ。
せっかくポリゴン使えるんだからポリゴンでやれよ!
 発射時の速度と角度をある程度ランダムにすると、かなりそれっぽく動くみたい。
けれども、近くの敵を探す処理がなかなか重い。

 経験値アイテムもホーミングと似たような実装になってるけど、
ホーミングレーザーよりも旋回角度が浅い。
それに角度計算も1FおきでCPUにやさしめ。
生存時間が長いから最終的には自機に接触する仕様になっている。
 自機をぐるぐると回すと、経験値アイテムは自機に接触することなく寿命を迎えるけど、
まあいいか。
それにしても、この動きを衛星が回るみたいでかっこいいととるか、
蛾が群がってるみたいでキモイととるか、微妙なところだ。


 後ろでエロゲ動かしてたらグラフィックがばぐった。
メモリ不足?

2009年1月21日水曜日

224号

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

 うー……。

ツール: ピストンコラージュver0.9.1.0
音源: ピストンコラージュのデフォルト音源
製作時間: 1時間ぐらい

 ドラム>ベース>コード>メロディ>他装飾
の順番に作成。
ドラムとベースだけでそれなりに聞けるものが作れれば、
あとは適当にやってもなんとかなる。
打楽器だけの曲もこの世の中にはあるんだから、ドラムが最重要だと踏んでる。
ベースで雰囲気をだして、メロディで個性を出す感じだろう、たぶん。

 ピアノ曲? そんなものはない。

2009年1月11日日曜日

日記ちゃん

 日記ちゃん久しぶり!

 今日友人と遊ぶ予定になっていたので、ゲーセンで時間をつぶしつつ待っていたの。
そしたら、
「今日眠いからなしね♥」
とメールが来て、俺に大ダメージ!

 むしゃくしゃして、近くのデオデオに足を運ぶと、
250GBのHDDが3980円で売ってたので衝動買いした。
今、ご機嫌でフォーマットしている。

 おうちに帰る途中にDTMマガジンを買おうと思ってたのに、売ってなかったじゃん。
中四国最大の本屋が聞いてあきれるじゃん。

 するめイカが美味しい。
むしゃぶりつきたくなるようなナイスぼでぃー。

2009年1月7日水曜日

215号

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

作業時間: 2時間ぐらい
ツール: ピストンコラージュ ver0.9.1.0
音源: デフォルトののみ

 オーバードライブを使ってみたら、
声みたいな音が出来たので記念に。
単音では声みたいな音が出ずに、bass1とpad2を微妙なタイミングで慣らすとでる。
うまい具合に飽和してるんじゃないかと思う。完全に偶然の産物。

2009年1月4日日曜日

わっか(2)


http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/test090104.zip

 わっかを好きな角度に回転できるようにした。
普通なら世界をぐるりんと回してから設置するんだけど、
今回は頂点を自力で計算してる。4次元行列万歳!
そんなわけで、いくつわっかを描画しようとDrawPrimitiveUPは1回。
もっとやることがあるだろとは思ってる。

2009年1月2日金曜日

日記ちゃん

 PS版レイストームが300円で売ってたから買ってしまった。PS持ってないのに。
それからGBのソーラーストライカーも買った。GBで縦シューとか指がつるわ!
 さらに文学少女の新刊も出てた。
ノーチェックだったからうれしいが、読んでない本が10冊ほどたまってる。
早く読みたいのだけど、気がつけばPC触ってるんだもの。仕方ないね。
 阿久女イクCDも買おうと思っていたのだけど、人が多くて断念。
またの機会に探してみよう。

 お賽銭は55円。
後生ご縁とかけてるけど、運気が広範囲に広がって薄くなるような気がするんだ。
それから神社の道の真ん中を並ばされたわけだけど、神様的にはいいのかな?
神社じゃ端っこ歩くのが常識だと思うけど、神様によるのかもね。

 福袋の類はまったく買ってない。
1万円の福袋の中身が5万円分相当でも、ちゃんと使えるのが5000円分じゃあ意味ないよ!
(追記)
 PSソフト100本詰め合わせ袋を5000円で買ったよってスレがたってたのでちら見したら、
良作勢ぞろいだった。くそっくそっ!
俺が間違ってるとでも言うのか! 福袋ってお買い得だとでもいうのか! 畜生!!

2009年1月1日木曜日

212号

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

製作時間: 30分ほど
ツール: ピストンコラージュ ver0.9.1.0
他: SoundEngineFreeにてイコライザ>リバーヴ>ノーマライズ>ogg出力

 んたーんたーんたーんたー
がやりたかっただけ

わっか


 わっか。
わっか作るのにsincos間違えて半日以上かかった。

 まったく関係ないけど、ニコニコのマイリスって合計100までなんだね。
調子に乗って追加してたらいっぱいになっちゃった……。
19時から2時まではエコノミーたいむ!

211号

http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/music/no%20name211.ogg
製作時間: 2時間ぐらい
ツール:  ピストンコラージュ ver0.9.1.0
他: SoundEngineFreeにて、イコライザー>リバーブ>ノーマライズ

 意識はしてなかったけどオメガファイブのボス戦に似てる。