zillionプロジェクト開発ブログ 忍者ブログ

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今はスタートウィンドウを最初から作り直しています。
無駄にボタンが多ければいいというものではないので
新規プロジェクト、プロジェクトを開く、閉じるの3ボタンだけです。

ですが、これだけだといろいろと寂しいこと極まりないので
上の部分に今日のTipsとして、テキストファイルから読み込んだ、OEの使い方の小技的な記事を入れることにしました。

機構はできたのですが、Tipsの中身のクオリティが・・・低い・・・

まぁいいです

それはリリースしてからで・・・

拍手[2回]

PR

最近メンバー減ってます。
というか新規採用すると、残るのはその4分の1他は、どっか行っちゃいます。

なんか、悲しい限りですね。4人のうち3人が、プログラムを簡単に理解できると思っているようなのでしょうか?
しかも、その誰もが最初に言います。「やる気だけはある」

いや、俺やる気がある期間は何も言えないけど、やる気がなくなって消えられたら、何も言えないまま終わってしまう気がするんだよ・・・

やる気ってのは大事なんだと思う。だけど、やる気ってのは、やる気を継続する力を含めてやる気出ないといけないんだと思う。


そういえば、情報の時間でホームページ作ってます。
そうです、何かおかしいですよねー?

明らかに作っているのはホームページではない!サイトではないのか!

んま、名前なんてどうでもいいんですけどね・・・

補足::

タイトルのくせに募集のこと書いてませんでした。

作業時間とか、決まってませんけど、仕事しないで自分の技術の向上をしない人は、基本的にNGです。

習得している言語はC++が望ましいですが、ぶっちゃけそんな簡単に協力してくれるありがたすぎる人は少ないので、全くやったことのない人でも、やる気を出して習得すればいいです。

特にのどから手が出るほど欲しい人材
C++を習得していて、かつDirectXまたはMFCに触れた経験のある方。
2Dのアイコンを書いてくれる方。


拍手[1回]

本物のプログラミングではよくすると言われている、再構築の作業?ですが、できる限り少なくしていこうと思っていましたけど、ドキュメントテンプレート周辺、リボンコントロール周辺を見直そうかと思うので、その辺を作り直します。

簡易エディターは移植しますけど、スプラッシュウィンドウのメンバーが大分入れ替わったので、新しく絵を描いてもらうよう頼まなければいけません。

また、今回ランタイムもWin32 API直打ちしていたのを、MFCに変えるように指示を出しました。
というのも、共有のゲームエンジンライブラリがMFCで使いにくかったりしたためです。

今回の再構築作業で予定される作業は以下です。

***削除***
・リボンコントロール(代わりに、VSツールバーに移行。リボンコントロールの無駄な大きさによって作業がしにくいと判断したため)
・アウトプット子ウィンドウ(別にプログラミングツールじゃないので、出力は必要なさそう)
・コードライタ、ビジュアルエディタ、デザインビュー(より、簡易作成ができるものに変更。ただし、自由度が下がる可能性があり)

***機能向上***
・エディタとランタイムとの相互互換性の向上。エディタ内でプレビューしながらの作成作業を可能に・・・したいな・・・
・エディタのプラグイン機能というかなんというか・・・OLEを使って
・ゲームファイルではなく、プロジェクトファイルのフォーマットの見直し

***新規***
・再起動マネージャのサポート(フリーズや、いきなりPCの電源が切れても、編集していたファイルがある程度復活する夢の機能!)
・値入力画面を、プロパティグリッドを有効活用したものに変更。
・PleNet認証システム(サーバー側構築済み)

ただし、青字はすでに作業終了部分

拍手[1回]

どうもこの機能。いろんな機能が入っているようなので、せっかくですので、解説しましょう。
MFCでソフト開発する際に、これを使わないなんてもったいないです。

とはいっても、僕自身、理解したつもりですが、「つもり」なので、ご指摘などなどありましたら、どうぞ。


ドキュメントテンプレートを活用しよう

MFCの特徴は、何と言っても、その生成ウィザードやクラスウィザードなどと言った、開発者が便利だと思えるような機能です。
生成ウィザードの設定1つで、大幅にアプリケーションの外観が変わることも多くあります。
さて、まずMFCのプロジェクト生成ウィザードで、おそらく必ずあるファイルがこれら・・
Cxxx.cpp,Cxxx.h
CxxxDoc.cpp,CxxxDoc.h
CxxxView.cpp,CxxxView.h
この3つが、MFCを使ってプログラムする際に、非常に重要な役割をするのです。
DocとViewにまず注目してほしいです。
Docファイルを眺めてみれば、中に、ファイルの保存、書き出し、などと言った処理が書かれています。
普通ならば、1行一行ファイルを読み込んでめんどくさい代入処理を書かなければなりませんが、オーバーライドされる、Serializeメソッドですべて解決できます。
何よりもすばらしいのは、Serializeで使える、CArchiveクラスの引数です。
arと通常は変数として記されていますが、


