2010年3月30日火曜日

日記ちゃん


 関節持ちの敵を実装中。
画像データが画像の中心を支点に回転するので、接続点とか回転角度とかのつじつまあわせが偉い大変。
汎用的なプログラムにできそうにないが、3Dの人なんかはみんな実装してるんだよね……。どうなってるの。
 
 それはそれとして株式会社晋遊舎「iP」にLu.が掲載されるようです。
驚きですね。
 
 javascriptなんてひっさしぶりに触ったわ。
parseIntがあるんだからparseDoubleもあるよね! と意気込んで記述したら動かなくてなんでだ! と調べたらそんなものはなかった。
かわりにparseFloatを使うらしいが、floatなんだ……。中身はdoubleだったりするのかな? 
型がない言語はややこしいわ。変数宣言がいらないとかもやもやするし。

calcAtan2

■calcAtan2
 角度を求めたいときにでも使ってください。
距離もついでに出します。
 
■使い方
 xとyを記入して「計算」ボタンを押すと、下に計算結果が表示されます。
角度0~360度で。
要javascript
 
■例
 x=1, y=1だと、角度は45度、距離は1.414...となります。
 


x

y



角度

距離




 <script>がうまく動かなかったあれこれ試行錯誤。
onclickに直接書くと動くという記述を見つけたので試してみたらうまく動いた。
参考までに。
 
*2010/03/31追記
 恐ろしいことにatan2にパラメタを指定するときにxとyを間違えてた!

2010年3月26日金曜日

日記ちゃん

 パックファイルから曲データをストリーミング再生できるようになった。いぇあ!
二日間どっぷりはまってたから、今最高にうれしい! かなりきてる!
とりあえずこれでフォルダにBGMファイルがそのまま置いてある状況を回避できる。
 
 いまだにprintfデバッグでバグとりしてるもんだから時間がかかってしょうがないな。
経験でどこが悪いかはなんとなく分かるけど、どのように悪いかが把握できないことにはバグの取りようがない。
 今回はseek関数のエラー処理がおかしかったので、ov_open_callbacks()でOV_EREADになってはじかれてた。
他の人なんかではreadの挙動が違ってうまく動かないとかいろいろあるようで。

2010年3月23日火曜日

日記ちゃん

 薄力粉大さじ1が何gだったか思い出せなくてむきむき来る。

「いめーじぺたぺた」 ver1.04


「いめーじぺたぺた」 ver1.04
http://cid-8cd7cf5ea9fbca55.skydrive.live.com/self.aspx/Public/program/imgPt104.zip

size: 1.01MB

 バグフィクスとどうでもいい機能の追加。
使う人が主に自分しかいないから、バグ修正が1カ月おき。

■更新履歴
2010-03-23 ver1.04
 ファイルリストから貼り付けたときの「サイズを自動拡張する」の拡張サイズが間違っているのを修正
  そのときメインウィンドウのスクロールバーが変化しないのを修正
 ファイルリストの選択を動かしたときに、ウィンドウタイトルが変更されないのを修正
 ファイルリストで「開く」を押したときに、メインウィンドウのタイトルにファイル名が表示されていないのを修正
 「現在の選択範囲でグリッド設定」機能を追加
 選択範囲を画面外まで広げたときに選択範囲線がちゃんと再描画されないのを修正

2010年3月13日土曜日

クライアント領域を指定サイズに


  SetWindowPosでウィンドウのサイズを変更できるが、
クライアント領域を指定サイズにしたい場合は、フレーム部分を計算しなければならない。
各フレーム部分のサイズはGetSystemMetricsで取得できるので、

LONG winWidth = clientWidth +
  GetSystemMetrics(SM_CXEDGE) +
  GetSystemMetrics(SM_CXBORDER) +
  GetSystemMetrics(SM_CXDLGFRAME);
LONG winHeight = clientHeight +
  GetSystemMetrics(SM_CYEDGE) +
  GetSystemMetrics(SM_CYBORDER) +
  GetSystemMetrics(SM_CYDLGFRAME) +
  GetSystemMetrics(SM_CYCAPTION);

 と、以前は計算していた。どこだかで見かけてそのまま使わせていただいた。

今回新たにメニューバーをつけたのでメニューバーのサイズを計算に入れて

LONG winWidth = clientWidth +
  GetSystemMetrics(SM_CXEDGE) +
  GetSystemMetrics(SM_CXBORDER) +
  GetSystemMetrics(SM_CXDLGFRAME);
LONG winHeight = clientHeight +
  GetSystemMetrics(SM_CYEDGE) +
  GetSystemMetrics(SM_CYBORDER) +
  GetSystemMetrics(SM_CYDLGFRAME) +
  GetSystemMetrics(SM_CYCAPTION) +
  GetSystemMetrics(SM_CYMENU);  //< 加えた

 と、やったらいけるよね! と楽観視していたら、
最初の画像のようにウィンドウが小さいとメニューバーが2行になってしまってさあ大変。
 
 ちょろっと調べたところ、メニューが2行かどうか調べるよりいい方法があるようなので
そちらを採用して実行したところうまく動いた。

 処理は簡単で、
・とりあえず指定するクライアントのサイズでウィンドウサイズを変更、
・その状態でクライアント領域のサイズを取得して、
  ウィンドウサイズ-クライアントサイズでフレームのサイズを計算。
・クライアントサイズ+フレームサイズで ウィンドウサイズを設定
の流れ。


// 計算するためにとりあえず一回設定
SetWindowPos( hWnd, HWND_TOP, 0, 0, clientWidth, clientHeight, SWP_NOMOVE );
 
// 設定サイズと実際のサイズの誤差から正しいサイズを計算
RECT rect;
GetClientRect( hWnd, &rect );
const int frameWidth = clientWidth - rect.right;
const int frameHeight = clientHeight - rect.bottom;
const int winWidth = clientWidth + frameWidth;
const int winHeight = clientHeight + frameHeight;
 
// 設定
SetWindowPos( hWnd, HWND_TOP,
  0, 0, winWidth, winHeight, SWP_SHOWWINDOW | SWP_NOMOVE );


 いったん指定サイズに変更することでメニューが1行か2行かを決定するのがミソか。
最初はGetWindowRectとGetClientRectでフレームサイズを計算してたが、もちろんうまく行かない。
もっと正確に計算するのであれば、横幅だけはGetSystemMetricsでちまちまと計算するほうがいいかもしれない。
メニューが2行になっても長くなるのは縦方向だけなので、横幅に関しては差を取得するまでもないのと、
フレーム分を足して設定したときに、横幅が増えてメニューが1行になる可能性がある。

2010年3月7日日曜日

日記ちゃん

 週に2,3回ホットケーキを作るんだけど、これがぜんぜんうまく焼けない。
エロゲじゃないけど、碁石みたいな硬い食べ物って実在するんだ……って呆然とすることがよくある。
包丁がはじかれるんだぜ? すげえ!
 フライパンで焼くときに中まで火を通そうとせずに、焼き色をつけるだけにとどめて中はレンジでチンするよう心がけたら碁石と遭遇することはなくなった。
なんか山崎パンのちゃちいホットケーキみたいな感触になるのが気に食わないが、碁石よりはましだ!
 
 ノートPCのファンがうんともすんともいわなくなったので、扇風機で外から強引に冷やすことにした。
この自機の扇風機を使うとは思っても見なかったが、とにかく手が冷える冷える。
60℃から35℃まで一気に冷えていくのはなかなか爽快。
 分解してもファンがマザーにがっちりくっついててどうしようもない。

2010年3月4日木曜日

日記ちゃん



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

size: 144.2KB
 
 背景オブジェクトとカメラをイベント化してメモリ中からコントロールするようにした。
ファイルで外からメモリに突っ込んで格納すればとりあえずの背景コントロールが可能かな。
今は適当にパラメータ生成してるけれど。
 
 3Dでの背景コントロールが一つの課題だったんだけど、
考えてた手段が二つあって一つは、オブジェクトの座標を固定してカメラを動かすっていうの。
もう一つがカメラは固定してオブジェクトのほうを動かすっていうので、
今回は後者のカメラ固定の方法にした。
 前者の方法のほうがたぶん簡単だし一般的かと思うが、今作では世界にがっちりと固定されたオブジェクト(要塞とか)が出てこない予定なのでこうした。
雲とか星とかでごまかすつもり満々。
 前者の方法は、カメラやオブジェクト位置のパラメータが偉い大きな値になりそうで嫌だなあと最初は思ってたんだけど、冷静に考えれば別にそんなでも無いなと。次回は前者の方法にする。内部処理にたいした差は無いし。
 
 背景オブジェクトは位置XYZと画像の参照位置XY,参照サイズ,生成タイミングと寿命のパラメータを持っていて、生成タイミングになったら画面に出現。
画面に出ている間は寿命を削って0になったら消えるという仕様。
画面に出すタイミングと位置、寿命のパラメータちょっとミスすると画面にぱっと出てきたりぱっと消えたりして不恰好になるので根気良く調整しなければならない。
余裕を持たせるとCPUを食うのでぎりぎりにする必要があってこの辺がウザくてたまらない。