ページ 11

構造体に構造体を代入

Posted: 2011年10月30日(日) 17:32
by Chalaza
ゲームのマップデータを構造体にまとめてみただけなのですが、画像が表示されなくなってしまいました。
MapData_t MapdataSelect[2]で、2マップ分の構造体配列データを作って、
MapData_t MapDataにMapdataSelect[X]を代入して、MapDataを表示することによって、Xを変えるだけでマップが変わるという考えなのですが、
MapdataSelect[2](マップ2つ分)を初期化するときに、空の画像用配列0を用意して、後からその0に画像を代入してから、
MapDataをMapdataSelect[0](マップ1)にセットして、MapDataの画像を表示する感じなのですが、うまく表示されません。
マップ自体の配列を構造体に入れるのは後回しにして、まずはマップ1の画像を表示するのを成功させたいのですが、
どこが画像データが表示されない原因なのでしょうか?

コード:

#include "DxLib.h"
#include "FPlayer.h"
#include "FMap.h"

// 物体構造体の実体
static ObjectData_t ObjectData[20];

//MAP共通
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 384
int CameraX,CameraY;

int ZahyouTest = 0;

int TestChip;
int TestPlayer;

//マップ1
#define Iramuduki_HEIGHT 11
#define Iramuduki_WIDTH 11

