C言語Ⅱ⑧(2025/10/30)

EditArea::Draw()から記述。

編集エリアでの処理:
 ①背景の塗りつぶし(黒)
 ②スクロール用の矢印(上下左右)
 ③マップの表示エリア

Draw()内の処理を書いていく。
(EditArea.cpp)

void EditArea::Draw(void)
{
	//ここに描画処理を追加していく
	//背景の塗りつぶし
	DrawBox(0, 0, EDIT_AREA_WID, EDIT_AREA_HIG, GetColor(0, 0, 0), true);

	//上矢印描画
	DrawBox(UPPER_ARROW_SX, UPPER_ARROW_SY, UPPER_ARROW_SX + UPPER_ARROW_WID, UPPER_ARROW_SY + UPPER_ARROW_HIG, GetColor(200, 200, 200), true);

	//下矢印描画
	DrawBox(LOWER_ARROW_SX, LOWER_ARROW_SY, LOWER_ARROW_SX + LOWER_ARROW_WID, LOWER_ARROW_SY + LOWER_ARROW_HIG, GetColor(200, 200, 200), true);

	//左矢印描画
	DrawBox(LEFT_ARROW_SX, LEFT_ARROW_SY, LEFT_ARROW_SX + LEFT_ARROW_WID, LEFT_ARROW_SY + LEFT_ARROW_HIG, GetColor(200, 200, 200), true);

	//右矢印描画
	DrawBox(RIGHT_ARROW_SX, RIGHT_ARROW_SY, RIGHT_ARROW_SX + RIGHT_ARROW_WID, RIGHT_ARROW_SY + RIGHT_ARROW_HIG, GetColor(200, 200, 200), true);

	//マップチップ表示エリアの描画
	DrawBox(MAP_AREA_SX, MAP_AREA_SY, MAP_AREA_SX + MAP_AREA_WID, MAP_AREA_SY + MAP_AREA_HIG, GetColor(255, 255, 255), true);

}

描画処理を仕込んでいく。まずはメンバ内にインスタンスのポインタを宣言。
(EditScene.h)

#pragma once

#include"StDefine.h"

class InfoArea;
class EditArea;

class EditScene
{

public:
	EditScene(void);
	~EditScene(void);

	bool SystemInit(void);
	void Update(void);
	void Draw(void);
	bool Release(void);

	int GetLandImageHndl(eLandFormKind lnd) { return landImage[lnd]; }
	int GetPrevButtonStat(void) { return prevButtonStat; }
	int GetNowButtonStat(void) { return nowButtonStat; }

private:

	InfoArea* infArea;		//情報表示エリアClassのインスタンスのポインタ
	EditArea* edArea;		//編集エリアClassのインスタンスのポインタ

	int landImage[E_LAND_MAX];		//マップ地形画像のハンドル番号テーブル

	int prevButtonStat;				//直前のマウスボタンの状態
	int nowButtonStat;				//現在のマウスボタンの状態

};

EditScene側での処理
 ①コンストラクタ:ポインタの初期化
 ②SystemInit():動的なオブジェクトの作成・EditAreaClassのSystemInit()の呼び出し
 ③Draw():EditAreaClassのDraw()の呼び出し・EditAreaのScreenへの貼り付け
(EditScene.cpp)

