構造体の受け渡しについて

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

構造体の受け渡しについて

#1

投稿記事 by north » 5年前

閲覧していただきありがとうございます。
初歩的な質問なのですが、現在勉強の一環で3Dのマップをキャラが自由に動き回るというプログラムを作成しているのですが、
カメラの適切な座標を知りたいのでデバッグモードの1つとしてカメラの座標、注視点の座標を表示させ、
キーボードで動かせるようにしようとしているのですが、カメラの構造体を別のところに渡したいのですがどのように渡したらいいのかわかりません。
具体的にはカメラのクラス内になるカメラの座標等をもった構造体をmain.cppに渡したいのですが自分で書いたコードだと下記のエラー文が出てしまいます。

warning C4091: 'typedef ' : 変数が何も宣言されていないときは、'CAMERA_DATA' の左辺を無視します。
error C2079: 'CameraInfo' が 未定義の struct 'CAMERA_DATA' で使用しています。
error C3867: 'CCamera::GetCameraParam': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CCamera::GetCameraParam' を使用してください
error C2440: '=' : 'CCamera::CAMERA_DATA (__thiscall CCamera::* )(void)' から 'int' に変換できません。

また、コードは下記のとおりとなります
Camera.h

コード:

 
#ifndef CAMERAH
#define CAMERAH

#include "DxLib.h"

class CCamera
{
typedef struct 
{
	VECTOR Position;
	float WatchX;
	float WatchY;
	float WatchZ;
	float Anglex;
	float Angley;
	float Anglez;
	float spd1;
	float spd2;
	float spd3;
} CAMERA_DATA;
CAMERA_DATA tCameraData;
public:
	CCamera();
	~CCamera();
	void CameraSet(float PosX, float PosY, float PosZ, float WatchX, float WatchY, float WatchZ, float AngleX, float AngleY, float AngleZ);
	CAMERA_DATA GetCameraParam();
};
#endif


Camera.cpp

コード:

#include "Camera.h"
#define PI 3.141592654

CCamera::CCamera()
{
	memset(&tCameraData, 0, sizeof(tCameraData));
	tCameraData.Position.z = -285.0f;
	tCameraData.Angley = 1.0f;
}
//---------------------------------------------------------
CCamera::~CCamera()
{}

//---------------------------------------------------------
void CCamera::CameraSet(float PosX, float PosY, float PosZ, float WatchX, float WatchY, float WatchZ, float AngleX, float AngleY, float AngleZ)
{
	tCameraData.Position.x = PosX;
	tCameraData.Position.y = PosY;
	tCameraData.Position.z = PosZ;
	tCameraData.WatchX = WatchX;
	tCameraData.WatchY = WatchY;
	tCameraData.WatchZ = WatchZ;
	tCameraData.Anglex = AngleX;
	tCameraData.Angley = AngleY;
	tCameraData.Anglez = AngleZ;
	SetCameraPositionAndTargetAndUpVec(VGet(tCameraData.Position.x, tCameraData.Position.y, tCameraData.Position.z), 
		VGet(tCameraData.WatchX, tCameraData.WatchY, tCameraData.WatchZ), 
		VGet(tCameraData.Anglex, tCameraData.Angley, tCameraData.Anglez));
	SetCameraNearFar(1, 1000);
	SetupCamera_Perspective(PI/4);
}

CCamera::CAMERA_DATA CCamera::GetCameraParam()
{
	return tCameraData;
}
main.cpp

コード:

#include "DxLib.h"
#include "Input.h"
#include "Stage.h"
#include "Camera.h"
#include "PlayerModel.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

#define ISLAND (0)
#define MIKU (0)
#define BACK (1)
const int MaxStage = 2;
typedef struct CAMERA_DATA;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
		ChangeWindowMode(TRUE);
		SetGraphMode( 720 , 540 , 16 );	// 画面モードの設定
        DxLib_Init();   // DXライブラリ初期化処理
		CInput* input = new CInput();
		CStage* stage = new CStage();
		CCamera* camera = new CCamera();
		CPlayerModel* playermodel = new CPlayerModel();
		CAMERA_DATA CameraInfo;
		CameraInfo = camera->GetCameraParam;
		int Key[256];
		for(int ii = 0; ii < 256; ii++)
		{
			Key[ii] = 0;
		}
		Key[256] = input->CheckKey();
		
		SetDrawScreen( DX_SCREEN_BACK );	 // 描画先を裏画面にする
		while(ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0  && input->gpUpdateKey() == 0)
		{
			camera->CameraSet(0.0f, 0.0f,-150.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
			stage->LoadFiles(ISLAND,"Stage/batokin_island5.x");
			playermodel->LoadFile(MIKU, "PlayerModel/Miku/Miku.mv1");
			stage->SetStagePos(ISLAND, 0.0f, 0.0f, 0.0f);
			playermodel->SetPlayerPos(0.0f, 0.0f, 0.0f);
			stage->DrawStage(ISLAND);
			playermodel->DrawModel(MIKU);
			// 裏画面の内容を表画面に反映
			ScreenFlip() ;
		}
		stage->Unload(ISLAND);
		playermodel->Unload(MIKU);
		delete stage;
		delete playermodel;
        WaitKey();      // キー入力待ち
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}
初歩的な質問で申し訳ありませんがどうかよろしくお願い致します。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: 構造体の受け渡しについて

#2

投稿記事 by へにっくす » 5年前

main.cppの以下の部分

コード:

        CAMERA_DATA CameraInfo;
        CameraInfo = camera->GetCameraParam;
を以下のように書き換え。CCameraクラスの下にあるんだからCCamera::が必要。

コード:

        CCamera::CAMERA_DATA CameraInfo;
        CameraInfo = camera->GetCameraParam();
また、Camera.hの宣言をすべてpublicにしてください。
CCamera::CAMERA_DATAを外で使ってるんだから、公開(publicに)する必要があります。
(class CCamera {の直後にpublic:の一行を挿入ですね)
そうすればとりあえずはコンパイルが通ると思います。

(何かミスしてたらすみません)
written by へにっくす

north

Re: 構造体の受け渡しについて

#3

投稿記事 by north » 5年前

このような初歩的な質問に答えてくださりありがとうございます。
またお礼が遅くなってしまい大変申し訳ありませんでした。
無事にコンパイルが通りデバッグ機能が実装できそうです。
蛇足になってしまうのですが、カメラクラスの構造体をpublicにすることで勝手に構造体のメンバ変数にアクセスされたりすることはないでしょうか?
そこが気になってしまいprivateにしておりました。
もし、privateのままにするなら構造体の変数を返す関数を作成してそれを必要に応じて使用していくしかないですよね・・・・・・

アバター
usao
記事: 1598
登録日時: 7年前

Re: 構造体の受け渡しについて

#4

投稿記事 by usao » 5年前

構造体CAMERA_DATAの定義はpublicにし,
メンバ変数である tCameraData はprivate にすれば良いのではないでしょうか.

north

Re: 構造体の受け渡しについて

#5

投稿記事 by north » 5年前

ご回答してくださりありがとうございます。
構造体の型と変数をセットで考えてしまっておりました。
型がpublicでも変数がprivateならアクセスされる心配もありませんでしたね。
おかげさまで疑問点が解決したしました。
また疑問点やわからない部分が出てきた際はどうかよろしくお願い致します。

閉鎖

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