int IramudukiMAP[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //壁と床用マップデータ
{

                    {0,9,9,9,9,9,9,9,9,0,0},
                   {8,0,7,7,7,7,7,7,7,7,0},
                  {8,6,1,1,1,1,1,1,1,1,0},
                 {8,6,1,1,1,1,1,1,1,1,0},
                {8,6,1,1,1,1,1,1,1,1,0},
               {8,6,1,1,1,1,1,1,1,1,2},
              {8,6,1,1,1,1,1,1,1,1,2},
             {8,6,1,1,1,1,1,1,1,1,0},
		    {8,6,1,1,1,1,1,1,1,1,0},
	       {0,6,1,1,1,1,1,1,1,1,0},
		  {0,0,0,0,0,0,0,0,0,0,0},

};

int IramudukiKAGU[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //家具用マップデータ
{

                    { 0, 0, 0, 0, 0,18, 0, 0, 0, 0, 0},
                   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                  { 0, 0, 0,17, 0, 0, 6, 0, 0, 0, 0},
                 { 0, 0, 0,16, 0, 9, 3,12, 0, 0, 0},
                { 0, 0, 0,15, 0, 0, 0, 0, 0, 1, 0},
               { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
              { 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 0},
             { 0, 0, 0, 0, 5, 0,10, 4, 0, 2, 0},
            { 0, 0, 0, 0,14, 0, 0,13, 0,11, 0},
           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};

int IramudukiHit[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //家具用マップデータ
{

                    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
                   { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
                  { 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1,},
                 { 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1,},
                { 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1,},
               { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
              { 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0,},
             { 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1,},
            { 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1,},
           { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
	      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
};

typedef struct {   
    int stage;
	int kagustage;
	int hitstage;
    int width; 
    int height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

MapData_t MapdataSelect[2] = {{ 0, 0, 0, Iramuduki_WIDTH, Iramuduki_HEIGHT,{0}, {0}},
						{ 0, 0, 0, 0, 0, 0, 0, 0}};

MapData_t MapData = MapdataSelect[0];

void FMap_Initialize( ObjectData_t *Objectdata , FPlayer_t *FPlayer)//フィールドマップ初期化
{
	MapData_t MapData = MapdataSelect[0];

	TestChip = LoadGraph("Image/Map/test1.png");
	TestPlayer = LoadGraph("Image/Map/test2.png");
	int CaffeYuka = LoadGraph("Image/Map/Yuka/Carpet4.png");
	int CaffeEXIT = LoadGraph("Image/Map/Yuka/CaffeEXIT.png");
	int CaffeKabe1LEFT = LoadGraph("Image/Map/Kabe/Caffe1LEFT.png");
	int CaffeKabe1RIGHT = LoadGraph("Image/Map/Kabe/Caffe1RIGHT.png");
	int CaffeKabe2LEFT = LoadGraph("Image/Map/Kabe/Caffe2LEFT.png");
	int CaffeKabe2RIGHT = LoadGraph("Image/Map/Kabe/Caffe2RIGHT.png");

	int Syokubutu0 = LoadGraph("Image/Map/Kagu/Syokubutu0.png");
	int Table0 = LoadGraph("Image/Map/Kagu/Table0.png");
	int Isu0LEFT = LoadGraph("Image/Map/Kagu/Isu0LEFT.png");
	int Isu0RIGHT = LoadGraph("Image/Map/Kagu/Isu0RIGHT.png");
	int Isu0LEFTOKU = LoadGraph("Image/Map/Kagu/Isu0LEFTOKU.png");
	int Isu0RIGHTOKU = LoadGraph("Image/Map/Kagu/Isu0RIGHTOKU.png");
	int Counter0LEFT = LoadGraph("Image/Map/Kagu/Counter0LEFT.png");
	int Counter0CENTER = LoadGraph("Image/Map/Kagu/Counter0CENTER.png");
	int Counter0RIGHT = LoadGraph("Image/Map/Kagu/Counter0RIGHT.png");
	int Kabee0 = LoadGraph("Image/Map/Kagu/Kabee0.png");

	MapdataSelect[0].Chip[1] = CaffeYuka;
	MapdataSelect[0].Chip[2] = CaffeEXIT;
	MapdataSelect[0].Chip[6] = CaffeKabe1LEFT;
	MapdataSelect[0].Chip[7] = CaffeKabe1RIGHT;
	MapdataSelect[0].Chip[8] = CaffeKabe2LEFT;
	MapdataSelect[0].Chip[9] = CaffeKabe2RIGHT;

	MapdataSelect[0].Kagu[1] = Syokubutu0;
	MapdataSelect[0].Kagu[2] = Syokubutu0;
	MapdataSelect[0].Kagu[3] = Table0;
	MapdataSelect[0].Kagu[4] = Table0;
	MapdataSelect[0].Kagu[5] = Table0;
	MapdataSelect[0].Kagu[6] = Isu0LEFT;
	MapdataSelect[0].Kagu[7] = Isu0LEFT;
	MapdataSelect[0].Kagu[8] = Isu0LEFT;
	MapdataSelect[0].Kagu[9] = Isu0RIGHT;
	MapdataSelect[0].Kagu[10] = Isu0RIGHT;
	MapdataSelect[0].Kagu[11] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[12] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[13] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[14] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[15] = Counter0LEFT;
	MapdataSelect[0].Kagu[16] = Counter0CENTER;
	MapdataSelect[0].Kagu[17] = Counter0RIGHT;
	MapdataSelect[0].Kagu[18] = Kabee0;

}


void FMAP_Object(FPlayer_t FPlayer, ObjectData_t Objectdata){//オブジェクト構造体に物体の座標を代入

	ObjectData[1].Img = MapData.Kagu[1];
	ObjectData[2].Img = MapData.Kagu[2];
	ObjectData[3].Img = MapData.Kagu[3];
	ObjectData[4].Img = MapData.Kagu[4];
	ObjectData[5].Img = MapData.Kagu[5];
	ObjectData[6].Img = MapData.Kagu[6];
	ObjectData[7].Img = MapData.Kagu[7];
	ObjectData[8].Img = MapData.Kagu[8];
	ObjectData[9].Img = MapData.Kagu[9];
	ObjectData[10].Img = MapData.Kagu[10];
	ObjectData[11].Img = MapData.Kagu[11];
	ObjectData[12].Img = MapData.Kagu[12];
	ObjectData[13].Img = MapData.Kagu[13];
	ObjectData[14].Img = MapData.Kagu[14];
	ObjectData[15].Img = MapData.Kagu[15];
	ObjectData[16].Img = MapData.Kagu[16];
	ObjectData[17].Img = MapData.Kagu[17];
	ObjectData[18].Img = MapData.Kagu[18];

	//家具用マップデータから置くXY座標を計算
	int x,y;
	for(y=0;y<MapData.height;++y) 
	{
		for(x=0;x<MapData.width;++x)
		{
			if(IramudukiKAGU[y][x]!=0 ){
				ObjectData[(IramudukiKAGU[y][x])].DrawX = 24*12+((12-y)*(48/2)+(x*24)-24);
				ObjectData[(IramudukiKAGU[y][x])].DrawY = 12*12+((x+y)*12);
			}
		}
	}
	ObjectData[0].Img = FPlayer.Image;
	ObjectData[0].DrawX = (int)FPlayer.X;
	ObjectData[0].DrawY = (int)FPlayer.Y;
}

//オブジェクトのY座標比較関数
int int_cmp(const ObjectData_t **a, const ObjectData_t **b)
{
    if ((*a)->DrawY < (*b)->DrawY)
        return (-1);
    else if ((*a)->DrawY > (*b)->DrawY)
        return (1);
    return (0);
}

void FMap_Draw(FPlayer_t FPlayer)//マップ描画
{


	int x,y;

	for(y=0;y<MapData.height;++y) //マップを描画
	{
		for(x=0;x<MapData.width;++x)
		{
			if(IramudukiMAP[y][x]!=0){
				DrawRotaGraph(24*12+((12-y)*(48/2)+(x*24)-24-CameraX),12*12+((x+y)*12-CameraY), 1.0,  0.0, MapData.Chip[(IramudukiMAP[y][x])], TRUE );
			}
		}
	}
	
	if(ZahyouTest==1)
		for(y=0;y<MapData.height+1;++y) //マップを描画
		{
			for(x=0;x<MapData.width+1;++x)
			{
				if(IramudukiHit[y][x]!=0){
					DrawRotaGraph(48*x,48*y, 1.0,  0.0, TestChip, TRUE );
				}
			}
		}

	if(ZahyouTest==1)
		DrawRotaGraph((int)FPlayer.HitX,(int)FPlayer.HitY, 1.0,  0.0,TestPlayer, TRUE );

	//物体を奥から描画するように並び替えて描画する
	    int  i;
    ObjectData_t *SortArray[19] = { &ObjectData[0], &ObjectData[1], &ObjectData[2], &ObjectData[3], &ObjectData[4], &ObjectData[5],
	 &ObjectData[6], &ObjectData[7], &ObjectData[8], &ObjectData[9], &ObjectData[10], &ObjectData[11], &ObjectData[12],
	 &ObjectData[13], &ObjectData[14], &ObjectData[15], &ObjectData[16], &ObjectData[17], &ObjectData[18]};
    int  nx = sizeof(SortArray) / sizeof(SortArray[0]);     // 配列の要素数
 
    qsort(SortArray, nx, sizeof(ObjectData_t*), (int(*)(const void*, const void*))int_cmp);//ソートする
 
    for (i = 0; i < nx; i++)
		DrawRotaGraph(SortArray[i]->DrawX-CameraX,SortArray[i]->DrawY-CameraY, 1.0,  0.0, SortArray[i]->Img, TRUE );

}

void FMap_Scroll( FPlayer_t *FPlayer)//マップスクロール
{
	CameraX = (int)FPlayer->X - SCREEN_WIDTH/2 ;
	//ステージのスクロール
	if(CameraX < 0)CameraX = 0;
	if(CameraX > (MapData.width*2*48)-SCREEN_WIDTH) CameraX = (MapData.width*2*48)-SCREEN_WIDTH;

	FPlayer->ViewX = (int)FPlayer->X - CameraX;

	CameraY = (int)FPlayer->Y - SCREEN_HEIGHT/2 ;
	//ステージのスクロール
	if(CameraY < 0)CameraY = 0;
	if(CameraY > (MapData.height*2*12)-MapData.height) CameraY = (MapData.height*2*12)-MapData.height;

	FPlayer->ViewY = (int)FPlayer->Y - CameraY;
}

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 17:47
by box
Chalaza さんが書きました:画像が表示されなくなってしまいました。
コンパイルは通っているのでしょうか?

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 18:10
by Chalaza
はい。しっかり起動できました。
マップの縦横の長さはしっかり構造体で管理できてると思うので、やっぱり画像の代入らへんがおかしいかと
思っているところです。もう少し考えてみます。

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 18:30
by box
Chalaza さんが書きました:

コード:

void FMAP_Object(FPlayer_t FPlayer, ObjectData_t Objectdata){//オブジェクト構造体に物体の座標を代入
ここの第2引数の名前は本当に Objectdata で正しいですか?
直後でさかんに使っている
Chalaza さんが書きました:

コード:

	ObjectData[1].Img = MapData.Kagu[1];
	ObjectData[2].Img = MapData.Kagu[2];
	ObjectData[3].Img = MapData.Kagu[3];
	......
	以下略
これらとのつじつまは合っていますか?

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 19:20
by box
その他のツッコミどころとしては、
Chalaza さんが書きました:

コード:

MapData_t MapData = MapdataSelect[0];

void FMap_Initialize( ObjectData_t *Objectdata , FPlayer_t *FPlayer)//フィールドマップ初期化
{
	MapData_t MapData = MapdataSelect[0];
FMap_Initialize() の中では、関数の外で定義した MapData と、関数の中で定義した MapData の
どちらを使おうとしているのでしょうか。

また、FMap_Initialize() の引数である Objectdata や FPlayer を、関数の中で使っている気配がありません。
もし使わなくていいのであれば、引数として指定する必要はないのではないでしょうか。

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 19:37
by Chalaza
すみません。FMap_Initialize() の中ではMapDataを定義しようとしていたんではなくMapdataSelect[0]を代入しようとしていただけなので
MapData = MapdataSelect[0]; と書けばいいだけでした。

ObjectDataとPlayerdataは前に初期化に使っていたのですが、必要ないと分かり使わなくなったのを引数から外し忘れてました。
指摘通り、引数からはずすことにします。

ここまで直したのは良いのですが、やはりマップデータ系統の画像は表示されないままです…。
Objectdata[0]のプレイヤーキャラは表示されるのですが、ObjectData[1]以上の物体画像が表示されないような感じです。
MapData_t MapdataSelect[2]の初期化で0の画像用配列を作っておくという考え方とかがいけなかったのでしょうか?
それとも、画像の宣言と代入は別にしなければいけないのでしょうか?

コード:

#include "DxLib.h"
#include "FPlayer.h"
#include "FMap.h"

// 物体構造体の実体
static ObjectData_t ObjectData[20];

//MAP共通
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 384
int CameraX,CameraY;

int ZahyouTest = 0;

int TestChip;
int TestPlayer;

//マップ1
#define Iramuduki_HEIGHT 11
#define Iramuduki_WIDTH 11

int IramudukiMAP[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //壁と床用マップデータ
{

                    {0,9,9,9,9,9,9,9,9,0,0},
                   {8,0,7,7,7,7,7,7,7,7,0},
                  {8,6,1,1,1,1,1,1,1,1,0},
                 {8,6,1,1,1,1,1,1,1,1,0},
                {8,6,1,1,1,1,1,1,1,1,0},
               {8,6,1,1,1,1,1,1,1,1,2},
              {8,6,1,1,1,1,1,1,1,1,2},
             {8,6,1,1,1,1,1,1,1,1,0},
		    {8,6,1,1,1,1,1,1,1,1,0},
	       {0,6,1,1,1,1,1,1,1,1,0},
		  {0,0,0,0,0,0,0,0,0,0,0},

};

int IramudukiKAGU[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //家具用マップデータ
{

                    { 0, 0, 0, 0, 0,18, 0, 0, 0, 0, 0},
                   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                  { 0, 0, 0,17, 0, 0, 6, 0, 0, 0, 0},
                 { 0, 0, 0,16, 0, 9, 3,12, 0, 0, 0},
                { 0, 0, 0,15, 0, 0, 0, 0, 0, 1, 0},
               { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
              { 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 0},
             { 0, 0, 0, 0, 5, 0,10, 4, 0, 2, 0},
            { 0, 0, 0, 0,14, 0, 0,13, 0,11, 0},
           { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
		  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};

int IramudukiHit[Iramuduki_HEIGHT][Iramuduki_WIDTH] = //家具用マップデータ
{

                    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
                   { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
                  { 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1,},
                 { 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1,},
                { 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1,},
               { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
              { 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0,},
             { 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1,},
            { 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1,},
           { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,},
	      { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,},
};

//マップデータの構造体
typedef struct {   
    int stage;
	int kagustage;
	int hitstage;
    int width; 
    int height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

//マップデータセレクトを定義
MapData_t MapdataSelect[2] = {{ 0, 0, 0, Iramuduki_WIDTH, Iramuduki_HEIGHT,{0}, {0}},
						{ 0, 0, 0, 0, 0, 0, 0, 0}};

MapData_t MapData = MapdataSelect[0];	//マップデータを初期化

void FMap_Initialize()//フィールドマップ初期化
{
	MapData = MapdataSelect[0];	//マップデータを最初のマップに設定

	TestChip = LoadGraph("Image/Map/test1.png");
	TestPlayer = LoadGraph("Image/Map/test2.png");
	//画像
	int CaffeYuka = LoadGraph("Image/Map/Yuka/Carpet4.png");
	int CaffeEXIT = LoadGraph("Image/Map/Yuka/CaffeEXIT.png");
	int CaffeKabe1LEFT = LoadGraph("Image/Map/Kabe/Caffe1LEFT.png");
	int CaffeKabe1RIGHT = LoadGraph("Image/Map/Kabe/Caffe1RIGHT.png");
	int CaffeKabe2LEFT = LoadGraph("Image/Map/Kabe/Caffe2LEFT.png");
	int CaffeKabe2RIGHT = LoadGraph("Image/Map/Kabe/Caffe2RIGHT.png");

	int Syokubutu0 = LoadGraph("Image/Map/Kagu/Syokubutu0.png");
	int Table0 = LoadGraph("Image/Map/Kagu/Table0.png");
	int Isu0LEFT = LoadGraph("Image/Map/Kagu/Isu0LEFT.png");
	int Isu0RIGHT = LoadGraph("Image/Map/Kagu/Isu0RIGHT.png");
	int Isu0LEFTOKU = LoadGraph("Image/Map/Kagu/Isu0LEFTOKU.png");
	int Isu0RIGHTOKU = LoadGraph("Image/Map/Kagu/Isu0RIGHTOKU.png");
	int Counter0LEFT = LoadGraph("Image/Map/Kagu/Counter0LEFT.png");
	int Counter0CENTER = LoadGraph("Image/Map/Kagu/Counter0CENTER.png");
	int Counter0RIGHT = LoadGraph("Image/Map/Kagu/Counter0RIGHT.png");
	int Kabee0 = LoadGraph("Image/Map/Kagu/Kabee0.png");

	MapdataSelect[0].Chip[1] = CaffeYuka;
	MapdataSelect[0].Chip[2] = CaffeEXIT;
	MapdataSelect[0].Chip[6] = CaffeKabe1LEFT;
	MapdataSelect[0].Chip[7] = CaffeKabe1RIGHT;
	MapdataSelect[0].Chip[8] = CaffeKabe2LEFT;
	MapdataSelect[0].Chip[9] = CaffeKabe2RIGHT;

	MapdataSelect[0].Kagu[1] = Syokubutu0;
	MapdataSelect[0].Kagu[2] = Syokubutu0;
	MapdataSelect[0].Kagu[3] = Table0;
	MapdataSelect[0].Kagu[4] = Table0;
	MapdataSelect[0].Kagu[5] = Table0;
	MapdataSelect[0].Kagu[6] = Isu0LEFT;
	MapdataSelect[0].Kagu[7] = Isu0LEFT;
	MapdataSelect[0].Kagu[8] = Isu0LEFT;
	MapdataSelect[0].Kagu[9] = Isu0RIGHT;
	MapdataSelect[0].Kagu[10] = Isu0RIGHT;
	MapdataSelect[0].Kagu[11] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[12] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[13] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[14] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[15] = Counter0LEFT;
	MapdataSelect[0].Kagu[16] = Counter0CENTER;
	MapdataSelect[0].Kagu[17] = Counter0RIGHT;
	MapdataSelect[0].Kagu[18] = Kabee0;

}


void FMAP_Object(FPlayer_t FPlayer){//オブジェクト構造体に物体の座標を代入

	ObjectData[1].Img = MapData.Kagu[1];
	ObjectData[2].Img = MapData.Kagu[2];
	ObjectData[3].Img = MapData.Kagu[3];
	ObjectData[4].Img = MapData.Kagu[4];
	ObjectData[5].Img = MapData.Kagu[5];
	ObjectData[6].Img = MapData.Kagu[6];
	ObjectData[7].Img = MapData.Kagu[7];
	ObjectData[8].Img = MapData.Kagu[8];
	ObjectData[9].Img = MapData.Kagu[9];
	ObjectData[10].Img = MapData.Kagu[10];
	ObjectData[11].Img = MapData.Kagu[11];
	ObjectData[12].Img = MapData.Kagu[12];
	ObjectData[13].Img = MapData.Kagu[13];
	ObjectData[14].Img = MapData.Kagu[14];
	ObjectData[15].Img = MapData.Kagu[15];
	ObjectData[16].Img = MapData.Kagu[16];
	ObjectData[17].Img = MapData.Kagu[17];
	ObjectData[18].Img = MapData.Kagu[18];

	//家具用マップデータから置くXY座標を計算
	int x,y;
	for(y=0;y<MapData.height;++y) 
	{
		for(x=0;x<MapData.width;++x)
		{
			if(IramudukiKAGU[y][x]!=0 ){
				ObjectData[(IramudukiKAGU[y][x])].DrawX = 24*12+((12-y)*(48/2)+(x*24)-24);
				ObjectData[(IramudukiKAGU[y][x])].DrawY = 12*12+((x+y)*12);
			}
		}
	}
	ObjectData[0].Img = FPlayer.Image;
	ObjectData[0].DrawX = (int)FPlayer.X;
	ObjectData[0].DrawY = (int)FPlayer.Y;
}

//オブジェクトのY座標比較関数
int int_cmp(const ObjectData_t **a, const ObjectData_t **b)
{
    if ((*a)->DrawY < (*b)->DrawY)
        return (-1);
    else if ((*a)->DrawY > (*b)->DrawY)
        return (1);
    return (0);
}

void FMap_Draw(FPlayer_t FPlayer)//マップ描画
{


	int x,y;

	for(y=0;y<MapData.height;++y) //マップを描画
	{
		for(x=0;x<MapData.width;++x)
		{
			if(IramudukiMAP[y][x]!=0){
				DrawRotaGraph(24*12+((12-y)*(48/2)+(x*24)-24-CameraX),12*12+((x+y)*12-CameraY), 1.0,  0.0, MapData.Chip[(IramudukiMAP[y][x])], TRUE );
			}
		}
	}
	
	if(ZahyouTest==1)
		for(y=0;y<MapData.height+1;++y) //マップを描画
		{
			for(x=0;x<MapData.width+1;++x)
			{
				if(IramudukiHit[y][x]!=0){
					DrawRotaGraph(48*x,48*y, 1.0,  0.0, TestChip, TRUE );
				}
			}
		}

	if(ZahyouTest==1)
		DrawRotaGraph((int)FPlayer.HitX,(int)FPlayer.HitY, 1.0,  0.0,TestPlayer, TRUE );

	//物体を奥から描画するように並び替えて描画する
	    int  i;
    ObjectData_t *SortArray[19] = { &ObjectData[0], &ObjectData[1], &ObjectData[2], &ObjectData[3], &ObjectData[4], &ObjectData[5],
	 &ObjectData[6], &ObjectData[7], &ObjectData[8], &ObjectData[9], &ObjectData[10], &ObjectData[11], &ObjectData[12],
	 &ObjectData[13], &ObjectData[14], &ObjectData[15], &ObjectData[16], &ObjectData[17], &ObjectData[18]};
    int  nx = sizeof(SortArray) / sizeof(SortArray[0]);     // 配列の要素数
 
    qsort(SortArray, nx, sizeof(ObjectData_t*), (int(*)(const void*, const void*))int_cmp);//ソートする
 
    for (i = 0; i < nx; i++)
		DrawRotaGraph(SortArray[i]->DrawX-CameraX,SortArray[i]->DrawY-CameraY, 1.0,  0.0, SortArray[i]->Img, TRUE );

}

void FMap_Scroll( FPlayer_t *FPlayer)//マップスクロール
{
	CameraX = (int)FPlayer->X - SCREEN_WIDTH/2 ;
	//ステージのスクロール
	if(CameraX < 0)CameraX = 0;
	if(CameraX > (MapData.width*2*48)-SCREEN_WIDTH) CameraX = (MapData.width*2*48)-SCREEN_WIDTH;

	FPlayer->ViewX = (int)FPlayer->X - CameraX;

	CameraY = (int)FPlayer->Y - SCREEN_HEIGHT/2 ;
	//ステージのスクロール
	if(CameraY < 0)CameraY = 0;
	if(CameraY > (MapData.height*2*12)-MapData.height) CameraY = (MapData.height*2*12)-MapData.height;

	FPlayer->ViewY = (int)FPlayer->Y - CameraY;
}

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 20:06
by box
関数の実行順は、FMap_Initialize() が先で、その直後に FMAP_Object() ですか?だとすると、
Chalaza さんが書きました:

コード:

void FMap_Initialize()//フィールドマップ初期化
{
	MapData = MapdataSelect[0];	//マップデータを最初のマップに設定
ここで MapData に MapdataSelect[0] の内容を代入した後、
Chalaza さんが書きました:

コード:

	MapdataSelect[0].Chip[1] = CaffeYuka;
	MapdataSelect[0].Chip[2] = CaffeEXIT;
	MapdataSelect[0].Chip[6] = CaffeKabe1LEFT;
	...
	(略)
ここで MapdataSelect[0] の各メンバーの内容を書き換えていますね。
この時点で、MapData の内容と MapdataSelect[0] の内容とは別々になっています。ということは、
Chalaza さんが書きました:

コード:

void FMAP_Object(FPlayer_t FPlayer){//オブジェクト構造体に物体の座標を代入

	ObjectData[1].Img = MapData.Kagu[1];
	ObjectData[2].Img = MapData.Kagu[2];
	ObjectData[3].Img = MapData.Kagu[3];
	...
	(略)
ここで ObjectData[] に代入している内容は、書き換える「前の」 MapdataSelect[0] の内容です。
これは質問者さんの意図と合致していますか?

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 20:30
by Chalaza
すみません。MapData = MapdataSelect[0];は初期化の最後に書かなければいけなかったようですね…。
Initializeの最後にMapdataSelect[0]を代入するだけで、
うまく書き変えた後のMapdataを参照して画像を表示することができました。ありがとうございます。

続けて質問して申し訳ありませんが、画像がうまく表示できたので、ここからマップデータ配列を構造体の中に入れたいのですが、
どうも上手くいかないところなのです。
構造体の中の『stage』に、現在のマップデータの情報を入れたいのですが、マップデータが
MAP1[MAP_HEIGHT][MAP_WIDTH]というような2次元配列なのです。
この場合、構造体のstageも2次元配列にしてしまえばよいかと考えたのですが、
構造体の中に2次元配列を入れるような方法でマップデータを参照できるのでしょうか?

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 21:12
by box
構造体のメンバーには、任意の型を指定できます。

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 21:39
by softya(ソフト屋)
レイヤー構造のあるマップをこれ以上手作りで作るのは無理があると思います。
DXライブラリで作る自作マップエディタを考えられてはどうでしょうか?

あと配列への代入でループを使えば済むような所とか、ファイル名テーブルを使えば楽になるような所で命令で書いていることが見受けられますが整理されてはどうでしょう。

>構造体の中に2次元配列を入れるような方法でマップデータを参照できるのでしょうか?

今ある配列をポインタ参照にしてしまえば構造体や初期化を大きく書き換えずに済みますよ。
それと2次元配列だと可変サイズにできないので1次元配列しないと複数のサイズのマップに対応できません。

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 23:35
by Chalaza
自作マップエディタのことは早めに考えてみることにします。

配列をポインタ参照にすることができました。ステージを1次元配列にして、
#define MAP_CHIP(y,x) (MapData.Map[(y)*(MapData.Width)+(x)])
というステージ参照マクロを使ってFMap.cpp(フィールドマップ)の方は完成したのですが、
プレイヤーのマップとの当たり判定は、FPlayer.cppというプレイヤーファイルで計算しています。
そこで、ヘッダファイルFPlayer.hに、

コード:

//マップデータの構造体をextern
typedef struct {   
    int *Map;
	int *Kagumap;
	int *Hitmap;
    int Width; 
    int Height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

extern MapData_t MapData;

//参照マクロをextern
#define HITMAP_CHIP(y,x) (MapData.Hitmap[(y)*(MapData.Width)+(x)]) extern
これを記入して構造体と参照マクロをexternしてみました。
それをFPlayer.cppで使いたかったのですが、

コード:

 
	//エラー↓
		if(HITMAP_CHIP(((int)FPlayer->HitY+31)/48,((int)FPlayer->HitX+16)/48)!=0	//計算座標下移動の補正
			&&HITMAP_CHIP(((int)FPlayer->HitY+31)/48,((int)FPlayer->HitX+31)/48)!=0)
		{
			FPlayer->HitY = (FPlayer->HitY/48)*48 -1;
		}
このようにexternした参照マクロを使って当たり判定を計算しようとするとエラーがでてしまいます。
#defineはexternしてよかったんでしょうか?

FMap.cpp

コード:

#include "DxLib.h"
#include "FPlayer.h"
#include "FMap.h"

// 物体構造体の実体
static ObjectData_t ObjectData[20];

//MAP共通
#define SCREEN_WIDTH 512
#define SCREEN_HEIGHT 384
#define CHIP_SIZE 48
int CameraX,CameraY;

int ZahyouTest = 0;

int TestChip;
int TestPlayer;

//マップ1
#define Iramuduki_HEIGHT 11
#define Iramuduki_WIDTH 11

int IramudukiMAP[Iramuduki_HEIGHT * Iramuduki_WIDTH] = //壁と床用マップデータ
{

                    0,9,9,9,9,9,9,9,9,0,0,
                   8,0,7,7,7,7,7,7,7,7,0,
                  8,6,1,1,1,1,1,1,1,1,0,
                 8,6,1,1,1,1,1,1,1,1,0,
                8,6,1,1,1,1,1,1,1,1,0,
               8,6,1,1,1,1,1,1,1,1,2,
              8,6,1,1,1,1,1,1,1,1,2,
             8,6,1,1,1,1,1,1,1,1,0,
		    8,6,1,1,1,1,1,1,1,1,0,
	       0,6,1,1,1,1,1,1,1,1,0,
		  0,0,0,0,0,0,0,0,0,0,0,

};

int IramudukiKAGU[Iramuduki_HEIGHT * Iramuduki_WIDTH] = //家具用マップデータ
{

                     0, 0, 0, 0, 0,18, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                   0, 0, 0,17, 0, 0, 6, 0, 0, 0, 0,
                  0, 0, 0,16, 0, 9, 3,12, 0, 0, 0,
                 0, 0, 0,15, 0, 0, 0, 0, 0, 1, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
               0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 0,
              0, 0, 0, 0, 5, 0,10, 4, 0, 2, 0,
             0, 0, 0, 0,14, 0, 0,13, 0,11, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

int IramudukiHit[Iramuduki_HEIGHT * Iramuduki_WIDTH] = //家具用マップデータ
{

                     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                   1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1,
                  1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1,
                 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1,
                1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
               1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0,
              1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1,
             1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1,
            1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
	       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};

    //  ステージ参照マクロ
#define MAP_CHIP(y,x) (MapData.Map[(y)*(MapData.Width)+(x)])
#define KAGUMAP_CHIP(y,x) (MapData.Kagumap[(y)*(MapData.Width)+(x)])
#define HITMAP_CHIP(y,x) (MapData.Hitmap[(y)*(MapData.Width)+(x)])

//マップデータの構造体
typedef struct {   
    int *Map;
	int *Kagumap;
	int *Hitmap;
    int Width; 
    int Height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

//マップデータセレクトを定義
MapData_t MapdataSelect[2] = {{ IramudukiMAP, IramudukiKAGU, IramudukiHit, Iramuduki_WIDTH, Iramuduki_HEIGHT,{0}, {0}},
						{ 0, 0, 0, 0, 0, 0, 0, 0}};

MapData_t MapData = MapdataSelect[0];	//マップデータを初期化

void FMap_Initialize()//フィールドマップ初期化
{

	TestChip = LoadGraph("Image/Map/test1.png");
	TestPlayer = LoadGraph("Image/Map/test2.png");
	//画像
	int CaffeYuka = LoadGraph("Image/Map/Yuka/Carpet4.png");
	int CaffeEXIT = LoadGraph("Image/Map/Yuka/CaffeEXIT.png");
	int CaffeKabe1LEFT = LoadGraph("Image/Map/Kabe/Caffe1LEFT.png");
	int CaffeKabe1RIGHT = LoadGraph("Image/Map/Kabe/Caffe1RIGHT.png");
	int CaffeKabe2LEFT = LoadGraph("Image/Map/Kabe/Caffe2LEFT.png");
	int CaffeKabe2RIGHT = LoadGraph("Image/Map/Kabe/Caffe2RIGHT.png");

	int Syokubutu0 = LoadGraph("Image/Map/Kagu/Syokubutu0.png");
	int Table0 = LoadGraph("Image/Map/Kagu/Table0.png");
	int Isu0LEFT = LoadGraph("Image/Map/Kagu/Isu0LEFT.png");
	int Isu0RIGHT = LoadGraph("Image/Map/Kagu/Isu0RIGHT.png");
	int Isu0LEFTOKU = LoadGraph("Image/Map/Kagu/Isu0LEFTOKU.png");
	int Isu0RIGHTOKU = LoadGraph("Image/Map/Kagu/Isu0RIGHTOKU.png");
	int Counter0LEFT = LoadGraph("Image/Map/Kagu/Counter0LEFT.png");
	int Counter0CENTER = LoadGraph("Image/Map/Kagu/Counter0CENTER.png");
	int Counter0RIGHT = LoadGraph("Image/Map/Kagu/Counter0RIGHT.png");
	int Kabee0 = LoadGraph("Image/Map/Kagu/Kabee0.png");

	MapdataSelect[0].Chip[1] = CaffeYuka;
	MapdataSelect[0].Chip[2] = CaffeEXIT;
	MapdataSelect[0].Chip[6] = CaffeKabe1LEFT;
	MapdataSelect[0].Chip[7] = CaffeKabe1RIGHT;
	MapdataSelect[0].Chip[8] = CaffeKabe2LEFT;
	MapdataSelect[0].Chip[9] = CaffeKabe2RIGHT;

	MapdataSelect[0].Kagu[1] = Syokubutu0;
	MapdataSelect[0].Kagu[2] = Syokubutu0;
	MapdataSelect[0].Kagu[3] = Table0;
	MapdataSelect[0].Kagu[4] = Table0;
	MapdataSelect[0].Kagu[5] = Table0;
	MapdataSelect[0].Kagu[6] = Isu0LEFT;
	MapdataSelect[0].Kagu[7] = Isu0LEFT;
	MapdataSelect[0].Kagu[8] = Isu0LEFT;
	MapdataSelect[0].Kagu[9] = Isu0RIGHT;
	MapdataSelect[0].Kagu[10] = Isu0RIGHT;
	MapdataSelect[0].Kagu[11] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[12] = Isu0LEFTOKU;
	MapdataSelect[0].Kagu[13] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[14] = Isu0RIGHTOKU;
	MapdataSelect[0].Kagu[15] = Counter0LEFT;
	MapdataSelect[0].Kagu[16] = Counter0CENTER;
	MapdataSelect[0].Kagu[17] = Counter0RIGHT;
	MapdataSelect[0].Kagu[18] = Kabee0;

	MapData = MapdataSelect[0];	//マップデータを最初のマップに設定
}


void FMAP_Object(FPlayer_t FPlayer){//オブジェクト構造体に物体の座標を代入

	ObjectData[1].Img = MapData.Kagu[1];
	ObjectData[2].Img = MapData.Kagu[2];
	ObjectData[3].Img = MapData.Kagu[3];
	ObjectData[4].Img = MapData.Kagu[4];
	ObjectData[5].Img = MapData.Kagu[5];
	ObjectData[6].Img = MapData.Kagu[6];
	ObjectData[7].Img = MapData.Kagu[7];
	ObjectData[8].Img = MapData.Kagu[8];
	ObjectData[9].Img = MapData.Kagu[9];
	ObjectData[10].Img = MapData.Kagu[10];
	ObjectData[11].Img = MapData.Kagu[11];
	ObjectData[12].Img = MapData.Kagu[12];
	ObjectData[13].Img = MapData.Kagu[13];
	ObjectData[14].Img = MapData.Kagu[14];
	ObjectData[15].Img = MapData.Kagu[15];
	ObjectData[16].Img = MapData.Kagu[16];
	ObjectData[17].Img = MapData.Kagu[17];
	ObjectData[18].Img = MapData.Kagu[18];

	//家具用マップデータから置くXY座標を計算
	int x,y;
	for(y=0;y<MapData.Height;++y) 
	{
		for(x=0;x<MapData.Width;++x)
		{
			if( KAGUMAP_CHIP(y,x) != 0 ){
				ObjectData[KAGUMAP_CHIP(y,x)].DrawX = 24*12+((12-y)*(48/2)+(x*24)-24);
				ObjectData[KAGUMAP_CHIP(y,x)].DrawY = 12*12+((x+y)*12);
			}
		}
	}
	ObjectData[0].Img = FPlayer.Image;
	ObjectData[0].DrawX = (int)FPlayer.X;
	ObjectData[0].DrawY = (int)FPlayer.Y;
}

//オブジェクトのY座標比較関数
int int_cmp(const ObjectData_t **a, const ObjectData_t **b)
{
    if ((*a)->DrawY < (*b)->DrawY)
        return (-1);
    else if ((*a)->DrawY > (*b)->DrawY)
        return (1);
    return (0);
}

void FMap_Draw(FPlayer_t FPlayer)//マップ描画
{


	int x,y;

	for(y=0;y<MapData.Height;++y) //マップを描画
	{
		for(x=0;x<MapData.Width;++x)
		{
			if( MAP_CHIP(y,x) != 0 ){
				DrawRotaGraph(24*12+((12-y)*(48/2)+(x*24)-24-CameraX),12*12+((x+y)*12-CameraY), 1.0,  0.0, MapData.Chip[(MAP_CHIP(y,x))], TRUE );
			}
		}
	}
	
	if(ZahyouTest==1)
		for(y=0;y<MapData.Height;++y) //マップを描画
		{
			for(x=0;x<MapData.Width;++x)
			{
				if( HITMAP_CHIP(y,x) != 0 ){
					DrawRotaGraph(48*x,48*y, 1.0,  0.0, TestChip, TRUE );
				}
			}
		}

	if(ZahyouTest==1)
		DrawRotaGraph((int)FPlayer.HitX,(int)FPlayer.HitY, 1.0,  0.0,TestPlayer, TRUE );

	//物体を奥から描画するように並び替えて描画する
	    int  i;
    ObjectData_t *SortArray[19] = { &ObjectData[0], &ObjectData[1], &ObjectData[2], &ObjectData[3], &ObjectData[4], &ObjectData[5],
	 &ObjectData[6], &ObjectData[7], &ObjectData[8], &ObjectData[9], &ObjectData[10], &ObjectData[11], &ObjectData[12],
	 &ObjectData[13], &ObjectData[14], &ObjectData[15], &ObjectData[16], &ObjectData[17], &ObjectData[18]};
    int  nx = sizeof(SortArray) / sizeof(SortArray[0]);     // 配列の要素数
 
    qsort(SortArray, nx, sizeof(ObjectData_t*), (int(*)(const void*, const void*))int_cmp);//ソートする
 
    for (i = 0; i < nx; i++)
		DrawRotaGraph(SortArray[i]->DrawX-CameraX,SortArray[i]->DrawY-CameraY, 1.0,  0.0, SortArray[i]->Img, TRUE );

}

void FMap_Scroll( FPlayer_t *FPlayer)//マップスクロール
{
	CameraX = (int)FPlayer->X - SCREEN_WIDTH/2 ;
	//ステージのスクロール
	if(CameraX < 0)CameraX = 0;
	if(CameraX > (MapData.Width*2*48)-SCREEN_WIDTH) CameraX = (MapData.Width*2*48)-SCREEN_WIDTH;

	FPlayer->ViewX = (int)FPlayer->X - CameraX;

	CameraY = (int)FPlayer->Y - SCREEN_HEIGHT/2 ;
	//ステージのスクロール
	if(CameraY < 0)CameraY = 0;
	if(CameraY > (MapData.Height*2*12)-MapData.Height) CameraY = (MapData.Height*2*12)-MapData.Height;

	FPlayer->ViewY = (int)FPlayer->Y - CameraY;
}


FPlayer.h

コード:

#include "Keyboard.h"

#ifndef DEF_FPLAYER_H //二重include防止

#define DEF_FPLAYER_H

typedef struct{
        int Image;
        double X, Y;
		int ViewX,ViewY;
		int Walk,Muki;
		double HitX,HitY;
} FPlayer_t;

//マップデータの構造体をextern
typedef struct {   
    int *Map;
	int *Kagumap;
	int *Hitmap;
    int Width; 
    int Height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

extern MapData_t MapData;

//参照マクロをextern
#define HITMAP_CHIP(y,x) (MapData.Hitmap[(y)*(MapData.Width)+(x)]) extern


// 初期化をする
void FPlayer_Initialize( FPlayer_t *FPlayer );

// 動きを計算する
void FPlayer_Calc( FPlayer_t *FPlayer , InputCount_t *InputCount);


// 終了処理をする
void FPlayer_Finalize( FPlayer_t FPlayer );

#endif 

FPlayer.cpp

コード:

#include "DxLib.h"
#include <math.h>
#include "Keyboard.h"
#include "FPlayer.h"
#include "FMap.h"

int FPlayerImage[32];
int WalkCount;
extern int IramudukiHit[11][11];

// 初期化をする
void FPlayer_Initialize( FPlayer_t *FPlayer){
	LoadDivGraph( "Image/Chara/Player1.png" , 32 , 4 , 8 , 48 , 48 , FPlayerImage );//画像の分割読み込み
	FPlayer->Image = FPlayerImage[4];	//プレイヤーの最初の画像
	FPlayer->X     = 552;	//初期X
	FPlayer->Y     = 262;	//初期Y
	FPlayer->HitX  = 48*5;
	FPlayer->HitY  = 48*5;
	FPlayer->Walk=0;	//歩いていない
	FPlayer->Muki=4;	//向きが下
	WalkCount=0;	//歩きカウント0
}

// 動きを計算する
void FPlayer_Calc( FPlayer_t *FPlayer , InputCount_t *InputCount ){
	double sqrt( double x );

	//ここでエラー↓
		if(HITMAP_CHIP(((int)FPlayer->HitY+31)/48,((int)FPlayer->HitX+16)/48)!=0	//計算座標下移動の補正
			&&HITMAP_CHIP(((int)FPlayer->HitY+31)/48,((int)FPlayer->HitX+31)/48)!=0)
		{
			FPlayer->HitY = (FPlayer->HitY/48)*48 -1;
		}
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+16)/48]!=0 //計算座標上移動の補正
			&&IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+31)/48]!=0)
		{
			FPlayer->HitY = (FPlayer->HitY/48)*48 +1;
		}
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+16)/48]!=0 //計算座標左移動の補正
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+16)/48]!=0)
		{
			FPlayer->HitX = (FPlayer->HitX/48)*48 +1;
		}
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+31)/48]!=0	//計算座標右移動の補正
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+31)/48]!=0)
		{
			FPlayer->HitX = (FPlayer->HitX/48)*48 -1;
		}

	if( InputCount->UP > 0 && InputCount->RIGHT > 0 ){	//右上に歩く
		FPlayer->Muki=1;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+16];
		if(IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+16)/48]==0 //キャラの右上に障害物
			&&IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+31)/48]==0){//キャラの左上に障害物
				FPlayer->HitY -= 4;
		}
	}else if( InputCount->UP > 0 && InputCount->LEFT > 0 ){	//左上に歩く
		FPlayer->Muki=7;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+20];
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+15)/48]==0 //キャラの左上に障害物
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+15)/48]==0){	//キャラの左下に障害物
				FPlayer->HitX -= 4;
		}
	}else if( InputCount->DOWN > 0 && InputCount->RIGHT > 0	){	//右下に歩く
		FPlayer->Muki=3;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+24];
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+32)/48]==0	//キャラの右上に障害物
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+32)/48]==0){	//キャラの右下に障害物
				FPlayer->HitX += 4;
		}
	}else if( InputCount->DOWN > 0 && InputCount->LEFT > 0 ){	//左下に歩く
		FPlayer->Muki=5;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+28];	
		if(IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+16)/48]==0	//キャラの左下に障害物
			&&IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+31)/48]==0){//キャラの右下に障害物
				FPlayer->HitY += 4;
		}
	}else if( InputCount->UP > 0 && InputCount->RIGHT == 0 && InputCount->LEFT == 0){//上を押している間
		FPlayer->Muki=0;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8];
		if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+15)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+16)/48]==0){
			FPlayer->HitY-=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+16)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+15)/48]==0){
			FPlayer->HitX-=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+16)/48]==0
			&&IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+15)/48]==0){
			FPlayer->HitY-=2;	//計算座標
			FPlayer->HitX-=2;	//計算座標
		}
		
	}else if( InputCount->DOWN > 0 && InputCount->RIGHT == 0 && InputCount->LEFT == 0){	//下を押している間 
		FPlayer->Muki=4;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+4];
		if(IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+32)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+31)/48]==0){
			FPlayer->HitY+=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+31)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+32)/48]==0){
			FPlayer->HitX+=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+31)/48]==0
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+32)/48]==0){
			FPlayer->HitY+=2;	//計算座標
			FPlayer->HitX+=2;	//計算座標
		}
	}else if( InputCount->RIGHT > 0 && InputCount->UP == 0 && InputCount->DOWN == 0){	//右を押している間
		FPlayer->Muki=2;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+8];
		if(IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+31)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+32)/48]==0){
			FPlayer->HitX+=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+32)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+31)/48]==0){
			FPlayer->HitY-=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+16)/48][((int)FPlayer->HitX+32)/48]==0
			&&IramudukiHit[((int)FPlayer->HitY+15)/48][((int)FPlayer->HitX+31)/48]==0){
			FPlayer->HitY-=2;	//計算座標
			FPlayer->HitX+=2;	//計算座標
		}
	}else if( InputCount->LEFT > 0 && InputCount->UP == 0 && InputCount->DOWN == 0){	//左を押している間
		FPlayer->Muki=6;
		WalkCount++;
		FPlayer->Image = FPlayerImage[(WalkCount%32)/8+12];
		if(IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+15)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+16)/48]==0){
			FPlayer->HitY+=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+16)/48]!=0
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+15)/48]==0){
			FPlayer->HitX-=2;	//計算座標
		}
		else if(IramudukiHit[((int)FPlayer->HitY+32)/48][((int)FPlayer->HitX+16)/48]==0
			&&IramudukiHit[((int)FPlayer->HitY+31)/48][((int)FPlayer->HitX+15)/48]==0){
			FPlayer->HitY+=2;	//計算座標
			FPlayer->HitX-=2;	//計算座標
		}
	}else if(FPlayer->Muki==0){
		FPlayer->Image = FPlayerImage[0];
		WalkCount=0;
	}else if(FPlayer->Muki==1){
		FPlayer->Image = FPlayerImage[16];
		WalkCount=0;
	}else if(FPlayer->Muki==2){
		FPlayer->Image = FPlayerImage[8];
		WalkCount=0;
	}else if(FPlayer->Muki==3){
		FPlayer->Image = FPlayerImage[24];
		WalkCount=0;
	}else if(FPlayer->Muki==4){
		FPlayer->Image = FPlayerImage[4];
		WalkCount=0;
	}else if(FPlayer->Muki==5){
		FPlayer->Image = FPlayerImage[28];
		WalkCount=0;
	}else if(FPlayer->Muki==6){
		FPlayer->Image = FPlayerImage[12];
		WalkCount=0;
	}else if(FPlayer->Muki==7){
		FPlayer->Image = FPlayerImage[20];
		WalkCount=0;
	}
	


	FPlayer->X= 24*12+((12-(FPlayer->HitY)/48)*(48/2)+((FPlayer->HitX)/48*24)-24);
	FPlayer->Y= 12*12+(((FPlayer->HitX)/48+(FPlayer->HitY)/48)*12);
}