bool EditScene::SystemInit(void)
{
	edArea = new EditArea(this);
	if (edArea == nullptr)return false;

	infArea = new InfoArea(this);
	if (infArea == nullptr)return false;

	if (infArea->SystemInit()==false)return false;
	if (edArea->SystemInit() == false)return false;

	int err = LoadDivGraph("image/TileMap.png", E_LAND_MAX, 10, 3, MAP_CHIP_WID, MAP_CHIP_HIG, landImage);
	if (err == -1)return false;

	prevButtonStat = nowButtonStat = 0;	//マウスボタンの状態

	return true;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void EditScene::Update(void)
{
	prevButtonStat = nowButtonStat;		//直前のフレームのボタン状態を退避
	nowButtonStat = GetMouseInput();	//現フレームのボタン状態を取得

	edArea->Update();
	infArea->Update();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void EditScene::Draw(void)
{
	infArea->Draw();//まずInfoAreaのスクリーンに描画
	edArea->Draw(); //次にEditAreaのスクリーンに描画

	SetDrawScreen(DX_SCREEN_BACK);		//裏画面を描画対象に設定
	ClearDrawScreen();			//描画対象画面をクリア(消去)

	//ウインドウ背景を描画
	DrawBox(0, 0, Application::WINDOW_SIZE_WID, Application::WINDOW_SIZE_HIG, GetColor(0, 0, 255), true);

	//編集エリアのスクリーンを裏画面に貼り付ける
	int edScrnHndl;//ハンドル用の変数は流用でもいいが、分けるとデバッグしやすい
	edScrnHndl = edArea->GetEditScreenHandle();
	DrawGraph(EDIT_AREA_SX, EDIT_AREA_SY, edScrnHndl, true);

	//情報エリアのスクリーンを裏画面に貼り付ける
	int scrnHndl; //ハンドル用の変数は流用でもいいが、分けるとデバッグしやすい
	scrnHndl = infArea->GetInfoScreenHandle();
	DrawGraph(INFO_AREA_SX, INFO_AREA_SY, scrnHndl, true);

	ScreenFlip();						//描画画面を入れ替え
}

EditAreaのDraw()にマップチップの描画を実装していく。
(EditArea.cpp)

void EditArea::Draw(void)
{
	//ここに描画処理を
	// スクリーンを編集エリア用に切り替え
	SetDrawScreen(edScrn);

	//背景の塗りつぶし
	DrawBox(0, 0, EDIT_AREA_WID, EDIT_AREA_HIG, GetColor(0, 0, 0), true);

	//上矢印描画
	DrawBox(UPPER_ARROW_SX, UPPER_ARROW_SY, UPPER_ARROW_SX + UPPER_ARROW_WID, UPPER_ARROW_SY + UPPER_ARROW_HIG, GetColor(200, 200, 200), true);

	//下矢印描画
	DrawBox(LOWER_ARROW_SX, LOWER_ARROW_SY, LOWER_ARROW_SX + LOWER_ARROW_WID, LOWER_ARROW_SY + LOWER_ARROW_HIG, GetColor(200, 200, 200), true);

	//左矢印描画
	DrawBox(LEFT_ARROW_SX, LEFT_ARROW_SY, LEFT_ARROW_SX + LEFT_ARROW_WID, LEFT_ARROW_SY + LEFT_ARROW_HIG, GetColor(200, 200, 200), true);

	//右矢印描画
	DrawBox(RIGHT_ARROW_SX, RIGHT_ARROW_SY, RIGHT_ARROW_SX + RIGHT_ARROW_WID, RIGHT_ARROW_SY + RIGHT_ARROW_HIG, GetColor(200, 200, 200), true);

	//マップチップ表示エリアの描画
	DrawBox(MAP_AREA_SX, MAP_AREA_SY, MAP_AREA_SX + MAP_AREA_WID, MAP_AREA_SY + MAP_AREA_HIG, GetColor(255, 255, 255), true);

	//ここにマップチップの描画処理を追加していく
	for(int yy =0;yy<DSP_CHIP_YNUM;yy++){
		for(int xx=0;xx<DSP_CHIP_XNUM;xx++){
			int dx = MAP_AREA_SX + MAP_CHIP_WID * xx;
			int dy = MAP_AREA_SY + MAP_CHIP_HIG * yy;
			int chip = mapData[dspStartY + yy][dspStartX + xx];
			if (chip > E_LAND_NON) {
				DrawGraph(dx, dy, edScene->GetLandImageHndl((eLandFormKind)chip), true);
			}
		}
	}

}

• マップチップの描画(二重ループ)
• ループ変数 yy と xx は画面に表示するチップ数(DSP_CHIP_YNUM, DSP_CHIP_XNUM)を走査。
• dx = MAP_AREA_SX + MAP_CHIP_WID * xx / dy = MAP_AREA_SY + MAP_CHIP_HIG * yy で、そのタイルの画面上座標を計算。
• chip = mapData[dspStartY + yy][dspStartX + xx] でマップ全体データの該当セルを読みます。dspStartX/dspStartY は表示開始位置(スクロール量)です。
• if (chip > E_LAND_NON) の場合、edScene->GetLandImageHndl((eLandFormKind)chip) でそのチップに対応する画像ハンドルを得て、DrawGraph(dx, dy, handle, true) で描画します。
(by Copilot)

Update()内で描画するための準備

void EditArea::Update(void)
{
	//編集エリアの更新処理
	int mx, my, ax, ay;	//マウス座標用変数
	int prevBtn = edScene->GetPrevButtonStat();	//直前のマウスボタンを取得
	int nowBtn = edScene->GetNowButtonStat();	//今のマウスボタン状態を取得

	GetMousePoint(&mx, &my);	//現在のマウスの座標(ウインドウ内)を取得(mx,myに格納される)

今後…
⇒編集エリアの中に入っているかどうかの判定
⇒編集エリア内の座標に変換
⇒ボタン押下のチェック …の予定。

コメント

タイトルとURLをコピーしました