|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第604回 CE20 メニューの処理3 発行 2005年9月21日(水曜日) 発行数 約2500 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 というわけで、グランディアにはまってしまったあゆしゃ。 その道中に、アレンジダイスなるミニゲームがありました。 簡単な確率のゲームであり、時間に比例して必ず勝つので、 たいしたことはありません。 では、その確率とはどれほどのものなのでしょうか? さいころの目が出る確率が6分の1なので、そこから考えて 行くことができます。 できるはずです。 私は判りません。 {magclick} /*========================================================*/ 今回のお題 << CE20 メニューの処理3 >> /*========================================================*/ 手短に行きましょう。 /*========================================================*/ 前回までの内容 キャラエディッタの続きで、今度はメニューの作成です。 これは作業ウィンドウの右側に、 円<< 1>> 角 1 という感じで表示します。 数字は描画のサイズです。 パレットとちがい、クリックすることによって選択が変り ます。 選択されている項目は強調され、数字の左右に<<>>を表示し ます。 これは、左クリックで数字が下がり、右クリックで数字が上がる ことを意味するものです。 1文字あたり16ドットとしますので、80ドット、フレームと 余白も入れると100ドットが必要です。 メニューの種類は、まずはこの2つで始めましょう。 /*========================================================*/ 今までのとおり、クラスを作ってそれをメニュー用とします。 クラス名称は、CCETool、という感じでしょうか。 CCEImageを継承します。 幅は100ドット固定、 高さはメニュー数*24ドット+16ドット固定(余白含む)、 マウスクリックイベントによって判定処理を動かし、 メインの処理でその判定内容を反映しましょう。 当たり判定はヒステリシスのアルゴリズムが楽でいいでしょう。 クラスは選択されているメニューの番号とそれぞれの数字を 持ちます。 また、編集を行うワーククラスに対してそれを公開します。 ワーククラスでは描画処理にて、選択されているツールにした がって描画処理を切り替えるでしょう。 /*========================================================*/ というわけで、 メニューについては、今後に作成する「メインメニュー」にも 使用する機能なので、拡張を考えて作りましょう。 メインメニューはツールメニューと違って、縦と横のある 表形式のメニューです。よって、2次元で考えます。 // メニュー処理の基本クラス class CCEMenuData : public CCEImage { public: // 項目数取得 virtual int GetYNum() = NULL; virtual int GetXNum() = NULL; // 文字列取得 virutal CString GetString( int x, int y ) = NULL; // 選択形式 enum { SELTYPE_NONE, // 選択しない、必要がない SELTYPE_STATIC, // 常に選択されている SELTYPE_CLICK, // クリックすると選択される SELTYPE_TACH, // マウスで触れると選択される SELTYPE_BUTTON, // クリックすると実行、選択なし }; virtual int GetSelType( int x, int y ) = NULL; // 値指定形式 enum { NUMTYPE_NONE, NUMTYPE_NUMBER }; virtual int GetNumType( int x, int y ) = NULL; // 値の範囲 virtual int GetMin( int x, int y ) = NULL; virtual int GetMax( int x, int y ) = NULL; // 座標の取得 virtual CRect GetRect( int x, int y ) = NULL; // 横幅の取得 virtual int GetWidth( int x ) = NULL; // ボタンが押されたときのコールバック virtual void OnButton( int x, int y ) = NULL; }; これだけあれば、生のデータを触ることなく表面上の処理を 記述できるでしょうか。 {magclick} /*========================================================*/ さいごに /*========================================================*/ うーん、面倒な話に。。。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は9月23日(金曜日)に、第604回をお送りします。 お題は「CE21 メニューの処理4」 クラスの設計がOOP的に間違っている臭いので、 考え直しましょう。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 ねがいましてーはー、わかりまへんでぇ? なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |