シューティンゲームソースコードのパラメータ化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

シューティンゲームソースコードのパラメータ化

#1

投稿記事 by dic » 16年前

今回はシューティングゲームの実装について質問します
今私はシューティングゲームのプログラムのソースコード入力に取り組んでいてて
ある点に気づきました。
それはシューティングの要素である敵、弾の出し方、敵の動き方をパラメータ化
できるのではないのかという点です
しかし、私の頭ではどのようにすればうまくパラメータ化するのかが困っています
今、分かるのは要素を関数で分けて、敵の変数に関数へのポインタをもたせ
これを呼び出すことで、うまいことパラメータ化できるのではないかということです
今知りたいのは、どのようにパラメータ化するのか、どのようにして仕様を
決めていくのかそのやり方についてです

前回のスレで動画をアップロードした通り、一通りの基礎的シューティングの
プログラムは分かっています

なかなか文章が下手で伝わりにくいかもしれませんが、ご教授お願いします

lbfuvab

Re:シューティンゲームソースコードのパラメータ化

#2

投稿記事 by lbfuvab » 16年前

ええと、敵の構造体に敵自身の移動の情報とその弾の移動の情報を入れるという事でしょうか?

それなら構造体内に関数ポインタを入れれば良いんじゃないかなと思います。

たかぎ

Re:シューティンゲームソースコードのパラメータ化

#3

投稿記事 by たかぎ » 16年前

Abstract FactoryパターンやStrategyパターンについて調べると吉です。
C++であれば、動的に変更する必要があるなら仮想関数を使って、静的に決定できるのであればテンプレートを使って実現するとよいでしょう。

dic

Re:シューティンゲームソースコードのパラメータ化

#4

投稿記事 by dic » 16年前

lbfuvabさん たかぎさん 回答ありがとうございます

う~ん やっぱり文章がダメのようでした

私が言いたかったことは、敵、弾、動きをパラメータ化するアルゴリズムの
仕様をどのようにして決めていくか?
ということです

それとデザインパターンは知っているつもりでまだ実用で使えるレベルではないので
簡素な方法はないでしょうか?

SCI

Re:シューティンゲームソースコードのパラメータ化

#5

投稿記事 by SCI » 16年前

「パラメータ」とは媒介変数のことです。
プログラミング言語の場合には引数(とその他の変数)で実現されます。
対象と対象を対応付けるために、媒介変数表示という手段をとりますね。
つまり、「敵、弾、動きをパラメータ化」とは普段「関数」や「クラス」で実装していることに過ぎません。
したがって「パラメータ化」する「アルゴリズム」とは「敵、弾、動きを媒介変数表示形で実装」する「方法」と捉えることができますが、おそらくこの意図ではありませんね。

私も最初読んだときはファクトリーやストラテジーを思い浮かべました。
或いは、スクリプトエンジンの実装を指しているとも考えました。

「パラメータの仕様」と言われれば、数学的にもプログラミング的にも媒介変数の取捨選択に関するだろうと思います。

まず「パラメータ」が数学的なものなのか、C言語的(引数)なものなのか、どのような意図なのでしょう?

dic

Re:シューティンゲームソースコードのパラメータ化

#6

投稿記事 by dic » 16年前

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 );
}

dic

Re:シューティンゲームソースコードのパラメータ化

#7

投稿記事 by dic » 16年前

書いている内になんとなく分かってきました
で、以下のようになりました
#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 );
}

dic

Re:シューティンゲームソースコードのパラメータ化

#8

投稿記事 by dic » 16年前

wikipediaによると4通りの意味があるようですね


http://ja.wikipedia.org/wiki/%E3%83%91% ... C%E3%82%BF
パラメータ (parameter)

数学において、媒介変数のこと
情報工学において、引数のこと
確率論および統計学において、母数のこと
電子機器の動作を設定する値。

今回はこの2番目の引数のことでした
1番目のパラメータだと混同された方すいませんでした

SCI

Re:シューティンゲームソースコードのパラメータ化

#9

投稿記事 by SCI » 16年前

なるほど、なんかオブジェクトに順次実行させる共通処理の中身を、組み換えしたいということですね。
オブジェクト自体に関数ポインタを持たせてループで実行していくのとかでもできそうですね。

>4通りの意味
意味が広いか狭いかの違いだけで、本質は同じですよ。

たかぎ

Re:シューティンゲームソースコードのパラメータ化

#10

投稿記事 by たかぎ » 16年前

これだとデリゲートを使えばうまくいきそうな気もします。
C++では、Boost.FunctionまたはBoost.Signalを使うとよいでしょう。

あらかじめ配列を作っておく必要がある、あるいは呼び出す関数を3つに固定しなければならない理由があるなら、違うかもしれませんが...。

dic

Re:シューティンゲームソースコードのパラメータ化

#11

投稿記事 by dic » 16年前

デリゲートですか初耳ですが、調べたところ委譲のことのようですね
勉強になります
配列を3つに固定する必要はないのですが
オブジェクト指向でいくか、構造体で簡素にいくかで迷っているものでして
オブジェクト指向は保守の時の解読力が私にはあまりないので、なかなか使い切れないのです

boostもまだ、未勉強でして、これはもう構造体でいくしかないのかな

ご回答ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る