// 終了処理をする
void FPlayer_Finalize( FPlayer_t FPlayer ){
        DeleteGraph( FPlayer.Image );
} 



長くてすみません。いらないところは割愛したほうがよかったかもしれません…

Re: 構造体に構造体を代入

Posted: 2011年10月30日(日) 23:40
by box
if文の中にexternは登場しないでしょう、ふつう。

Re: 構造体に構造体を代入

Posted: 2011年10月31日(月) 00:14
by softya(ソフト屋)
マクロはexternする必要はありません。
externするのは他のcppにあるグローバル変数を参照宣言したい時だけです。

Re: 構造体に構造体を代入

Posted: 2011年10月31日(月) 17:11
by Chalaza
マクロはexternをはずすことでエラーはなくなりました。ありがとうございます。

構造体のexternについてなのですが、定義された構造体は
extern MapData_t MapData;でうまく使えるようになったのですが、
構造体の中のデータの宣言が、FMap.cppで行われていて、それをFPlayer.cppで使いたい場合、
構造体のデータ宣言もFPlayer.hでexternのようなことをする必要があるのでしょうか?
それともデータ宣言はヘッダファイルに書けということでしょうか?

このままだとFMap.cppと宣言と重なってMapData_tが再定義になってしまいます。
FPlayer.h

