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

×

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

 特にブログで書きたい記事もないのですが、現在制作中のオンラインゲームエディターですが、正式名称がまだ未定なのです。
こちらではPleNetEditerという呼び名としていますが、イマイチピンと来ないかもしれません。

そこで、今回ブログで募集してみます。なにか案があったらコメントでお願いします。

拍手[0回]

PR

 今回はどどんと結構応用なのですが、、
インライン関数の使用についてです。

一般的には、#defineよりも、inline関数を使ったほうが、安全であると言われています。
さて、inline関数の便利な使い方ですが、インライン関数はよくテンプレートと一緒に使われます。

例えば、ZeroMemory関数と言うのがあります。
これ、DirectXプログラミングでは多用されますが、引数がこんな感じなんです。
ZeroMemory(*構造体、sizeof(構造体))
こんな感じにして使うことが多いはずです。
2回も書くのは面倒です。

そこで
template <class T>
inline VOID Zero(T& p){
     ZeroMemory(&p,sizeof(p));
}

こんな風にすれば、呼び出しは、Zero(構造体);
だけでいいようになります。

#defineでやるとこうなりますね。
#define Zero(p) ZeroMemory(&p,sizeof(p));

問題はなさそうですが、ポインタ型を入れることができてしまうという、ちょっとした安全性を考慮したものですね。
さて、ここではDirectXでよく使われる、SAFE_DELETEなどといったマクロをインライン化してみます。

inline void SAFE_DELETE(T*& p)
{
if (p)
{
delete p;
p = 0;
}
};
template <class T>
inline void SAFE_DELETE_ARRAY(T*& p)
{
if (p)
{
delete[] p;
p = 0;
}
};

template <class T>
inline void SAFE_RELEASE(T*& p)
{
if (p)
{
p->Release();
p = 0;
}
};
インライン関数は、C++での機能です。 最初のうちは、便利さがいまいち理解できません。 でも、いざとなって使ってみれば、後々のコーディングが楽になるでしょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ さて、そろそろPV第5弾の内容的な物が・・・できてきたかな・・・ リリースはまだ時間かかりそう・・・・ 中間テスト終わったら、ぐらいかなー

拍手[1回]

毎度毎度、続くかわからないシリーズものです。
ところで、僕にとって一番のチーム内の悩み事は、チーム内の初心者のC++の理解ってところです。

もちろん、募集項目では、技術の有無は求めている点ではないのですが、9割5分はこちらから教えなくてはいけません。
増して、ブログなどで技術記事を書いている人たちを引き抜いてきているつもりのものの、本のソースの発展させた形やひどい場合には本の丸写しだってあります。
それらを見極めてスカウトしてはいるのですが、やっぱり応用力というものがない人が多いのです。

確かにある程度の事であれば、webページの切り貼りで十分ですし、本に付属しているサンプルソースなども利用可能です。
でも、それはあくまでもそこまでのはなしです。

僕は本に付属するソースの使い方と言うのは、そうじゃないとおもうんですよ。やっぱり。
例えば、C++だろうがCだろうが、最初に本に書いてあるソースって、大体以下みたいな感じですよね?

#include <stdio.h>

int main(){
printf("Hello World!!");
return 0;
}

 

そしたら、まだまだできる場所は少ないと思うのですが、とりあえず自分でわかる範囲で書き換えてみるべきだと思うんです。
たとえば、ダブルクォーテーションの中身を書き換えて表示される文字列を変えてみたり・・・
はたまた、ソース中のコメントを自分なりに書き換えることでもいいんだと思います。
人から与えられたものをその形通りに学んだって、決して応用が利くはずがないんですよ。


コンピューターの中の事を本で読んでサイトで読んで、わかった''つもり''になっていませんか??

実際に組んでみることは、【発展】させるための試み。作ることの【喜び】を教えてもらうことができます。
そうでしょう?学校で与えられたものをやるより、自分からやらなければいけないんですね。

本を読むというのはあくまでも受動的であって、自分から行動しなければいけないんですね。

あ、そうそう。別にインターネット上の解説サイトを見るという事を否定はしませんけど、サイトだけでプログラムを習得できるというのは間違っていますよ。
なぜなら、プログラムにはバグがつきもので、バグ一つに1週間悩むこともあれば、1か月悩むこともあるんです。
つまり、、バグ=忍耐しなければならないこと

さて、その中でサイトで学習するより本で学習したほうがいいという決定的な理由があります。
それは、人はある程度損をしなければ投げ出してしまうという特徴があるからなのです。

でも、一番の敵は、わかっているつもりでわかっていないことなのです。
わかっているつもりだからそこがバグでも気づきづらい。
わかっているつもりだから本も読み飛ばしてしまえ。
わかっているつもりだからソースはコピーでいいか。

そんな感じになっていたりするんです。

