« November 2004 | メイン | January 2005 »

December 29, 2004

メイクが通るようにしてそれから・・・

属性に使っていた構造体や列挙型を作り、全属性クラスのメイクが通るようにした。
で、次何するんだったっけ?
間が空いてしまったので、忘れてしまった。
ログを読み返さないと。
こういう時は、ブログにいろいろと残していると便利だ。

投稿者 Takenori : 10:52 PM | コメント (0) | トラックバック

December 26, 2004

シークと終端フレーム

シークのフラグでAM_SEEKING_NoFlush フラッシュしない。と言うのがある。
つまり、このフラグを指定しないとフラッシュされると言うことのようだ。
これで、少し安心だな。

で、シークに使っているSetPositions メソッドは、現在位置と停止位置を設定出来る。
そして、停止位置に来たらEC_COMPLETE を送ってくれるようだ。
EC_COMPLETE は普通のループでも使用している。
普通のループで確認すると、終端フレームの表示時間が取り立てて短いと言うことはないようだ。厳密には少し長くなっていると思われる。
つまり、これを使えばセグメントループもうまくいきそうだ。

メソッドはSetSegmentFrame と SetDefaultStopFrame を追加すればいいかな。
うん、うまくいきそうだ。

投稿者 Takenori : 11:01 PM | コメント (0) | トラックバック

再生できないMPEGファイルの調査

再生できないと言われたMPEGファイルを確認。
確かに再生できない。
エラーは、"これらのピンに共通するメディアの種類はありません。" だそうだ。
で、デバッガに各ピンがサポートするメディアの種類を出力するようにして、確認してみる。
問題のファイルの出力ピンのサブタイプはMPEG1Systemと出た。MPEG I Splitter はMPEG1System か MPEG1VideoCD、MPEG1Video、MPEG1Audio をサポートしている。 ( メジャータイプ、フォーマットは同一のため割愛 )
メディアタイプからするとつながるはずだが・・・

TMPGEncで問題のファイルを見てみる。
アスペクト比がその他(0.89)とか表示される。
何それ?
メディアプレーヤーでファイルを再生し、プロパティを表示、ビデオコデックのあたりをクリックするとアスペクト比が表示される。
それで、アスペクト比を見てみると1.19:1・・・ 何でそんなに変なアスペクト比を設定しているの?
問題なく再生できるほうを見ると4:3になっている。
PCで再生させるのなら1:1の正方画素にするのが良いと思うが・・・
うーん。
こんな変なアスペクト比のファイルは再生できなくてもいいような・・・
1:1になるように補正して表示しようとする段階で問題が生じそうな入力は、はじくようになっているのかな?
でも、グラフ自動生成やメディアプレーヤーでは再生されている。
さて、どうする?
個人的には1.19:1とか言う変なアスペクト比のMPEGファイルは再生できなくても良いと思うが。
非サポートの方向でいこう。

投稿者 Takenori : 09:48 PM | コメント (0) | トラックバック

DX9へ移行

新しいマシンのセットアップも完了したので、吉里吉里関係もそっちで行うようにするため、ビルドを行ってみる。
BCCは、boostを入れ、他に必要なインクルードファイルとライブラリをコピーしたらすんなりいった。
krmovieのビルドにはDirectShowが必要だが、DX8は入れていないので、DX9を使うことにしたが、DirectShow関係のは標準では入っていない。
DirectXのダウンロードページからExtrasをダウンロードし展開。
DX9 SDKが入っているところにコピーし、BaseClassesのライブラリをビルド。
krmovieのプロジェクトのインクルードディレクトリとライブラリを変更。
ビルドしたら、"krmovie fatal error LNK1181: 入力ファイル 'C:\Program.obj' を開けません。"と出る。
???
C:\Program.objって何?
どこかのライブラリで参照しているのか?
いろいろと調べるがわからず、ネット検索。
インクルードパスやライブラリを指定するとき""でくくらないといけないと言うことだ。
ああ、なるほど。
だから、C:\Program Files\Microsoft DirectX 9.0 SDK (October 2004)\Samples\C++\DirectShow\BaseClasses\Debug\strmbasd.lib の最初のスペースまでのC:\Programがリンク対象と認識されたのか。
って、DX9の標準インクルードディレクトリをProgram FilesにするなよMS。
今まで通りC:\DXSDKに入れてくれればいいものを。
で、ビルドすると今度はいくつかの関数などがかぶっていると出る。
LIBCMTDを除外する。
やっとビルドが通った。
動作も問題なし。

