スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ゲーム制作状況 - 2013/10/09版 -

今日の報告!

酷い不具合を直しました。

ちょっとした描画システムに関わる改修を行ったのですが、
それが致命的な不具合を起こしやがりました。

原因は単純なんですけども、簡単に説明してみます。


まず描画システムはint型の変数を使用します。
そのint型の変数の値(ハンドル)は、ハンドル管理クラスから取得します。

【参考画像】
Sample_20131009_1.jpg


で、今までは下記の様に直接int型の変数に入れて管理していたのですが、
----------------------------------------------------
//ハンドル取得!
int t_CharaHandle = t_HandleManager.GetHandle();
int t_FallBlockHandle[ 0 ] = t_HandleManager.GetHandle();
int t_FallBlockHandle[ 1 ] = t_HandleManager.GetHandle();

----------------------------------------------------

これやると、ハンドルの削除および、描画リストからの削除が
面倒くさい事
になります。

※下記のように、一つ一つ削除処理を書く必要がある為。
 また、記載を忘れると透過度100%になったまま
 描画オブジェクトが描画リストに残存
してたり、(見た目上は問題ない。)
 ハンドルの再利用が行われなくなり、描画配列が膨張したりする。
----------------------------------------------------
//ハンドル削除!
//描画配列から、ポインタを通じて描画リストのオブジェクト削除!
//その後、該当の描画配列の要素にはNULLを入れる!
t_HandleManager.DeleteHandle( t_Charahandle );
t_DrawerManager.DeleteDrawer( t_Charahandle );

for( int i = 0; i < 2; i++ )
{
t_HandleManager.DeleteHandle( t_FallBlockHandle[ i ] );
t_DrawerManager.DeleteDrawer( t_FallBlockHandle[ i ] );
}

上記だけならまだいいですが、
表示させるキャラ画像やらスコアの文字やらが増えると地獄。
DeleteHandle関数と、DeleteDrawer関数だけで100行、200行、行ってしまいます。


なので、内部で自動的にDeleteHandle関数とDeleteDrawer関数を呼んでくれる
ハンドルクラスを作った
のです。


{
//この時点で、既に自動的にハンドルを取得している!
CHandle t_CharaHandle;
CHandle t_FallBlockHandle;
}

//変数の有効範囲から出た際に、自動的にハンドル削除関数を呼ぶ!


非常になったのですが、
コピーコンストラクタを忘れていたので、
vectorと組み合わせた時に致命的な不具合が発生してしまったのです。
------------------------------------------------
↓こんな感じの記載で不具合発生
t_HandleVec.resize( 6 );
t_HandleVec.push_back( t_Handle );

------------------------------------------------

何が起こるかというと、こんな感じになります。
------------------------------------------------------------------
1)CHandle:Aが、ハンドル1を取得
2)CHandle:Bに、CHandle:A(ハンドル1)を代入
3) CHandle:Aが消滅。ハンドル1を解放する。
4)CHandle:Bを使用し、ハンドル1で描画オブジェクトを登録


~しばらく描画オブジェクトの削除、追加が繰り返される~

5)CHandle:Cにて、ハンドル1を取得
 (手順3の段階で、再利用queueに「1」が登録されている。それが返される。)
6)CHandle:Cを使用し、ハンドル1で描画オブジェクトを登録
7)CHandle:Bの画像が消滅。CHandle:Cの描画オブジェクトで上書き。

------------------------------------------------------------------

要は、使用中のハンドルなのに、
使っていいよ、と別の描画オブジェクトにも同じハンドルが与え
られ、
描画配列および描画リストの内容がゴチャゴチャに書き換えられるのです。

…まったく。何をやっているのでしょうね?自分は。


代入が発生した場合は、
内部のハンドルはコピーせずに、新規に取得するようにして対応しました。

※CHandle:A(内部ハンドル1)をCHandle:Bに代入した場合、
CHandle:Bには新規取得したハンドル2を入れる。内部ハンドルの代入は行わない。
CHandle:Aは、内部ハンドル1を削除して消滅。


まぁ、不具合対応完了です。
ちょっとゲーム画像が用意できなかったのが残念ですが、
引き続き、開発を進めます!



【今日のひとこと】
NEET株式会社ってどうなったんだろう?

※NEETの人たちが集まって、何かやろう!と立ち上げた会社。
【参考URL】ニートだけで作られた「ニート株式会社」- 痛いニュース

事業モデルも決まっておらず、
「収益の分配」や「評価基準」について意見を出している様だが、
何をするのかは明確に決めた方が良いのではないか。

ゲーム制作で言うと、こんな状態と等しいのではないか? ↓
------------------------------------------------------
ゲーム作ろう!
声優を雇って、ボイスも入れよう!
スタジオは何かそこら辺のを借りれば大丈夫!お金はみんなで負担!
自分は企画をやるから、画像とかプログラムは誰かにやってもらおう!

------------------------------------------------------

現状を見ずに、
「なんか凄い事」「なんか面白そうな事」を
頭の中で思い浮かべて、行動に移そうとするのは
危険。大抵ロクでもない事になる。


※理由 … 行動理由が、「何か面白そう」とか好奇心によるものだから。
      こういう人は、実際に作業をやって、「つらい。大変。」という事を知った時に、
      あっさり挫折(放棄)する人が多い。
自分は3、4人くらい見たことある。


今からでも遅くない、しっかりと計画から決めるんだ…!
間に合わなくなっても知らn(ry
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。