ページ 11

無題

Posted: 2007年12月05日(水) 22:30
by JugS
簡単なRPGを作ろうと思って色々構想を練っているんですが、マップの作成方法に困っていて
自分の考えでは、
1、表示画面より大きいマップを、背景として読み込む方法。

2、二次元配列でマップを宣言しておいて、for関数で番号に対応したマップチップを敷き詰める方法。

1だと通れる所と通れない所の判断が、つけにくい。
2は配列がでかくて、初期化が面倒な気がする。

個人的には2の方が良いと思うんですが、
例えば、町のマップを2種類作るとき、構造体で
typedef struct{
int map[10][10];
}TW;

TW city[2];
というのを考えたんですが、これだと配列の初期化に手間がかかりそうなので、悩んでいるんですが。

なにか良い方法はありませんか?

よろしくお願いします。

Re:無題

Posted: 2007年12月07日(金) 01:03
by 管理人
構造体を初期化する時や配列を初期化する時は、別にループ文を使わなくても出来ます。
memsetという関数を使って、先頭のポインタから示した領域分、指定した値で初期化することが出来ます。

例えばこの通りです。
#define ITEM_MAX 1000

typedef struct{
	int flag,cnt,knd;
	double x,y;
}item_t;

item_t item[ITEM_MAX];

memset(item ,    0, sizeof(item_t)*ITEM_MAX);
 
 
アイテムに関する構造体、item_t型で宣言した配列を全て0で初期化する時はmemsetでこのように書きます。

memset( 1 , 2 , 3);

1のアドレスから
2の値で
3のサイズ埋める

という意味になります。
この関数について詳しく知りたければググっって下さい。

http://www.google.co.jp/search?hl=ja&q=memset&lr=

構造体の構造体の構造体の・・・と深い階層まで入り組んでいて、初期化が面倒な時も、memsetを使えば全て1行で初期化できます。

Re:無題

Posted: 2007年12月07日(金) 11:24
by たかぎ
主だった処理系では実用上の問題はないのですが、一応処理系不明ですので...

memset でゼロクリアするのは必ずしも正しい方法ではありません。
手前味噌ですが、
http://www.kijineko.co.jp/tech/supersti ... emset.html
http://www.kijineko.co.jp/node/163
でそのことを書いています。

Re:無題

Posted: 2007年12月07日(金) 23:07
by JugS
たかぎさんのリンク先も参考にさせて頂きました。
わざわざありがとうございます。

管理人さんの方法だと、すべて同じ値に初期化するときはいいんですが、
自分の理想としては、
typedef struct{
int map[3][3];
}TW;
TW town[2];
と、宣言しておいて、配列の中身を

town[0].map  //1は壁、2は道
{1,0,1}
{0,0,1}
{1,0,0}

town[1].map
{1,1,1}
{0,0,0}
{0,1,0}
と上記のように、任意の値を入れて、番号に対応したマップチップを敷き詰める描画したいのですが、
このように出来ないでしょうか?

Re:無題

Posted: 2007年12月08日(土) 00:11
by たかぎ
普通に初期化子を使って、
TW town[2] =
{
  {
    {1,0,1}, 
    {0,0,1}, 
    {1,0,0}, 
  },
  {
    {1,1,1} 
    {0,0,0} 
    {0,1,0} 
  },
};
とすればよいだけではないのですか?

Re:無題

Posted: 2007年12月08日(土) 02:38
by JugS
早速打ってみたのですが、
内容はtown.mapを初期化し、値を出力するだけのプログラムですが、
エラーが出ます。原因は何でしょうか?
エラー内容は 初期化子が多すぎる、宣言の構文エラー 等です。

    int a,b,c;

typedef struct{
int map[3][3];
}TW;

TW town[2] ={
{

{1,0,1},

{0,0,1},

{1,0,0}

},

{

{1,1,1},

{0,0,0},

{0,1,0}

},

};


for(a=0;a<2;a++){
for(b=0;b<3;b++){
for(c=0;c<3;c++){
printf("%d ",town[a].map[c]);

if(c == 2)
printf("\n");

}
}
}

Re:無題

Posted: 2007年12月08日(土) 05:18
by フリオ
 
 "{}"が足りないのでは?
これだと、3*3の配列 の配列になっているような。
 

Re:無題

Posted: 2007年12月08日(土) 17:46
by JugS
ご指摘ありがとうございます。

解決しました。