投稿者 Takenori : 07:29 PM | コメント (0) | トラックバック

終端フレーム関係の問題

IRCでDee氏から詳細な事情を聞いたところ、終端フレームの次のフレームが表示されてしまうと言うのではなく、終端フレームの表示時間が一定でないと言う問題の様子。
それはそうかも、終端フレームを表示した後すぐにシークをかけるので、シーク後のフレームが表示されるのは、デコードが完了したすぐ後になる。
でも、これはちょっといろいろと込み入っていて、対応するには問題が・・・
とりあえず、似たようなことについてログを残していたと思い、プログを読み返す。

ああ、プレゼンテーション時間を操作すればうまくいくかも。
でも、そしたらセグメントループは、フィルタの方で対応する必要があるかもしれないなぁ。
それと、プレゼンテーション時間はフィルタグラフがいい感じに設定するので、それをうまく操作できるかどうか・・・
ま、明日にでもコードとヘルプをにらめっこだな。

掲示板に書いた、終端フレームの次のフレームが表示されてしまうかもってやつも気になるので、シークについて少し調べたほうが良さそうだな。
シークを実行した時点でデータがフラッシュされるのなら問題は発生しないはずだし。

投稿者 Takenori : 01:04 AM | コメント (0) | トラックバック

December 25, 2004

ナビゲーションメッシュの導入

単純に、床のメッシュに対して、D3DXIntersectを使って、キャラクターの移動位置のY 1.0から Y -1.0へレイを飛ばして当り判定をすれば、移動範囲を制限できるかと思いきや、g_pMeshFloorがWriteOnlyを指定して生成時されていたため、D3DXIntersect が失敗を返していた。
そこで、ナビゲーションメッシュ専用のメッシュを作り、pMeshFloorと同じものをセット。
これでうまくいくと思ったけど、レイが当たらないと返ってくる。
なぜ?
g_pMeshFloorにテクスチャ座標を設定しているところでブレイクを張り、ポリゴンの座標を見ると、X-Y平面上にポリゴンが生成されていた。
これでは当たるはずがない。
でも、描画時はX-Z平面上に描かれている。
コードを追うと、どうやら描画前にトランスフォームされている様子。
そこで、ナビゲーションメッシュを生成時にトランスフォームすることにした。
トランスフォームは単純に、ポリゴンの各頂点座標をD3DXVec3TransformCoordで、g_pMeshFloorが描画される前に使われるマトリックスで変換するだけ。
でも、g_pMeshFloorが描画される前に使われるマトリックスはD3DXMATRIXA16とか言うやつで、D3DXMATRIXじゃないからだめと言われた。
D3DXMATRIXA16は、効率を上げるために16バイトでアライメントされたD3DXMATRIXだそうだ。 ( SSEとか用ですな。でも、これってDirectX9から追加されたのか? 前からあった? )
で、単純にD3DXMATRIXA16をD3DXMATRIXに代入して、それを渡すようにしたらコンパイルが通った。
レイの当り判定もうまくいった。
が、なぜかまったく移動できない。
IsOutOfBoundsを見ると、論理が逆だった。
関数名からしたら、領域外かどうかを判定するもののようだけど、気分的には領域内にあって移動できるかどうかを判定したいので、気づかなかった。
で、逆にするとうまくいった。
これで、とりあえず平面上は歩けるようになった。

次は、ちょっとg_pMeshFloorが描画される前に使われるマトリックス周りを追いたいところ。ナビゲーションメッシュを外部のファイルから読むためにも。
他にも、CTinyを少し汎用化したい。
徐々に汎用化していかないと。

投稿者 Takenori : 05:08 AM | コメント (0) | トラックバック

December 24, 2004

初期状態の変更

DWORD g_dwFollow = 0xffffffff; を DWORD g_dwFollow = 0; に変更し、1人目のキャラクターの斜め上視点が初期状態になるように変更。
最初にキャラクターが生成されるところで、pTiny->SetUserControl();として、ユーザーコントロールモードが初期状態になるように変更。
これで、起動したらすぐにキャラクターを動かせる状態になる。

移動できる範囲が狭いので、床のメッシュを生成しているところ ( g_pMeshFloorにメッシュを設定しているところ ) を探し、生成されるメッシュを大きくした。
D3DXCreatePolygon の3番目の引数を16にしただけ。
で、実行。
なんか、円盤形になった。移動させてみると・・・ あり? 移動範囲は変わらない。
コードを追ってみると、CTiny.cppのIsOutOfBoundsメソッドで判定している様子。
で、判定式は、if( pV->x < 0.0 || pV->x > 1.0 || pV->z < 0.0 || pV->z > 1.0 ) ・・・ 床を大きくしても移動範囲は変わらないはずだ。
まずはナビゲーションメッシュで移動範囲を設定できるように変更だな。

投稿者 Takenori : 08:35 PM | コメント (0) | トラックバック

元となるサンプルの選択とフォルダの移動

新PCに開発環境も設定できたので、徐々に3Dゲームを開発していくことにした。
で、まずはキャラクターを動かすためのサンプルとしてよさげな物を探す。
MultiAnimationが良さそうだ。
MultiAnimationなら、キャラクターの背後にカメラを設置した状態にし、ユーザーコントロールにチェックを入れると、キーボードでキャラクターを動かすことが出来る。
また、複数のアニメーションをサポートしていて、歩くと走るが入っている。
以上の理由から、MultiAnimationを元に変更を加えていくことにした。

まずは、Sampleフォルダから移動できるように、Commonにあるファイルをプロジェクトのあるフォルダの下にcommonフォルダを作り、プロジェクトが参照しているファイルをコピーした。
そして、フォルダを移動、ビルド。
するとコンパイルとエラー、プロジェクトにはないDXUTMesh.h と DXUTEffectMap.h もヘッダーファイルのみ必要なようだ。
後、プロコンパイル済みヘッダー ファイルを使用するから、プロコンパイル済みヘッダーを作成するに変更した。自動生成や、使わないではなぜかうまくいかなかった。
アイコンのリソースも、前のディレクトリ構成に依存しているので、MultiAnimation.rcを直接編集して、参照するアイコンをプロジェクト下のcommonフォルダのアイコンファイルを参照するようにした。
以上の変更によって、Sampleフォルダ下から移動したところでもビルドが通るようになった。

投稿者 Takenori : 08:21 PM | コメント (0) | トラックバック

wxWidgetsのセットアップ

wxMSW-2.4.2.zipをDLして、samplesをビルドしようとするが、コンパイルエラーが出る。
wxBase.dsw、wxUniv.dsw、wxWindows.dsw をそれぞれビルドして、再度sampleをビルドしたら、うまくいった。
後、wxMSW-2.4.2-setup.zipは単なる自己解凍書庫のようだ。解凍し、実行してもソース類が指定したディレクトリに展開されるだけで、.libなどは見つからなかった。

wxWidgets でクロスプラットフォーム GUIアプリを作ろうで、LinuxとWindowsで開発する触り部分が解説されているが、WinのコンパイラはMinGWについて解説されているので、VCとは少し違う。
で、フォームエディタとして、wxGladeというものがあるようだ。
これは、Dev-C++ で wxWidgets の使い方のwxGlade のインストールに従い、Python、wxPython、wxGlade をインストール。

以上でwxWidgetsが使えるようになるはず。

投稿者 Takenori : 05:46 PM | コメント (0) | トラックバック

属性をひたすらExcelで

属性クラスをExcelから生成するために、Excelでひたすら属性を書いた。
perlでExcelからソースを吐くのを作って、属性クラスのコードを吐かせた。
いい感じ。

投稿者 Takenori : 03:12 AM | コメント (0) | トラックバック

December 22, 2004

wxWidgetsのライセンス

いろいろと調べたところ、wxWidgets(旧wxWindows)を利用したソフトウェアのバイナリ配布についてが詳しいようす。
でも、付属のドキュメントを読むのが一番正確ですな。

で、どうやら本体に修正を加えずにリンクした場合は、ほとんど縛りはないようです。

投稿者 Takenori : 10:39 PM | コメント (0) | トラックバック