ar<<書き出したい変数
ar>>読み込みで代入する変数


これですべて済みます。楽ですねー
そして読み込んで変数に代入されたものをViewから利用させます。
CxxxApp* pCxApp=GetDocumet();
こうして、pCxApp内の変数を読み取って、OnDraw内などで、描画させるのがViewの役割です。


CArchiveは、さらに、CSocketとバインドさせることもできるようです。
僕はまだやっていませんが、ネットワーク上からプロファイルをロードしたりなど、使い道は様々だと思われます。

参考URL:msdn.microsoft.com/ja-jp/library/ya4826hx%28VS.80%29.aspx

拍手[1回]

MSDNのリニューアル?された学習動画サイトですが、これによってMFCについて、たくさん学んだことがあったので、ここで、記事にしておきます。
ほかにも、便利機能とかあったら教えてくださいね。ちょっとしたことでも俺知らないことがあるともいますから。
1,SafeIntクラス

0での除算や、int型においてのバッファオーバーフローが予防できるクラスのようです。
OEでのランタイムでは、ユーザーがこちらの予期せぬデータを入力する可能性を考えると、大いに活用したいと思います。

ヘッダ safeint.h
名前空間 msl::utilities

とりあえず、safeint.hをインクルードして、名前空間をいちいち打つのめんどいんで、using namespace msl::utilities
としておきます。
使用方法はこんな感じのようです。

SafeInt <unsigned int> x(1234567);
なるほど、unsignedなど、型もつけられるんですね。こりゃあいい。
符号なし整数のほうが機能が活躍するらしいので、できる限りunsigned intにしておきましょう。

このまま、大きい数で計算をすると、バッファオーバーフローをおこし、デバッガが起動されます。
気づきにくかったエラーも一目瞭然。と言うわけですか。

ですが、これ以上に目玉は、try~~catch構文で囲めることです。
スローされる例外は、SafeIntExceptionのようです。

try{
エラーの発生の可能性のある、SafeIntの処理
}catch(SafeIntException e){
エラーった場合の処理。
}

これで、エラーが発生したときにメッセージボックスを発生させる処理を組めますね。

ですが、これSafeIntを使うたびに呼び出さないといけないのでめちゃくちゃめんどくさいです。
しかしちゃんとそこが対応されているのがMFCですね。
class SafeIntCustomException:public SafeIntException{
}
このように、クラスを継承して、自分なりのカスタムエラー処理を書くことができるようです。

中身でオーバーライドできる関数は以下の通りです。
static void SafeIntOnOverflow() その名の通り、バッファオーバーフローを起こしたときに呼び出されるメソッドのようです。
static void SafeIntOnDivZero() その名の通り、0で割った場合に呼び出されるメソッドのようです。


動画中の注釈によると、CMFCExceptionではないようなので、注意したほうがよさそうです。

さて、SafeInt側で、独自に用意したクラスを用意するには以下のようにする必要性があるようです。

#include <safeint.h>の前に、
#define _SAFEINT_DEFAULT_ERROR_POLICY SafeIntCustomException
#defineの後に_SAFEINT_DEFAULT_ERROR_POLICYを書いて、そのあとに自分で定義したクラス名を書きます。

しかも、こうやって指定した場合、try/catchが要らないようなのです。
独自エラー処理クラスの中に、メッセージボックスを表示するようにして、アプリケーションを終了するようにすれば安全でしょう。

さらに、このエラー処理クラスですが、変数の宣言時に分けることも可能なようです。

先ほど、Safeint<unsigned int> x(1234567);
としたところで、
SafeInt<unsigned int,カスタムエラー処理クラス名> y(1234567);
とすることによって、そのクラスがエラー処理に使われることになります。


さて、以上がSafeIntでした。VS2010、MFCの期待の戦力だと語っていました。
.Netに最近押されてきた気がするMFCですが、まだまだ新機能を出してきてほしいものです。

さて、続いて、解説が少ないドキュメントテンプレートについてです。

2,ドキュメントテンプレート

知っての通り、MFCプロジェクトを作成すると、CxxxAppクラス、CxxxViewクラス、CxxxDocクラスなどが自動で生成されます。
また、3番で解説しようと思う、再起動マネージャについても、ここが基礎知識となります。

さて、MFCはゲームなどの開発よりも、実用ソフトに適していると言われます。
これは、このドキュメントテンプレートの強力な機能を見るとよく理解できます。

ドキュメントテンプレートについては僕自身最近理解したもので、不備があったら報告お願いします。

さて、CxxxDocクラス。これがアプリケーションで開く、ドキュメントのテンプレート?になるようです。
そしてCxxxViewクラスにおいて、CxxxDocクラスを読み取ってウィンドウに表示する機能を有します。