コード:

#include "Keyboard.h"

#ifndef DEF_FPLAYER_H //二重include防止

#define DEF_FPLAYER_H

typedef struct{
        int Image;
        double X, Y;
		int ViewX,ViewY;
		int Walk,Muki;
		double HitX,HitY;
} FPlayer_t;

//マップデータ宣言(再定義エラー)
typedef struct {   
    int *Map;
	int *Kagumap;
	int *Hitmap;
    int Width; 
    int Height;
	int Chip[10];
	int Kagu[20];
} MapData_t;

//マップデータの構造体をextern
extern MapData_t MapData;


// 初期化をする
void FPlayer_Initialize( FPlayer_t *FPlayer );

// 動きを計算する
void FPlayer_Calc( FPlayer_t *FPlayer , InputCount_t *InputCount);


// 終了処理をする
void FPlayer_Finalize( FPlayer_t FPlayer );

#endif 


Re: 構造体に構造体を代入

Posted: 2011年10月31日(月) 18:12
by softya(ソフト屋)
構造体のexternについてなのですが、定義された構造体は
extern MapData_t MapData;でうまく使えるようになったのですが、
構造体の中のデータの宣言が、FMap.cppで行われていて、それをFPlayer.cppで使いたい場合、
構造体のデータ宣言もFPlayer.hでexternのようなことをする必要があるのでしょうか?
それともデータ宣言はヘッダファイルに書けということでしょうか?

このままだとFMap.cppと宣言と重なってMapData_tが再定義になってしまいます。
宣言と定義がごっちゃになっているようです。
宣言: typedefやstructやenumなど、それと関数のプロトタイプ宣言や変数のexternなど。共有するものはヘッダに書く。これ自体はメモリ確保しない。
定義: 実際に変数の実体をメモリ上に確保するもの。基本的にヘッダには書かない。グローバルな変数の定義は、どこか一箇所のcppで行う。

●externの変数宣言。他のcppに変数の実体があることを宣言
extern MapData_t MapData; 

●typedefやstruct宣言。変数の型や構造体の構造を宣言する。同じ名前の宣言は基本的エラー。
typedef struct { 略 } MapData_t;
typedef struct{ 略 } FPlayer_t;

Re: 構造体に構造体を代入

Posted: 2011年10月31日(月) 21:08
by Chalaza
マップデータの宣言はヘッダファイルに書くものだったんですね。
cppで宣言していたのをヘッダファイルに移して、ヘッダファイルをincludeするだけで問題なく動くようになりました。
定義はcppに書いて、他でexternすれば良かったのですね。
ありがとうございました。
これで解決です。