GUIツールキット

C++Builderで作るのが楽だけど、エディタやデバッガが使いにくいので、C++Builderはどうも好きになれない。
小さなツールを作るにはかなり便利なんだけど・・・
で、VC++で作りたいと思い、何かいいGUIツールキットがないかと検討した。
で、MFC却下。
GTK+とかになるのかなぁと思っていたが、wxWidgetsが良さそう。
で、ライセンスなどを調べてみた。

投稿者 Takenori : 10:10 PM | コメント (0) | トラックバック

起点

CAMや自動プロのようなものを兄が欲しているのと、ペーパークラフトのほうでCADのようなものが欲しくなってきたので、作ろうかなぁと考え始めた。

投稿者 Takenori : 10:00 PM | コメント (0) | トラックバック

December 08, 2004

拡張性

ノーマルモードの時、吉里吉里2/KAG3の拡張性を活かせないのではないか? と思った。
そして、吉里吉里にする意味は? 独自のシステムでもかまわないんじゃ・・・ と考えた。
しかし、自由に記述できる項をもうければ、事足りることに気付いた。
時間を進めるものの概念さえ守って書いてもらえば、どのようなことを書いてもらっても問題ない。
いやー、一件落着。って、何も問題発生していたわけじゃなくて、一人悩んでいただけだけど。

でも、考えれば考えるほど、ノーマルとエキスパートのデータの行き来が難しい。
うーん、どうしよう。
Ver.1はエキスパート、Ver.2はノーマルにするか。
まず、Ver.1を完成させて問題点を出す。
Ver.1にアニメーションをエディットする機能を付ける。
問題点を改善すると共に、インターフェイスを改良したVer.2を作る。
Ver.2のインターフェイスのベースはアニメーションのエディット画面。
Ver.2は吉里吉里のみでなく、スプライトアニメーションをスクリプトとして吐き出せる機能、ムービー出力機能を付ける。って感じがいいだろうか?
後、C++Builderから離れて、VC++にし、ウィンドウ系はwxWindowsにしたい。
ま、当分先だけどね。
でも、Ver.1を作りながら、Ver.2の仕様とか考えるのって・・・
さらに、Ver.3とかも考えていたり。
気が早すぎですな。

投稿者 Takenori : 08:04 PM | コメント (0) | トラックバック

December 07, 2004

ムービーセーブ仕様

保存する内容は次の通り。
オーバーレイかレイヤー描画か。
ループの有無
再生しているファイル
再生状態
対象レイヤー

なお、オーバーレイの時は保存/復元はしない。
保存するかしないかの指定は可能。

といった感じで良いかな。

投稿者 Takenori : 10:28 PM | コメント (0) | トラックバック

ムービーの栞への保存は厳しい?

レイヤー描画はピリオドイベントかセグメントループでシーンが遷移することを想定していた。
詳しく説明すると、ピリオドイベントは映画の字幕のように、ムービーに字幕を同期させたり、特定フレームでフラグによってムービーを分岐させたりするのに使用し、セグメントループは、選択肢やクリック待ちなどで、ムービーの指定範囲をループさせるのに使用し、クリックがあった時に、ループを解除するか、選択肢のときはループの終点のイベントでループの解除とムービーの遷移を行うような使用方法を考えて作っている。
上記のような用途に使うのなら、セーブポイントはシーン遷移後に置くことになる。
そして、栞がロードされた時、ムービーはそのシーンの開始フレームから開始されることを望む。
擬似スクリプトで表現するなら次のような感じ。
[ピリオド待ちorセグメントループ待ち]
[ジャンプ]
[ラベル]
[ムービーのフレーム移動]
って、再生しているムービーファイルとそのレイヤー、ループ状態を保存しておけば大丈夫か。
上記のように書いておけばロードされた時、移動させたいフレームに移動することになるし。

投稿者 Takenori : 09:54 PM | コメント (0) | トラックバック

続RAIDへのOSインストール