まず、CxxxDoc上において、自分のアプリケーションで操作する変数などを扱います。
従ってここにメンバ変数などを宣言します。

そして、CxxxView上のOnDrawメソッドをオーバーライドし、その上においてドキュメント情報を読み解き、画面に表示する機能を実装します。
(余談ですが、OEでは、CDCを使用せず、DirectXにゆだねています。ただし、DirectXをMFC用に使いやすくクラスにしたもので、こうしないと相当長くなります。)
さてまず一番大事なのは、CxxxDocのメンバ変数情報を、CxxxViewで取得することです。
その方法は以下です。

CxxxDoc* pDoc=GetDocument();
これによって、CxxxDocへのポインタができますので、メンバ変数を取得できますね。
あとは、View内にハンドラなどを追加して描画すればいいです。

あとは、これをCxxx.cpp内のCxxxAppクラスでドキュメントテンプレートを使用します。
OEの場合ですが、こんな感じです。
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_OEFPSTYPE,
        RUNTIME_CLASS(COnLineGameEditerDoc),
        RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
        RUNTIME_CLASS(COnLineGameEditerView));
また、CMultiDocTemplateクラスについてはいろいろな機能がありますので、この後にその設定処理を書きます。

また、ファイルを開く処理ですが、生成されたものでは、
ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
となっていました。CWinAppExとなると、CxxxAppクラスの基本クラスですね。
ここは実験していない+調べていないのですが、予想で失礼しますが、
CxxxDoc内のSerializeメソッドを呼び出し、ドキュメントロード。
と言う流れであると予想しています。

さて、書きこみ、読み込みをつかさどるSerializeですが
void COnLineGameEditerDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: 格納するコードをここに追加してください。
    }
    else
    {
        // TODO: 読み込むコードをここに追加してください。
    }

    // 基本クラスCOleServerDocEx を呼び出すことによってコンテナー ドキュメントの
    //  COleClientItem オブジェクトのシリアライゼーションが可能になります。
    COleServerDocEx::Serialize(ar);
}

つまり、上のスコープには、読み込み処理を、下のスコープには書きこみ処理を描けばいいという事ですね。
また、ar<<書きこみたいもの
これで書き込みができるようです。
iostreamみたいですね

3,再起動マネージャ
SafeIntやドキュメントテンプレートでわかりましたね?
SafeIntは賞用ソフトなどにおいてのバッファオーバーフローなどによるフリーズを抑止するためにあり、ドキュメントテンプレートには、プロジェクトファイルを書きだすための便利な機能があります。
さて、ここでさらに、僕たちにはうれしい機能が、この再起動マネージャです。

再起動マネージャ・・・と聞いて、PC自体を再起動するかと思われるでしょうか?違います
もし万が一ソフトがフリーズした場合において、ソフトを再起動させ、エラーを解決するためにあります。

イマイチよくわかりませんね。

つまり、一時ファイルを用意し、直前の作業をフリーズしても復元できるのです。

そうExcelにありましたね。だってMFCつかわれてますもんねOfficeは。

まず、再起動させる壊すものを作ります。
*(int*)0=0;
動画ではこれを利用しておりました。とりあえずこれで行きましょう。

さてCxxxAppのコンストラクタに    // 再起動マネージャーをサポートします
    m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
と言う一文がありました。
無ければ追加することでサポートされるようです。
次に一時ファイルの自動保存間隔です。これによって、ドキュメントが復元できるようです。
動画で Jonathan Wood氏はデフォルトでは5分で設定されているが、これが一番望ましいと語っています。
ですが、これを変更する方法も語っていました。
m_nAutosaveInterval=150000;
このようにすることで保存間隔(インターバル)を設定できるようです。
また、オーバーライドされていると思われる
BOOL CxxxApp::InitInstance()において、CWinAppEx::InitInstance();
を呼び出さなければいけないとも語っています。
これで、再起動マネージャはサポートされました。

IDEの中だと、デバッグされてしまうので、外で実験することによってそれが実証されます。

以上でした。
次回も続いて自分の知っている知識を皆さんに公開したいと思います。



拍手[1回]

◎ カウンター
◎ カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
◎ 最新CM
[10/24 名無しの権兵衛]
[08/30 名無しの権兵衛]
[08/14 no name no future]
[08/05 ゲームサークルEaSt]
[07/28 リオウ]
◎ プロフィール
HN:
solilpquy
年齢:
30
性別:
男性
誕生日:
1994/09/22
職業:
人間
趣味:
趣味ねぇ~~う~ん・・・
◎ ブログ内検索
◎ バーコード
◎ アクセス解析
◎ フリーエリア
◎ フリーエリア
Script: Ninja Blog 
Design by: タイムカプセル
忍者ブログ 
[PR]