ページ 1 / 1
シューティンゲームソースコードのパラメータ化
Posted: 2009年1月04日(日) 16:01
by dic
今回はシューティングゲームの実装について質問します
今私はシューティングゲームのプログラムのソースコード入力に取り組んでいてて
ある点に気づきました。
それはシューティングの要素である敵、弾の出し方、敵の動き方をパラメータ化
できるのではないのかという点です
しかし、私の頭ではどのようにすればうまくパラメータ化するのかが困っています
今、分かるのは要素を関数で分けて、敵の変数に関数へのポインタをもたせ
これを呼び出すことで、うまいことパラメータ化できるのではないかということです
今知りたいのは、どのようにパラメータ化するのか、どのようにして仕様を
決めていくのかそのやり方についてです
前回のスレで動画をアップロードした通り、一通りの基礎的シューティングの
プログラムは分かっています
なかなか文章が下手で伝わりにくいかもしれませんが、ご教授お願いします
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月04日(日) 18:43
by lbfuvab
ええと、敵の構造体に敵自身の移動の情報とその弾の移動の情報を入れるという事でしょうか?
それなら構造体内に関数ポインタを入れれば良いんじゃないかなと思います。
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月04日(日) 19:26
by たかぎ
Abstract FactoryパターンやStrategyパターンについて調べると吉です。
C++であれば、動的に変更する必要があるなら仮想関数を使って、静的に決定できるのであればテンプレートを使って実現するとよいでしょう。
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 07:23
by dic
lbfuvabさん たかぎさん 回答ありがとうございます
う~ん やっぱり文章がダメのようでした
私が言いたかったことは、敵、弾、動きをパラメータ化するアルゴリズムの
仕様をどのようにして決めていくか?
ということです
それとデザインパターンは知っているつもりでまだ実用で使えるレベルではないので
簡素な方法はないでしょうか?
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 08:24
by SCI
「パラメータ」とは媒介変数のことです。
プログラミング言語の場合には引数(とその他の変数)で実現されます。
対象と対象を対応付けるために、媒介変数表示という手段をとりますね。
つまり、「敵、弾、動きをパラメータ化」とは普段「関数」や「クラス」で実装していることに過ぎません。
したがって「パラメータ化」する「アルゴリズム」とは「敵、弾、動きを媒介変数表示形で実装」する「方法」と捉えることができますが、おそらくこの意図ではありませんね。
私も最初読んだときはファクトリーやストラテジーを思い浮かべました。
或いは、スクリプトエンジンの実装を指しているとも考えました。
「パラメータの仕様」と言われれば、数学的にもプログラミング的にも媒介変数の取捨選択に関するだろうと思います。
まず「パラメータ」が数学的なものなのか、C言語的(引数)なものなのか、どのような意図なのでしょう?
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 16:23
by dic
SCIさん回答ありがとうございます
パラメータ化とはC言語で言う引数のことです
まぎらわしくてすいません
引数にて動きなどを指定する形にできないものか考えているところです
管理人さんの作られている関数へのポインタをインデックス値で
区別つけているようにです
なんとなくイメージは沸いているのですが、具体的にソースコードに変換できないのです
そこで、どういった方法でアルゴリズム、などを決定していくのかを聞きたいのです。
今のイメージは以下のようになり、これより優れた方法はないかなと思っているところです
#include <stdio.h>
void funcDraw()
{
printf( "Draw\n" );
}
void funcMove()
{
printf( "Move\n" );
}
void funcMath()
{
printf( "Math\n" );
}
void (*func[3])() = { funcDraw, funcMove, funcMath };
typedef struct
{
int i, j, k;
} Obj_t;
void funcObj( Obj_t *obj )
{
func[obj->i]();
func[obj->j]();
func[obj->k]();
}
void main()
{
Obj_t a1, a2, a3;
a1.i = 0;
a1.j = 1;
a1.k = 2;
a2.i = 0;
a2.j = 0;
a2.k = 0;
a3.i = 1;
a3.j = 1;
a3.k = 1;
funcObj( &a1 );
funcObj( &a2 );
funcObj( &a3 );
}
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 16:55
by dic
書いている内になんとなく分かってきました
で、以下のようになりました
#include <stdio.h>
#include <stdlib.h>
void funcDraw(){ printf( "Draw\n" );}
void funcMove(){ printf( "Move\n" );}
void funcMath(){ printf( "Math\n" );}
void funcDash(){ printf( "Dash\n" );}
void funcPrint(){ printf( "Print\n" ); }
void func1x1(){ printf( "1x1\n" );}
void (*func[6])() = { funcDraw, funcMove, funcMath, funcDash, funcPrint, func1x1 };
typedef struct
{
int i, j, k;
} Obj_t;
void funcObj( Obj_t *obj )
{
func[obj->i]();
func[obj->j]();
func[obj->k]();
}
// 弾、敵などのオブジェクトに関数へのポインタのインデックス値を代入する
void setObj( Obj_t *obj, int move, int draw, int func )
{
obj->i = move; // 動作関数へのポインタのインデックス値
obj->j = draw; // 描画関数へのポインタのインデックス値
obj->k = func; // オリジナル関数へのポインタのインデックス値
}
void main()
{
Obj_t a1, a2, a3;
setObj( &a1, 0, 1, 2 );
setObj( &a2, 3, 4, 5 );
setObj( &a3, rand()%6, rand()%6, rand()%6 );
funcObj( &a1 );
funcObj( &a2 );
funcObj( &a3 );
}
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 17:04
by dic
wikipediaによると4通りの意味があるようですね
http://ja.wikipedia.org/wiki/%E3%83%91% ... C%E3%82%BF
パラメータ (parameter)
数学において、媒介変数のこと
情報工学において、引数のこと
確率論および統計学において、母数のこと
電子機器の動作を設定する値。
今回はこの2番目の引数のことでした
1番目のパラメータだと混同された方すいませんでした
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月05日(月) 20:41
by SCI
なるほど、なんかオブジェクトに順次実行させる共通処理の中身を、組み換えしたいということですね。
オブジェクト自体に関数ポインタを持たせてループで実行していくのとかでもできそうですね。
>4通りの意味
意味が広いか狭いかの違いだけで、本質は同じですよ。
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月06日(火) 00:22
by たかぎ
これだとデリゲートを使えばうまくいきそうな気もします。
C++では、Boost.FunctionまたはBoost.Signalを使うとよいでしょう。
あらかじめ配列を作っておく必要がある、あるいは呼び出す関数を3つに固定しなければならない理由があるなら、違うかもしれませんが...。
Re:シューティンゲームソースコードのパラメータ化
Posted: 2009年1月06日(火) 08:58
by dic
デリゲートですか初耳ですが、調べたところ委譲のことのようですね
勉強になります
配列を3つに固定する必要はないのですが
オブジェクト指向でいくか、構造体で簡素にいくかで迷っているものでして
オブジェクト指向は保守の時の解読力が私にはあまりないので、なかなか使い切れないのです
boostもまだ、未勉強でして、これはもう構造体でいくしかないのかな
ご回答ありがとうございました