検索すると同様の症状に悩んでいる人を発見。
このページ
上述のページではGIGABYTE GA-8ANXP-D Rev2.0だが、GIGABYTE GA-8I925X-G Rev2.0でも同じだと思われるので、同じように試す。
まず、Intelのドライバページから最新バージョンのドライバとフロッピー設定ユーティリティの両方をDL。
フロッピー設定ユーティリティを使ってFDを作る。
マニュアル通りに、インストール途中でF6を押す。
ドライバの入力を促された画面で、FDを入れEnter。
以下の4つが出てくる。
Intel(R) 82801FR SATA RAID Controller
Intel(R) 82801FR SATA AHCI Controller
Intel(R) 82801ER SATA RAID Controller
Intel(R) 6300ESB SATA RAID Controller
この内、一番上のIntel(R) 82801FR SATA RAID Controllerを選択。
後は、そのままインストールを続けると・・・ きた! 以前止まっていた場所を越えてインストールが進んだ。
GIGABYTEめぇー。
ま、なんにせよインストールが進んでよかった良かった。

投稿者 Takenori : 01:12 AM | コメント (0) | トラックバック

ムービーの状態をセーブ

別にやらなくてもいいかと思ったけど、やっぱりやった方が良さそうなので検討することに。
で、栞関係のことをDee氏に聞くと、
MainWindow.tjs内のinternalStoreFlags で、栞へ現在の状態を保存。
internalRestoreFlags はその逆を行っている。
とのこと。
場所はわかった。
でも、仕様を考えないといけない。
さて、どういうのがいいかなぁ。

投稿者 Takenori : 12:48 AM | コメント (0) | トラックバック

新PCのセットアップ

新PCも届き、組み立ても終わったので、コードをつないで電源ON。
なぜかCPUファンが回っていない。
なぜ?
一度電源を切り、ケーブルを確認。
問題なさそう。再度電源を入れたら、普通に回った。
なんだったんだろう?
まあ、いいや。
で、BIOSの設定&RAIDボリュームの作成を行う。
作成が終わったら、インストールするOSのCDをMSDNの中から探す。
WinXP Pro SP1a。これだな。
SP2もあるけど、不評なのでやめておく。
で、プロダクトキーの取得方法を見る。
MSDNのサブスクリプションのページから取得するようだ。
Win2kまでは普通にCDに書かれているのに、WinXPは取得しないといけない。
面倒な話だ。
で、ログインしようとしたら.NET Passportになっていた。
いつの間にか統合されたようだ。
.NET Passportは以前メッセンジャーを使うために登録していたので、それを入力。
が、エラーメッセージが出てきた。
エラーメッセージは英語。いったんログアウトして、.NET PassportからMSDNのIDを追加をクリックするような内容のことが書かれている。
そのままログアウトしたら英語のページに飛んだ。
日本なので、日本語のページじゃないといけない気がしたから、日本語のページに戻ってそれらしきページを探す。
探してもないのでヘルプを見てみるが、.NET PassportにMSDNのIDを統合する方法がイマイチよくわからない。
もう一度エラーメッセージの画面を見てみる。
英語のページで手続きをする。
Fast Nameと書かれていたので、ローマ字で名前を入力したらエラーになった。
登録しているのと違うと書いているようだ。
漢字で入れてみる。
うまくいった!
でも、なんか釈然としないものが・・・ Fast Nameとか書かれた英語ページなのに漢字で名前を入れる・・・ 違和感ありありだ。

登録が成功してログインも出来たので、プロダクトキーの取得を行う。
CDをPCに入れ起動。
インストールが進むが、ハードディスクがないと言われる。
あれ?
マニュアルを読むとRAIDのドライバFDを作って、それを途中で入れないといけないらしい。
その通りにしてFD作成、ドライバを読み込ませるが、またハードディスクがないと言われる。
英語マニュアルやマザーボードのCD内のドキュメントを読んで、何通りか試すが全部ダメ。
なんだ、いったい何がいけないんだ。
RAIDボリュームにOS入れられないのか?
でも、マニュアルにはその方法の説明がある。
なぞだ。
ちなみにマザーボードはGIGABYTE GA-9I925X-G。
誰か教えてくれー。

仕方ない、明日いろいろと検索して試してみるか。

投稿者 Takenori : 12:29 AM | コメント (0) | トラックバック

December 03, 2004

ロジクールのキーボード

