ページ 11

2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 01:27
by やっくん
http://www.play21.jp/board/formz.cgi?ac ... &rln=51946

こちらの続きのようなものです。
スレッドの趣旨が違うので新たに建てさせていただきました。

現在、
・VC++288ExpressEdition
・DXライブラリ
の環境の下にRPGの戦闘部分に使うエフェクト処理の値を簡単に求めるツールを作ろうと思っております。
ツールを作ることが初めてですのでいくらかアドバイスを頂いていきたいと思いスレを立てました。

さっそくですが、以下のプログラムが予定している動作通りに動きません。
期待動作としては「マウスの左ボタンを押下状態にしたとき、その座標に点を描画する。マウスを押下状態のまま移動させると見た目上、連続な線を描ける」というもです。
点の表示はうまくいくのですが、滑らかな線が引けません。(とてもゆっくりマウスを動かすと見た目上、連続的に引ける)
点と点の間隔を操作する方法は無いでしょうか?
以下にマウスの座標を取得して点を描画している関数部分を載せます。
関数はDXライブラリの物を使っております。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html
描画は裏画面に一度描画して、点を描画する度に画面に表示しております。
void draw()
{
    int x, y; // マウスの座標を保存する
    int MouseInput ; // マウスの入力

    // マウスを表示状態にする
    SetMouseDispFlag( TRUE ) ;

    // マウスの入力を待つ
    MouseInput = GetMouseInput() ;
    while( !ProcessMessage() && (MouseInput & MOUSE_INPUT_RIGHT) == 0 && !Key[KEY_INPUT_RETURN])
    {
        // メッセージ処理
        if( ProcessMessage() == -1 )
        {
            break ;    // エラーが起きたらループから抜ける
        }

        // マウスの入力を得る
        if(GetMouseInput() == MOUSE_INPUT_LEFT){
            GetMousePoint(&x, &y);
            DrawPixel(x, y, GetColor(255, 255, 255));
            ScreenFlip();
        }


    }


}
ちなみに、とりあえずの形として以下のように製作していきたいと思っています。
・任意の2点の座標を入力し、○など見やすい形を描画する(戦闘での自分と敵をイメージした目印)。
・この目印を参考にして、マウスで画像(エフェクト)の座標移動の経路を見える形で描く。
・ファイルに出力。
この段階ではツールとしてのいろいろな機能はまだ考えないこととします。(画像ファイルを開く等)

これを基盤にエフェクトエディタを作って行こうと思っていますが何か良い意見がありましたら教えていただけ無いでしょうか。 画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 01:33
by Justy
 滑らかな線を引くなら DrawLineを使えばいいんじゃないでしょうか。
 最も、ClearDrawScreenで毎フレーム画面をクリアする必要がありますけど。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 02:29
by やっくん
※画像は1つ目の実行結果です。
Justyさん、いつも返信ありがとうございます。
DlawLineを用い、滑らかな線を引くことができました。
void draw()
{
    int x, y; // 現在のマウス押下位置
    int pre_x, pre_y; // 1つ前の状態
    int MouseInput ;
    bool mouse_press_flag; // マウスが押されているかどうか

    // マウスを表示状態にする
    SetMouseDispFlag( TRUE ) ;

    // マウスの入力を待つ
    MouseInput = GetMouseInput() ;
    while( !ProcessMessage() && (MouseInput & MOUSE_INPUT_RIGHT) == 0 && !Key[KEY_INPUT_RETURN])
    {
        // マウスが押されて無いならば。
        if(GetMouseInput() == 0) mouse_press_flag = false;

        // マウスの入力を得る
        if(GetMouseInput() == MOUSE_INPUT_LEFT){
            GetMousePoint(&x, &y);
            if(mouse_press_flag == false){
                pre_x = x;
                pre_y = y;
                b++; // 押下フラグを"true"に
            }
            //DrawPixel(x, y, GetColor(255, 255, 255)); // 点描画
            DrawLine(pre_x, pre_y, x, y, GetColor(255, 255, 255)); // 線描画
            ScreenFlip();

            pre_x = x; pre_y = y;
        }
    }
}
あとは座標をファイルに出力する際に点と点の間の座標を補うような形を作ってみます。