んじゃあ今回からの、不定期更新及び続くかわからない、本当にわかっているのだろうか講座。
わかっているようでわかっていない。そんな人に向けての講座です。
ちなみに、今回の内容というか理論(コードはもちろん使えないと思うよ)は''だいたい''の場合C++以外の言語でも使えるはずです。
①、無口な関数使ってませんか?
さて、C++言語を半年やたことがある人に「関数わかってる?」って聞いたとしましょう。

当然、わかっているとおもいます。いや、わかっててもらわないと困るんです。なぜなら、C++の基本中の基本であるからです。

これからは、チーム内であった実話です。
「与えた2つの整数値を掛け合わせた数を返す関数を作り、それを利用して2×3をしなさい」
#include <stdio.h>

int cross(int x,int y){
return x*y;
}

int main(){
printf("2*3の結果は%dです。\n",cross(2,3));
return 0;
}
 
こんな感じなのが僕が書いたものですが答えだと思います。
では次に彼が書いた答えを見てみましょう。
彼はたしかこんな感じに答えたんです。
#include <stdio.h>
int z;
void cross(int x,int y){
z=x*y;
return;
}
int main(){
printf("2*3の結果は%dです。",z);
return 0;
}
 
厳格に間違いであるとは言いづらいですが、グローバル変数をこのような形で使うのはもったいない限りであると思います。
こんなちょっぴりしたところでグローバル変数使われたらたまったもんじゃありません。

すぐに名前空間などを使わなければ使える変数名や関数名等が減っていってしまいます。

そうなんですよ、彼はreturnの使い方を知らなかったんです。(これは決して彼が悪いわけではなく、解説書などが、一連のよく使う処理を関数としてまとめておくと便利だという記述がよくあるためかと思います。)

関数。数学で関数って何に使いますか?
例えばこんなものがありますね。
関数のタイプ 例とか x=1のときのy x=2のときのy
一次関数 y=2x+1 y=3 y=5
二次関数 y=2x2+3x+4 y=9 y=18
三角関数 y=sin(xπ+1/4π) y=-1/√2 y=1/√2
さて3つの例を挙げました。
ここで気が付いてほしいのは,xにある数を渡すと、yにそれに応じた値が帰ってくるという点がすべて共通しているという点です。
そう、プログラムの関数も同じなんです。ある数を与えたらそれに応じて何か数を返すというのが本質なんですね。

と、、数学的というにはあまりにも雑ではありますがこういう解説だと、どうも人は好かないらしく、参考書などでは、そういうものなんだという解説が多いのが、プログラムの解説書の難点です。

では、ここでわかったことをプログラムで置き換えてみましょう。
 
 
返値型 関数名(引数型 引数名、引数型 引数名...){
return 返値;
}
となる関数の定義方法ですが、返値型と言うのは、上の3つの例でいう、yにあたります。
例えば、一次関数の例でいえば、2x+1が何に置き換わるか、その型を指します。
そしてreturnの後に返値を入れるんですね。
もちろん、条件分岐などでreturnが1関数の中で複数使われることがありますが、最初にreturnに出会えば、呼び出し先に戻ります。
したがって、同じ関数の中でreturnが呼び出されるとそれ以降の関数内の処理は実行されません。

例えば、関数内にreturn 0;とかかれていたとしたら、その関数は0におきかわります。
return "こんばんわ";
こんなのも当然のごとくありです。当然ですが、返値の型をしっかり指定してやらなければなりませんけどね。







拍手[1回]

すいません、タイトルとか思いつきませんでした。
僕がブログでメンバーを募集した時、だれでもいいって言ったのは決して簡単だというわけではないんです。
というか、ゲームエディタを作っているのにもかかわらず、ゲームを作っていると思っている人が多すぎます!

拍手なんかでもそうなんですが・・・・

さて、久々の開発の内容です。


最近は特に、エディター内部のゲームのデバッガというかただのテスト的な実行環境を作るために頑張っております。
特にここはDirectXで組まれているのですが、MFCのドキュメントテンプレートとリンクしつつのDirectXの操作です。

せっかくですので、最近はやりのシェーダーを使えるようにしたいなーっと。
例えば、シェーダー使えば、MGOのTSNEやSDMのように(知らない人多いかな・・・)影のみレンダリングしてステルスのルールなんか作れそうですし・・・

でも、外部からシェーダーを読み込ませること自体の機能はそこまで難しいものにしなくとも、シェーダー自体を組める人がどこまでいるのだろうか。

簡易的な物を内部で用意しないとなりませんかな・・・

 

拍手[3回]

文化祭が終わりました。
これで開発に集中できますね!

ところで、DirectXシェーダープログラミングブックと言う本を買いました。

かなりわかりやすいですね。

HLSLの解説でもそのうちしようかな・・・

とりあえず、DirectX描画のほうも再構築することにしたんで、そちらの制作を急ごうかと思います

拍手[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]