少し前からキーボードのテンキーの0が時々凹んだままになって、000・・・って打たれてしまうようになった。
これはそろそろ替え時かなとロジクールのキーボード iK-27を購入。
今日届いたので、つなぎ替えた。
で、後ろの足を立てて、置くと・・・ 水平なんですけど。
確かにスーパーフラットキーボードって書いてあったけど・・・
これは・・・
でも、せっかく買ったので少し使ってみるとことにした。
そしたら意外や意外、打ちやすいかも。
いや、キータッチが好きなかたさと感触なのかな?
メカニカルでやたらカタカタ鳴るのがいいと思っていたけど、ややソフトなタッチ感のほうが良いのかも。
まあ、そんなにこだわりがあるわけではないが。

投稿者 Takenori : 10:28 PM | コメント (0) | トラックバック

属性クラスの量産

ひたすらエディタで同じようなことを書いていたが、これもExcelで書いてから、コードを吐かせた方が良さそうだ。
管理も楽になるし、同じようなことを何度も書かなくて済む。
ってか、コマンドに関連するものは全部Excelからやったほうが楽でいいかも。

投稿者 Takenori : 10:11 PM | コメント (0) | トラックバック

December 02, 2004

プレビューウィンドウ

プレビューウィンドウを作ろうと、フォームにTImageだけをのせたものを追加した。
そして、フォームのOnPaintでTImageのキャンパスのFillRectを呼び出すようにしたら、すごく重い。
こうやったらまずかったんだっけ?
"TImage に含まれているグラフィックのペイントと更新は自動的に処理されます。・・・TImage 上で描画すると,永続的なイメージが作成されます。したがって,その中のイメージを再描画するための操作は何も必要ありません。"
再描画は勝手にやってくれるんですね。
だから、FillRectを呼ぶと、OnPaintが呼ばれて、またFillRect・・・と無限ループ。CPU負荷100%状態なわけか。
じゃあ、イメージのアップデートは別メソッドにしておかないと。
で、続きを作ろうと思ったけど、コマンドの処理などをやらないといけないので、各タグの属性のクラスが必要になるため、まだ出来ないことに気付いた。
なんでプレビューウィンドウは後回し。

描画はコマンドのクラスに任せる?
でも、状態によって変わるものがあるのでそれはどうする?
コマンドは状態にだけ変化を与えるようにして、描画はその状態を元に行えばいいのか。って、コマンドごとにクラスを持っているわけじゃなかった。
コマンドごとにクラスを持たせてもいいけど、それはちょっと・・・ でも、その方が柔軟になるか。
さて、どうするか。

投稿者 Takenori : 10:44 PM | コメント (0) | トラックバック

theoraのサンプルコード

theoraのサンプルコードでいいのがない。
エンコードはffmpeg2theraがわかりやすそうだが、デコードはない。
DirectShowのならあるが、追うのが面倒臭い。
vorbisなら、SDKにサンプルが付いている。
α版の内は仕方ないのかな。
正式版がリリースされれば、サンプルコードも出てきて何とかなる?
面倒だから保留にしよう。
正式版が出た時に、気が向いたらやろうっと。

投稿者 Takenori : 07:58 PM | コメント (0) | トラックバック

theoraのビルド

ogg, vorbis, theoraのソースをDLし、順番にビルド。
って、theoraのプロジェクトファイル壊れてる!
VS 2003にコンバートするのが問題なのか?
でも、他のは出来たし。
どうしよう?
仕方がないので、新しくスタティックライブラリ用のプロジェクトを作り、libの中のソースを全部ぶち込んで、追加のインクルードパスにvorbisと同じものを追加。
ビルドしたらあっさり通る。
まあ、ライブラリだからね。

そうだ、デバッグ用のは末尾に_dを付けとかないと。

投稿者 Takenori : 02:57 PM | コメント (0) | トラックバック

theora使用感とか

Dee氏お勧めのプレーヤーVLC
確かに余計なもののインストールがなくていい感じです。

で、再生してみると・・・ シーンによって負荷が全然違う。
MPEG Iとかって、結構一定じゃなかったっけ?
最近のはだいたいこんな感じなのだろうか?
どういった圧縮アルゴリズムなんだろう?
少し気になる。

投稿者 Takenori : 02:31 PM | コメント (0) | トラックバック

ムービーのSave

