ご指導お願いします

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

ご指導お願いします

#1

投稿記事 by ゆきなす » 8年前

龍神録プログラミングの館を終えて、今度はグローバル変数を使わずにしようと思いゲームプログラミングの館d.3のC++版のプログラムを改変してプレイヤーのY座標を取得(GetPosY)し、それと同じ位置に別の画像を表示するプログラムに変えてみたのですがどうも座標の取得ができてない様です。
どこかおかしいところがあるのでしょうか?宜しくお願いします

コード:

#include "Player.h"
//Player.Pgm

// 初期化をする
void CPlayer::Initialize()
{
	m_Image = LoadGraph("画像/キャラクタ01.png");
	m_x = 320;
	m_y = 0;
}

// 動きを計算する
void CPlayer::Calc()
{
	DrawFormatString(0, 0, GetColor(255, 255, 255), "PLAYER_Y:%f", m_y);
	m_y++;
	DrawGraph( m_x, m_y, m_Image, TRUE );
}

// 終了処理をする
void CPlayer::Finalize(){
	DeleteGraph( m_Image );
}

float CPlayer::GetPosX()
{
	return m_x;
}

float CPlayer::GetPosY()
{
	return m_y;
}

コード:

#include "EnemyObject.h"
//Enemy.Pgm

// 初期化をする
void CEnemy::Initialize()
{
	player = new CPlayer();
	m_Image = LoadGraph("Enemy2.png");
	m_Ex = 0;
	m_Ey = 0;
}

// 動きを計算する
void CEnemy::Calc()
{
	m_Ey = player->GetPosY();
	DrawGraph(m_Ex, m_Ey, m_Image, TRUE );
	DrawFormatString(0, 20, GetColor(255, 255, 255), "ENEMY_Y:%f", m_Ey);
}

// 終了処理をする
void CEnemy::Finalize()
{
	DeleteGraph( m_Image );
	DELETENORMAL(player);//解放処理
}

アバター
MNS
記事: 35
登録日時: 9年前

Re: ご指導お願いします

#2

投稿記事 by MNS » 8年前

座標の取得ができていない、というわけではなく、そもそも座標が設定されていないということはありませんか?
たとえばCEnemyからプレイヤーの座標を取得する際に使用しているのは、
CEnemyのplayerというメンバ変数ですが、これはCEnemyのInitializeでnewされて以降、
初期化もCalcも何もされていないようです、これではY座標は永遠に0のままです。

そもそも、CEnemyでCPlayerをnewするという設計は正しいのでしょうか?

ゆきなす

Re: ご指導お願いします

#3

投稿記事 by ゆきなす » 8年前

こうすることで想定していた動きにはなったのですが、本当にこれでいいのか疑問に思っています。
とりあえず今動けばいいは後で大変なことになりそうなので…

---Player.Pgm変更なし---

コード:

#include "EnemyObject.h"
//Enemy.Pgm

// 初期化をする
void CEnemy::Initialize()
{
	//player.Initialize();
	m_Image = LoadGraph("Enemy2.png");
	m_Ex = 0;
	m_Ey = 0;
}

// 動きを計算する
void CEnemy::Calc()
{
	//player.Calc();//ここに置くと想定した動きになるけど何か違う気がするのでコメントアウト
	//m_Ey = player.GetPosY();
	DrawGraph(m_Ex, m_Ey, m_Image, TRUE );
}

// 終了処理をする
void CEnemy::Finalize()
{
	DeleteGraph( m_Image );
	//DELETENORMAL(player);//解放処理
}

float CEnemy::SetPos(float Pos)
{
	m_Ey = Pos;
	return m_Ey;
}

float CEnemy::GetPosX()
{
	return m_Ex;
}

float CEnemy::GetPosY()
{
	return m_Ey;
}

コード:

#include "GameMain.h"
//GameMain.Pgm

CGame::CGame()
{
	Player = new CPlayer();
	Enemy = new CEnemy();
}

CGame::~CGame()
{
	DELETENORMAL(Player);
	DELETENORMAL(Enemy);
}

void CGame::init()
{
	Player->Initialize();
	Enemy->Initialize();
}

void CGame::MainLoop()
{
	Player->Calc();
	Enemy->Calc();
	Enemy->SetPos(Player->GetPosY());
	DrawFormatString(0, 0, GetColor(255, 255, 255), "PLAYER_Y:%f", Player->GetPosY());
	DrawFormatString(0, 20, GetColor(255, 255, 255), "ENEMY_Y:%f", Enemy->GetPosY());
}

コード:

#include "WinMain.h"
#include "GameMain.h"
//WinMain.Pgm

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	CGame game;
	game.init();

	while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 )
	{
		game.MainLoop();
	}

	DxLib_End();
	return 0;
}

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ご指導お願いします

#4

投稿記事 by ISLe » 8年前

CEnemy::Calcではプレイヤー座標を元に移動先を決めているようですから、プレイヤー座標(インスタンスごとでも良いけど)を引数で渡してやれば良いのではないでしょうか。

ゆきなす

Re: ご指導お願いします

#5

投稿記事 by ゆきなす » 8年前

>>ISle様
このようにしても同じように動きました。

コード:

// 動きを計算する
//Enemy.Pgm

void CEnemy::Calc(float Enemy_PosY)
{
	//player.Calc();//ここに置くと想定した動きになるけど何か違う気がするのでコメントアウト
	m_Ey = Enemy_PosY;
	DrawGraph(m_Ex, m_Ey, m_Image, TRUE );
}

コード:

void CGame::MainLoop()
//GameMain.Pgm

{
	Player->Calc();
	Enemy->Calc(Player->GetPosY());
	//Enemy->SetPos(Player->GetPosY());
	DrawFormatString(0, 0, GetColor(255, 255, 255), "PLAYER_Y:%f", Player->GetPosY());
	DrawFormatString(0, 20, GetColor(255, 255, 255), "ENEMY_Y:%f", Enemy->GetPosY());
}

ゆきなす

Re: ご指導お願いします

#6

投稿記事 by ゆきなす » 8年前

うまく動くようになったので解決にします。
御相談に乗ってくれたお二人方、本当にありがとうございました!!

閉鎖

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