といっても、添付した画像(1個目の実行結果)の座標間隔を元に画像が滑らかに動けば無駄にデータを増やす必要は無いでしょうけど(^^;

とりあえず、座標を補間せずに不連続な状態で画像を動かしてみます。 画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 15:25
by やっくん
下の動画ような感じで画像を動かすことができました。(ニコニコ動画)
[nico]http://www.nicovideo.jp/watch/sm10695598[/nico]

次に簡単なファイル操作機能を付けようと思います。
目標としては
・新規ファイルを作って描画→ファイル出力をできる。
・作ったファイルを読み込んでそのファイルに記された通りに画像が動く。

ですが、添付画像のようなメニュー部分を作りたいのですがそうしてしまうと、描画範囲が減ってしまいます。
描画部分は640×480ピクセルにしたいのですが、メニューを作ることにより小さくなってしまいます。

これの対応策として
・スクロールをさせて640×480ピクセルに見せかける。
・メニューだけ別のウインドウで立ち上げる。
を考えております。

ですが1つ目は実装できたとしても使いづらそうなのであまり作りたくはありません。
2つ目をできれば作りたいのですが、マルチウインドウを作るにはどうすればよろしいですか?

また、この方法以外に良い方法はありませんか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 15:42
by softya
メニュー・ウィンドウをWin32APIで作るのなら出来そうです。
Win32APIが始めてだと大変ですけどね。

DXライブラリのウィンドウ自体を広げるのは無しですか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 16:03
by やっくん
softyaさん、返信ありがとうございます。

ウィンドウを広げては見ましたが、あくまでも640×480ピクセルでしたのでメニュー部分を作ると描画部分が640×480ピクセル以下になってしまいます。
DXライブラリの以下の関数を使用しました。
仕様にも比率設定としかないので、ピクセル自体は大きくできないのでしょうけど。
http://homepage2.nifty.com/natupaji/DxL ... html#R11N4
ピクセルを640×480以上にする方法はあるのでしょうか?

Win32APIについては触ったことがありません。
JavaのSwingアプリケーションのように簡単に作れるわけではないですよね?
Win32APIは近い内に学ぼうとしていたものなので良い参考書資料がありましたら教えていただけないでしょうか。

ですが、今はWin32APIに手を出すとこちらの方を一時中断しなければいけないので、出来る限り使わないようにメニューを実装する方法を考えていきたいです。 画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 16:36
by softya
SetGraphMode()で変更出来ます。
http://homepage2.nifty.com/natupaji/DxL ... .html#R4N1

Win32APIは、手をだすのは危険でしょうね。

「猫でもわかるプログラミング」WindowsSDK編。
http://www.kumei.ne.jp/c_lang/
「Win32API(C言語)編」
http://www.geocities.jp/ky_webid/win32c/index.html
「Win32 API入門」
http://wisdom.sakura.ne.jp/system/winapi/index.html
「超初心者のプログラム入門(C言語 Windows)」
http://www13.plala.or.jp/kmaeda/winc/winc.htm

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 16:57
by やっくん
URLありがとうございます。

お手軽に変更できたのですね(^^;

Win32Apiは作品を作り終えた後に学ぶことにします。
ところでWin32APIはCやC++の形式とほぼ同じなのでしょうか。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 17:05
by softya
>ところでWin32APIはCや C++の形式とほぼ同じなのでしょうか。

Win32APIは単なるAPI、つまりC言語インターフェイスの関数です。
C言語からでもC++からでも呼び出すことが出来ますよ。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 17:15
by やっくん
なるほど。
C、C++専用なのですね。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 17:34
by たいちう
> C、C++専用なのですね。

違います。VBやC#等からでも使います。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 17:37
by softya
>C、C++専用なのですね。

いえ、呼び出し規約さえ守れば他の言語でも呼び出せますよ。
C#でもVisualBasicでもExcelVBAでもHSPでもActiveBasic他色々からでも呼び出せます。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 17:53
by やっくん
C、C++、JAVAしか言語を知らないので他のプログラム言語はわかりませんが、呼び出し規約というのはVisualBasicならそれ用の形式があるということでしょうか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 18:11
by softya
Win32APIの呼び出し規約はMS stdcallです。
http://ja.wikipedia.org/wiki/%E5%91%BC% ... 84#stdcall
まぁ、あとは自分で調べてみてください。
今回の件に関係無いですし。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 22:18
by やっくん
現在、
①:ファイル名入力(endと入力で処理終了)
②:描画開始
③:描画した座標を実際に動かして確認
④:①に戻る

と、流れを作りました。

動画に取りました。(ニコニコ動画)
[nico]http://www.nicovideo.jp/watch/sm10699783?edit=owner[/nico]

次に画像ファイルなどを「開く」という機能を付けたいのですが、DXライブラリの関数で作れますでしょうか?
自分でファイルパスの入力ができるようにすれば開けますがそれでは効率が悪いので是非実装したい機能です。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 22:31
by Justy
>次に画像ファイルなどを「開く」という機能を付けたいのですが
 GetOpenFileName関数を使ってみては?

MSDN - GetOpenFileName 関数
http://msdn.microsoft.com/ja-jp/library/cc364716.aspx

ファイルを開くダイアログ - GetOpenFileName
http://richa850.hp.infoseek.co.jp/progr ... win05.html



# ところでエフェクトツールとのことですが、具体的にどんなエフェクトをこれで作ろうとしているのですか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 22:42
by やっくん
Justyさん、サンプルソースまで示していただきありがとうございます。
これならば取り入れることができそうです。

私が作っているRPGの戦闘はスーファミのファイナルファンタジーのような物です。
ですので、具体的に言うと二点間(自分と敵)の間を火の玉を飛ばしたり、燃やしたりというような処理を作っていきたいです。

ツールに盛り込む機能として今のところ考えているのは、

・マーク機能(座標を指定して目印を作る)
これは自分と敵キャラの位置を示し、エフェクトを作りやすいようにするためです。

・エフェクト画像の割り当て
一定のタイミングでエフェクト画像が切り替わるように、ファイルに出力する際にはその座標に使う画像パスなども書き込む予定です。

最初はこれくらいのものを作ろうと考えております。
この先はできてから考えようかと。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 22:45
by softya
>次に画像ファイルなどを「開く」という機能を付けたいのですが、DXライブラリの関数で作れますでしょうか?

そこはWin32APIのコモンダイアログを使えば比較的簡単に作れます。
これだけなら、Win32APIのややこしいところを知らなくて作れますよ。
http://www14.big.or.jp/~ken1/tech/tech14.html

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 23:33
by Justy
>私が作っている
>~
>というような処理を作っていきたいです。

 なるほど。ありがとうございます。
 先はまだ長そうですが、完成したら便利なツールになりそうですね。


 1点だけちょっと気になったのですが、自分と敵の間でエフェクトを飛ばす軌跡をこのツールで作る場合
味方が4人敵が5体とかいた場合下手すると 4×5通り作らなければならなくなるような気がするのですが、
その辺りは何か考えがあるのでしょうか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 23:43
by やっくん
softyaさんありがとうございます。

形を作ることはできました。
あとは自分の使いやすいように書き換えていきます。

サンプルソース中に

ofn.lpstrFileTitle =name; //選択されたファイル名を受け取る

と、あるんですがこれは代入文では無いのでしょうか?
知識不足で何がどのようになっているかわかりません。
動作としてはちゃんとファイル名を受け取っているようですが・・・。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月12日(水) 23:55
by やっくん
>Justyさん
今、作っているRPGが戦闘は1:1限定としていますのでそこまで考えていませんでした(^^;
製作中の物が完成すれば多人数戦闘を実装していこうかと考えていたので、確かにそこは考えなければいけないですね。

やはり理想的なのは対象座標が変化してもエフェクト処理が問題なく対応できる、といったところでしょうか。
少し考えてみましたが良い案は思いつきませんでした(^^;
とりあえず現在は1:1の戦闘を想定したエフェクトツールを作ってみます。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月13日(木) 00:06
by softya
FC/SFC時代のFFの様に考えれば難しくないですよ。
魔法エフェクトは、主人公側と敵側で独立してました。
主人公側から敵側に当たる技って弓矢ぐらい?
後は打撃時は、直接敵の前に移動してましたので。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月13日(木) 00:31
by Justy
>やっくんさん
>作っているRPGが戦闘は1:1限定
 そうでしたか。
 1:1でも、この方式で自分・敵の位置を固定してエフェクトを作ると後で自分か敵の位置を
変えたくなったときにエフェクトが作り直しになる可能性もありますので、
その辺りは気をつけておいた方がいいかもしれません。


>softyaさん
>FC/SFC時代のFF
 あー。
 たしかに iPhone版の FF2を見てみたら、敵にモノが飛んでいってないですね。
 通常の攻撃は剣だろうが弓だろうが自分のところから一歩前に出て攻撃すると、
次の瞬間敵に命中してる……。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月13日(木) 01:15
by やっくん
>softyaさん
その手がありますね。
FF5あたりではブリザラあたりが敵に飛んでいってたような気がしますが、いつかそのような処理もできるようになりたいものです。

>Justyさん
>自分か敵の位置を 変えたくなったときにエフェクトが作り直しになる可能性もありますので、
確かにこの仕様だと、そのようなことが起こりえますね(^^;
自分と敵との距離が固定されていれば、自分の座標or敵の座標からの増分でエフェクトを考えるというのも有かもしれません。これならば自分と敵間の距離を変えずに位置変更を行った場合ならば対応できます。
ですが、とりあえずまずは自分と敵の位置は固定しているという前提で作ってみます。


少し汚いですが、この先の構成が大体まとまりました。(添付画像参)
左上が描画領域、右側がメニュー部分、下部に使用する画像一覧です。
メニューには
・保存ファイル名入力
・使用する画像追加
・マーク機能(詳細は上に記した通りです)
・描画終了ボタン
・動作確認

画像についてですが、
・マウスで描画する際に使用する画像を選択(選択してない場合は描けないようにする)
・複数選択した場合は交互に使われる。(後々、出現割合も決める)
・画像の透過設定はメニューから画像を追加する時か、描画画像に選択する時かのどちらか。

とりあえず、ファイルを開くことができるようになったので明日から徐々にこれを組み立てて行こうと思います。
画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月13日(木) 02:56
by Justy
>自分か敵の位置を 変えたくなったとき
 実際のところいろいろ手はありますので、必要になった時点で解決できなければ
また質問してみてください。


>とりあえずまずは自分と敵の位置は固定しているという前提で作ってみます
 了解です。
 頑張ってください。応援しています。



>あるんですがこれは代入文では無いのでしょうか?
 char型のポインタの代入文です。
 元を辿ると判りますが、呼び出しもとの WinMain関数のローカル変数の配列 filenameを差していますので、
GetOpenFileName関数は選択されたファイル名をその filename配列に書き込みます。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月13日(木) 14:12
by やっくん
>char型のポインタの代入文です。
理解できました(^^;
このようなポインタの使い方を今までしたことがなかったため少し戸惑いました。
よくよく考えるとchar型nameのアドレスを渡していて、渡した先の変数には当然nameのアドレスが入ってるので書き換えればnameを書き換えたことになりますね。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月16日(日) 12:59
by やっくん
現在、ボタンを作り、そこから操作を行えるようにまでしました。
↓参考動画(ニコニコ)
[nico]http://www.nicovideo.jp/watch/sm10732275[/nico]

今、現在はマーク機能を付けているのですがここである問題が発生しました。
(マーク機能はエフェクトの描画をしやすいように行うための目印をつけることです)

動画とは少し形を変えて、マークを付けるのは描画している任意のタイミングでします。
目印が欲しくなったときに付けるという感じです。
問題になるのは、描画中に付けたマークを削除したいときです。
マーク削除しようとすると私は画面を全部クリアする方法しかしらないため、描画中の線まで消えます。
描画している座標は描画されるごとにファイルに座標として保存しているとはいえ、今までの軌跡が消えるのは少し使いづらくなります。

一部だけ画像を消す、またはレイヤー機能などを追加したいのですがどのように行えば良いでしょうか?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月16日(日) 15:06
by Justy
 画面ごとさっくり消してしまって再度描画した方が楽ですし、処理も話も早いです。
 軌跡が必要なら座標を全てメモリに覚えておけばいいのです。
 
 あと描画と同時にファイルに保存しているとのことですが、何かのアクション……保存ボタンを
押したときとかに保存する、という方がよくないですか?


>一部だけ画像を消す
 理論的には不可能というわけではないんですが……。
 例えば消したいところを DrawPixel / DrawBox等で背景色で描けばそこは「消えた」ことに
なりますよね。
 ただ、どこを消せばいいのかを割り出すのは結構面倒な気がします。


>レイヤー機能
 今回の目的を実現するためのレイヤー機能をDXライブラリで実現するならば、
オフスクリーンレンダリングとかレンダーテクスチャと呼ばれている機能を使えば一応は可能です。

 これなら軌跡の座標情報を一切記憶することなく、軌跡を描いたレイヤーはテクスチャとして
ずっと保持しておくことになりますので、望みのことはできると思います。

 が、レイヤーの仕組み自体の導入はともかく、その目的が画面をクリアすることなく、
軌跡の絵を保護したいことだとするとあまりお勧めはできません。

 この方針を突き詰めていくと、何でもかんでもレイヤーに分けないと後から部分的に
消せなくなることを意味しています。

 そう考えていくと、オブジェクト管理の面とかメモリや処理速度などどこかで破綻するでしょう。
 やはり画面は全部消して、毎回描きなおすのが現実的だと思います。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月16日(日) 16:44
by やっくん
Justyさんありがとうございます。

>軌跡が必要なら座標を全てメモリに覚えておけばいいのです。
今後、ファイルには座標1点1点ごとに何の画像を使うか、透過はどうするか、などの情報も付加していきます。
15秒間マウスを押しっぱなしにして、描画したところファイルには約1000個の座標が書かれていました。
多めに要素数2000個~3000個くらいの配列を取って、画像の名前を保存する配列も考えて計算しましたが十分メモリ量は足りそうです。
初めは「メモリ使いすぎるかもしれない」と思い座標は描画と同時に保存していました。


>あと描画と同時にファイルに保存しているとのことですが、何かのアクション……保存ボタンを
>押したときとかに保存する、という方がよくないですか?
これは描画する際の修正が効くようにできるからでしょうか。
確かに描画した座標をメモリに覚えさせていればこちらの方が良さそうです。


>オブジェクト管理の面とかメモリや処理速度などどこかで破綻するでしょう。
>やはり画面は全部消して、毎回描きなおすのが現実的だと思います。
今回の問題に限らず、画像を追加したり削除する場合もこの方法を取ることにしてみます。

追記:
メモリへ一時データ保存しておいて、ファイルに任意のタイミングで保存するというだけで、2つアイディアが浮かびました。
・描画中に現在のところまでをエフェクトを使って確認。(描画時は画像は用いず選択するだけで実際は線を描いて行うため)
・描画の書き加え(ファイルを開いて、そこに更に書き加えていく)

メニューの方も動画にUPしてる方とは変わるかと思います。
上の内容まで完成したらまた動画を載せるので、良ければ意見をお願いします。

追記2:
任意のタイミングでファイルを保存できるようにすれば、Win32APIの保存機能を使えますね。
そうすればわざわざファイル名を最初に書かなければ行けない手間も省けます。
おかげさまで良い感じになってきました!! 画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月17日(月) 23:10
by やっくん
>軌跡が必要なら座標を全てメモリに覚えておけばいいのです。
アドバイスのおかげで操作性が前回より大幅にUPしたように思えます。

参考動画
[nico]http://www.nicovideo.jp/watch/sm10755606[/nico]

・マーク(目印)セット、削除ができる。
・ファイルの保存を任意のタイミングでできるようになった。
・ファイルへ保存した地点に描画を戻せるようになった。(書き直しができる)
・描画しながら現在の状態を確認ができるようになった。
(ただし、マークの位置は記憶させてないためマーク復元はしてない。)

このような感じで良いでしょうか?
前よりはすっきりした感じがします!!
これに対して何かアドバイスがありましたらよろしくお願いしますm(__)m

次は画像追加機能と描画への画像割り当て機能を追加してみます。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月18日(火) 02:41
by Justy
 動画拝見しました。
 なかなか頑張ってますね。
 大夫良くなったと思います。

 あとは……そうですね。

 今はリアルタイムで記録していると思います。
 この方式は簡単ではありますが、部分的に微妙にぶれてしまったり、いい線が書けたけど
緩急の付け方に失敗してしまうなど思うような線がすぐに書けない可能性があるのではないでしょうか。

 そこでそういう部分を書いているときか書き終わった後にでも何かしら修正する機能を考えてみると
いうのはどうでしょう。

 実際どういうふうにすればいいのか、というのはなかなか難しいところではありますが……。

 んー、すぐに書き直しができるようになりましたし、要らないですかね。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月18日(火) 08:06
by やっくん
返信ありがとうございます。

>そこでそういう部分を書いているときか書き終わった後にでも何かしら修正する機能を考えてみると
いうのはどうでしょう。

やはり、これですよね・・・(^^;
動画編集をするような感じで行えたらな、と思ったことがあります。


>すぐに書き直しができるようになりましたし、要らないですかね。

この取らえ方で最初は行こうと思いました。
ですが、画像追加機能を作る前にファイル操作を行う部分は一通り作り終えてた方が楽なので今日1日何かアイディアが無いか考えて見ます。

少し考えてみたところ、最低限必要な物として
・タイミングチャートのようなものの追加(動画編集を行う感じにする)
・上記を作るためのスクロール機能
・描画したものを保存する際に切り捨ててるデータを別ファイルへの保存
(これは描画終了済みファイルを途中から描画再開するときにも必要となる)
の2点ですね。実際に作ると他にもあるかもしれませんが。

スクロール機能についてですが、これは以前にJustyさんに教えていただいた2Dマップを作る際のカメラの概念のようなものを取り入れればよろしいんでしょうか?
それか、スクロール機能をWin32APIで都合よくできたりはしないですよね?

Re:2Dエフェクトエディタの作成

Posted: 2010年5月19日(水) 01:21
by Justy
>スクロール機能
 考え方としてはそうですね。
 でもこの場合、ゲームほどいろいろ管理する情報はなく、単純にスクロール面の左上と対応する内部座標が
どこにあるか(というか座標の差分がどれだけあるか)で管理していれば基本はOKです。


>スクロール機能をWin32APIで都合よくできたりはしないですよね?
 バーそのものは、一応ありますけど、
 
スクロールバー
http://wisdom.sakura.ne.jp/system/winap ... win50.html

この場合DXライブラリのとは別のウインドウにした方がいいですね。



 あと、すっかり抜けていましたが
>No:52208
>これは描画する際の修正が効くようにできるからでしょうか。
 それもありますし、毎フレームファイルに書き出すのはさすがにちょっとどうなのかな、と。
 保存先がフロッピーディスクなどアクセスが遅いメディアだったりすると問題になるかもしれませんし。
画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月19日(水) 07:09
by やっくん
Justyさん、返信ありがとうございます。

せっかく回答していただいたのに申し訳ないのですが、今回の編集機能は断念することにしました。
タイムラインを用いた編集を作ろうとすると、スクロールは関係なく子ウィンドウの作成が必要となります。過去ログを参考にしたところ、子ウィンドウは簡単に作れるわけでは無いのですね。DXライブラリでは2窓の製作が不可能みたいなので、今回の任意タイミングでの編集機能は諦めることにします。

(2窓にしないことも考えましたが、その場合は在のメニュー画面を一時的にタイムラインを用いた編集画面にしなければなりません。しかし、今後追加する予定の画像機能のことも考えスペースが取れなくなります。よって2窓にしなければならない、と思いました)

参考にしたログ『DXライブラリ用ウィンドウ生成クラス 』
http://www.play21.jp/board/formz.cgi?ac ... &from=tree

Win32APIにおいてのマルチWindow生成に関しての記事
http://d.hatena.ne.jp/shibusawa_1/20081024/1224834973
http://questionbox.jp.msn.com/qa5642592.html
・・・etc

やはりWindowsにおいてC、C++でのGUI開発はWin32APIを学ばなければいけないみたいですね。
ゲーム製作までひと段落したら学ぶことにして、今回はここをスルーすることにします(^^;

Re:2Dエフェクトエディタの作成

Posted: 2010年5月20日(木) 01:04
by やっくん
おかげさまで2Dエフェクトツール、ほぼ完成しました。
まだ、描画したファイルの確認モードを作っていないため動画での説明はできませんが、確認モードが出来次第動画を上げますのでご覧になってもらえないでしょうか。

今回は最終段階とも言える画像追加&削除機能(透過、不透過選択可)と描画との関連を加えました。
最終的なファイルの出力形式は以下のような感じです。
宜しければ添付ファイルと見比べてもらえないでしょうか。
N // 画像枚数
画像0名前 画像1名前 ・・・ 画像(N-1)名前
x座標 y座標 画像NO 透過
x座標 y座標 画像NO 透過
x座標 y座標 画像NO 透過
x座標 y座標 画像NO 透過
/*** 略 ***/
添付ファイルの説明
画像NOのところが繰り返し0→1→2のようになっていますが、これは使用する画像を3つ選んだ場合です。
使用する画像が複数の場合はこのように繰り返しで画像が現れるようになっています。
現れる頻度も今後、変えれる様にしていきたいと思っております。
透過は1がTRUE、0がFALSEと自分の中で決めております。

ここで一つ質問があります。
現在、画像名をファイルの2行目に出力する形で作っています。
パスは記述してないので、画像を呼び出す際はこのファイルを利用するプログラム側でその画像までの相対パスを記述するのが一番良いのでしょうか?それ以外にはありませんよね? 画像

Re:2Dエフェクトエディタの作成

Posted: 2010年5月20日(木) 03:03
by Justy
>後追加する予定の画像機能のことも考えスペースが取れなくなります
 今回は断念ということでいいとは思いますが、編集機能に限らず今後いろいろ機能を増やしていくと
どのみち領域が足りなくなるような気がします。
 その度にウインドウを大きくしていくのもアレなので、タブとかスイッチなどで
メニュー画面内の内容をいつでも切り替えられるような仕組みは入れておいた方がいいのかもしれません。
(動画を見る限り、既に今でも内容が切り替わっているようではありますが)


>WindowsにおいてC、C++でのGUI開発はWin32APIを学ばなければいけないみたいですね
 .Net系だともうちょっと楽に扱えますけど、Windowsで GUIを作る以上なかなか WinAPIは
避けて通れないですね。
 そういう意味ではDXライブラリはよく出来ています。


>宜しければ添付ファイルと見比べてもらえないでしょうか
 一応大丈夫そうに見えるんですが

・ ファイル名に空白があった場合の処理
 これを正しく処理できるようになっていますか?
(スペース区切りより、例えばタブで区切った方がいいかな、と。Excelでも列に分けて見られますし)

・ 画像Noとその画像が透過するかどうかの情報の扱い方
 この組み合わは同じ画像 Noなら透過するかしないかはその段階で決まっているのではないでしょうか。
 もしそうであれば、時間毎の座標リストの中に透過情報を含める必要はないと思います。

・ フォーマットの拡張性は十分でしょうか
 今は開発中なのでそれほど大きな問題にはなりませんが、今後機能を追加していくにあたって、
ファイルフォーマットはある程度柔軟に設計しておく必要はないでしょうか。

 例えば多分今は3行目から時間毎の座標リストと扱っているかと思いますが、そのうち4行目移行に
なるかもしれません。
 そんなとき、古いデータを新しいプログラムが解釈できるように作っておかないと過去のデータを
全て捨てるか、手動で修正が必要になるかもしれません。


>画像を呼び出す際はこのファイルを利用するプログラム側でその画像までの相対パス記述するのが一番良いのでしょうか?

 データファイルの画像ファイル名のところを、そのデータファイルからの相対パスで記述する

 これを基本とするのはどうでしょう?
 こうしておけば、プログラムはデータファイルを解析するだけで、画像ファイルの位置が判ります。

 まぁプログラム側からそれをオーバーライドして、プログラム側で指定したディレクトリパスと、
データファイル内の画像ファイルパスから、画像ファイルの位置を割り出す仕組み‘も’
入れておいてもいいですね。
 動きは同じで画像が違う、ということが簡単にできるようになりますし。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月21日(金) 01:14
by やっくん
>メニュー画面内の内容をいつでも切り替えられるような仕組みは入れておいた方がいいのかもしれません。
現在は、メニューモードと描画モードの2つを切りかえれるようにしております。
メニュー画面を切り替えでうまく編集機能を追加できないかを考えて見ます。

>ファイル名に空白があった場合の処理
>これを正しく処理できるようになっていますか?
できていませんでした。
スペースを含むファイル名を考慮し、文字列はタブor改行で区切られてると想定した場合のプログラムを少し書いてみてみました。直貼りで申し訳ないです。実際に現在製作中のプロジェクトに使う場合はクラスなどを用いてるため書き換える部分もあります。
#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE *fp;           // file pointer
    int i;              // 文字のカウント用
    int num=0;          // 文字列のカウント用
    char moji[10][256]; // 文字列
    char buff[256];     // バッファー

    /* file open */
    fp = fopen("test.txt", "r");
    if(fp == NULL){
        printf("file open error\n");
        return 0;
    }

    /* 文字列の読み込み */
    for(i = 0; ; i++){
        buff = fgetc(fp);
        // もし、1文字目にタブ、スペース、改行ならば読み飛ばす
        if(buff[0] == '\t' || buff[0] == ' ' || buff[0] == '\n'){
            i = -1;
            continue;
        }
        // もし、2文字目以降にタブor改行ならば、そこまでを文字列とする
        else if(buff == '\t' || buff == '\n'){
            buff = '\0';
            strcpy(moji[num], buff);
            num++;
            i = -1;
        }
        // もし、ファイルの終端ならループを抜ける
        else if(buff == EOF) break;
    }

    fclose(fp);

    // output
    for(i = 0; i < num; i++) printf("%s\n", moji);

    return 0;
}


プロジェクトに使う場合は読み込みの終了条件を『改行文字を読み込んだら』に書き換えることになると思います。
ところで、現在は1行にファイル名を何個も記述する形を取っていますが、「1つのファイル名について1行ずつ使う」というのに変えようか迷っております。
出力データファイルの1行目で使う画像の個数を書いているので、こちらの方法も有りかなと思ったのですが、どちらが良いでしょうか?数行に分けることでファイルを見るときは見やすくなるのですが、これは自分の好みで良いでしょうか?

>ファイルフォーマットはある程度柔軟に設計しておく必要はないでしょうか。
今のままでは柔軟とは言えない設計になっています。
具体的に処理を追加するならば1行目あたりにバージョン情報などを付加し、そのバージョンにより場合分けで処理をするように試みます。

>データファイルの画像ファイル名のところを、そのデータファイルからの相対パスで記述する
この発想は全くありませんでした!!これは確かに処理が楽になりそうです。

Justyさん、毎回毎回本当にありがとうございます><

Re:2Dエフェクトエディタの作成

Posted: 2010年5月21日(金) 02:09
by Justy
>どちらが良いでしょうか
 どっちかと言われれば1行1テクスチャですね。
 あとでそのテクスチャに関する補足情報が必要になったとき、同じ行の後ろに追記できますので。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月21日(金) 05:22
by やっくん
最初の行に画像枚数も記述していることですので1行1画像名を使うことにします。

今回はいろいろと改良点が山積みとなっているので、このことも含めて修正をしてみます。

Re:2Dエフェクトエディタの作成

Posted: 2010年5月26日(水) 06:34
by やっくん
忙しくて報告遅れました。
一応、形だけは完成しました。

[nico]http://www.nicovideo.jp/watch/sm10844751[/nico]

今度はこれを用い、実際にエフェクトを作っていってみて、不便な点を改善していきたいと思います。
助言をしてくださった皆様、本当にありがとうございました。
これで解決とさせてもらいます。