すっかり忘れていた。
吉里吉里2/KAG3はレイヤー情報は自動的にセーブされ、ロードしたときは自動的に復元されるが、ムービーは何もしていないんで、白いレイヤーかゴミだったか忘れたけど、意図していないものが表示されるんだった。
まあ、セーブポイントをムービーの開始前に設定するようにすれば回避できるけど、忘れると変な画面になってしまう。
ムービーもセーブされるようにしたほうが良いかなぁ。
ムービーは途中のフレームから開始されるより、最初からの方がいいよなぁ。
ループ、セグメントループ、ピリオドイベントは復元しないとまずいよなぁ。
今夜また話してみよう。

投稿者 Takenori : 01:41 PM | コメント (0) | トラックバック

ノーマルモードとエキスパートモード

このツールにはノーマルモードとエキスパートモードを作ろうと考えている。
エキスパートモードは、今作っているインターフェイスで、細かく動作を設定できるというか、KAGスクリプトに近い形で細かい動作がわかる。
ノーマルモードはmacromedia Directorに近い形で、内部的なスクリプトの呼び出し順序などは自動的に決定され、UIで見た形に近い表示になるようになる。

一番初めは、単にExcelで書いた物をコンバートするような形を考えていたが、途中でそれをExcelから独立したツールにすることにした。
で、作っていたのだが、なんか見た目にわかりづらいと感じて、いろいろと考えた末、macromedia Directorのようなインターフェイスにすることにした。
で、上述のノーマルモードのみで行こうと考えていたわけだが、どのようにするかすごく悩んだ。
後、グループ分けなどいろいろと面倒なので、保留とした。
で、エキスパートモードが生まれた。
エキスパートモードはほとんどスクリプトそのままに近いけど、タグがカテゴライズされて、視覚的にもわかりやいので、これでいいと言うことにした。

と、ここまで書いたけど、そんなのはどうでも良くて、ノーマルモードを実現するために必要な要素を思い付いたから、メモしておこうと思ってこのログを書いた。
つまり、上の文章は要らない。
じゃ、書くなよって感じだが、まあ・・・ いいじゃん。
で、その要素だが、単にタグの中には時間を経過させるものとそうでないものがある。ってだけのこと。
Directorの場合、横軸はフレームで、何fpsにするかを指定して、アニメーションを作る。
でも、KAGの場合はそうではない。時間を進めるタグがなければ、時間は進まない。(ムービーやアニメーションなどは勝手に進むけど、言いたいのはそう言うことではない。)
つまり、横軸のコマが進むのは、時間を経過させるタグが出現した時だ。
言い換えれば、同一の時間軸に存在するのは、時間を経過させるタグに囲まれた間と言うことになる。
これは、いいひらめきだ! と思ったけど、そんなでもないか。
後、悩んでいるのは横軸をなんと呼ぶか。
どうでもいいと言えば、いいけど、名前によってわかりやすさが違ってくるし、場合によっては誤解を生じてしまう。
うーん・・・
フレームとかでいいかな?
意味的には大丈夫だと思うけど、一般的にどうとらえられるかは・・・ 大丈夫かな。
・・・ ヘルプなどで上述したような概念の説明を最初に持ってくれば、問題ないでしょう。
とりあえず、横軸はフレームと呼ぶことにしよう。

投稿者 Takenori : 03:27 AM | コメント (0) | トラックバック

状態を調べなければならない?

どのレイヤーに対する操作かわかりやすいように、セルに色を塗る機能を追加した。
現段階では細かい判定はしておらず、単純にそのコマンドがどのグループに属するかだけを見ている。
しかし、最終的にはどのレイヤーに対する操作かなども判定する予定だ。
そこで、問題に気付いた。
ビデオは再生したいレイヤーを事前に指定するが、それはつまり、過去のコマンドを検索しなければならいなことを意味する。
しまった。
再描画が発生するたびに、コマンドによっては各列で状態を判定しなければならない。
重いか?
そんなことはないか。
PCでメモリ上にある物に対して操作するのなら余裕だろう。
組込用の数十とか数百MHzで動いているCPUじゃないし。
ま、重かったら、重かった時に考えよう。
それに、状態の判定などは、プレビューウィンドウを付けようと思ったらどのみち必要になる。

で、次は・・・ 各コマンドの属性を保持するためのクラスを量産かぁ。
各コマンドのUIとこのクラス、そして、それぞれを結びつける作業。
数が多いだけにここはしんどいな。

投稿者 Takenori : 02:59 AM | コメント (0) | トラックバック

OggTheoraの追加

W.Dee氏も追加を予定しているそうな。
ならいいや、やらなくても。
たぶん、明日ぐらいに新マシン用のパーツが届いて組めるはずなので、3Dで遊んでようっと。

投稿者 Takenori : 01:54 AM | コメント (0) | トラックバック

December 01, 2004

なぜか消えてる・・・

内部ではコマンドをリストで管理している。
そして、リストをラップして、インデックスで要素を取得できるようにもしている。
で、コマンドを設定する際に、要素の数が指定したインデックスより少ない場合、push_backで空要素を追加する。

現在の要素の数より大きいインデックスよなる位置にコマンドを追加し、さらに大きいインデックスへコマンドを設定すると、なぜか前に設定したコマンドが消えていた。
おかしい。
デバッグしやすいように、リストの中身をダンプするようにするため、コマンド番号から、コマンド文字列へ変換するためのテーブルを作ろうと思ったが、面倒臭かったので、まずはOutputDebugStringで要素数などを吐かせてみることにした。
すると、要素の数が少ない。
どうやら、要素数が不足した際に追加ループの判定式が間違っていて、常に1個少なくなってしまっていたようだ。
でも、インデックスでリストから要素を取り出す時に、要素の数が少ない場合、例外を投げるようにしていたはず。
なぜ? と思ってよく見てみると、ここも間違っていた。
コードは次のような感じ。
int idx = 0;
typename std::list::iterator i = m_Items.begin();
for( ; i != m_Items.end() && idx < index; i++, idx++ );
if( idx != index )
{
throw L"Bad index.";
}
return i;
indexは、取得したい要素のインデックス番号。
idx != index の時例外としているのがまずい。
つまり、1個少ない時、i == list.end()の時は、正常だと判断してしまっていたわけだ。
これはまずいので、i == list.end()の時も例外を投げるようにした。
って、よく考えたら、idx != indexは必要ないんじゃないのか?

この部分を直したら、消えてしまう問題も解決した。ありがちだけど、アホなことをしていた。
にしても、C++Builderのデバッガは使いにくい。
何とかならないものかなぁ。

投稿者 Takenori : 11:55 PM | コメント (0) | トラックバック

TStringGrid のOnClick

TStringGridのOnClickでポップアップメニューを出すようにして、快適に使えるようになったかと思いきや、カーソルキーで移動した時にも、メニューが出てきてかなりうざい。
カーソルキーの移動でも、OnClickが呼ばれるとは・・・
これは使いづらいのでOnMouseUpでポップアップメニューを出すように変更した。

投稿者 Takenori : 11:29 PM | コメント (0) | トラックバック

イベントを割り当ててみる

イベントを割り当ててみて、動作を見た。
すごい、ちゃんとメンバ変数にもアクセスできる。
これは便利だ。
でも、移植性は下がるな。

投稿者 Takenori : 01:30 AM | コメント (0) | トラックバック

C++Builderのイベント

Builderでイベントを実行中に割り当てようとして、ふと疑問に思った。
サンプルでは何気なく、クラスのメンバ関数を代入しているが、C++でそんなことは出来ないんじゃなかったっけ?
つまり、次のような文だが、
Event1 = Class1->fun;
このようには出来なかった気がする。この場合は、
Event1 = Class1::fun;
としなければならず、Event1の定義を見ると関数ポインタのようなので、Class1::funはstaticなメンバ関数でなければならないはず。
でも、不思議なことにBuilderでは普通に出来ている。
変だなぁと思ってよく見ると、__closureというキーワードが間に入っている。
ヘルプを見ると、これはBuilder独自の拡張のようで、クロージャと呼ばれる物らしい。
で、いい感じにthisポインタを取得して、そのメンバ関数をコールしてくれるようだ。
なるほどね。
独自拡張だったのか。

投稿者 Takenori : 01:14 AM | コメント (0) | トラックバック

Total : Today : Yesterday :