C言語Ⅱ⑤(2025/10/22)

情報エリア内
地形一覧=マップチップ5x6を一つのリストに。
その下に「消去」ボタン。
さらにその下に、「現在の選択地形」->これって、地形一覧に赤太枠でよくない??
最下部に「全クリア」「セーブ」「ロード」

InfoAreaのクラス定義。
(InfoArea.h)

#pragma once

#include "StDefine.h"

class EditScene;

class InfoArea
{

public:

	static constexpr int INFO_CHIP_LIST_SX = 20;	//情報表示エリア内のマップチップ横サイズ
	static constexpr int INFO_CHIP_LIST_SY = 20;	//情報表示エリア内のマップチップ縦サイズ
	static constexpr int INFO_CHIP_DISTANCE_DX = 4;	//情報表示エリア内のマップチップ間の縦間隔
	static constexpr int INFO_CHIP_DISTANCE_DY = 4; //情報表示エリア内のマップチップ間の横間隔
	static constexpr int INFO_CHIP_DSP_XNUM = (INFO_AREA_WID - INFO_CHIP_LIST_SX) / (MAP_CHIP_WID + INFO_CHIP_DISTANCE_DX);
													//情報表示エリア内のマップチップの横の表示個数
	static constexpr int INFO_CHIP_DSP_YNUM = (E_LAND_MAX % INFO_CHIP_DSP_XNUM == 0 ) ? E_LAND_MAX / INFO_CHIP_DSP_XNUM : (E_LAND_MAX / INFO_CHIP_DSP_XNUM) + 1;
													//情報表示エリア内のマップチップの縦の表示個数

	static constexpr int INFO_CHIP_CLR_SX = INFO_CHIP_LIST_SX;
	static constexpr int INFO_CHIP_CLR_SY = INFO_CHIP_LIST_SY + (MAP_CHIP_HIG + INFO_CHIP_DISTANCE_DY) * INFO_CHIP_DSP_YNUM;

	//エリア内の見出し文字の表示開始座標
	static constexpr int INFO_INDEX_SX = 2;
	static constexpr int INFO_INDEX_LIST_SY = 2;
	static constexpr int INFO_INDEX_SELCHIP_SY = INFO_CHIP_LIST_SY + (MAP_CHIP_HIG + INFO_CHIP_DISTANCE_DY) * (INFO_CHIP_DSP_YNUM + 1);

	//選択されているマップチップの表示座標
	static constexpr int INFO_SELCHIP_DX = INFO_CHIP_LIST_SX;
	static constexpr int INFO_SELCHIP_DY = INFO_INDEX_SELCHIP_SY + 18;

	//セーブ・ロードボタン
	static const int SAVELOAD_BTN_WID = 96;
	static const int SAVELOAD_BTN_HIG = 32;
	static const int SAVE_BTN_DX = (INFO_AREA_WID - SAVELOAD_BTN_WID) / 2;
	static const int SAVE_BTN_DY = INFO_AREA_HIG - (SAVELOAD_BTN_HIG * 2 + 16);
	static const int LOAD_BTN_DX = SAVE_BTN_DX;
	static const int LOAD_BTN_DY = SAVE_BTN_DY + SAVELOAD_BTN_HIG + 8;

	//全クリアボタン
	static const int ALLCLEAR_BTN_WID = SAVELOAD_BTN_WID;
	static const int ALLCLEAR_BTN_HIG = SAVELOAD_BTN_HIG;
	static const int ALLCLEAR_BTN_DX = SAVE_BTN_DX;
	static const int ALLCLEAR_BTN_DY = SAVE_BTN_DY - 32 - ALLCLEAR_BTN_HIG;
	
	InfoArea(EditScene* eds);	//親クラスのインスタンスのポインタを受け取る
	~InfoArea(void);

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

	int GetInfoScreenHandle(void) { return infScrn; }
	int GetSelChipKind(void) { return selChipKind; }

private:
	EditScene* edScene;		//EditSceneClassのインスタンスのポインタ
	
	int infScrn;			//情報エリアのスクリーンハンドル

	int selChipKind;		//選択されているマップチップの種類

};

これは「割り算して余りがあるかどうか」で行数を決めてる。

  • E_LAND_MAX = 全部で30種類のタイルがある
  • INFO_CHIP_DSP_XNUM = 1行に8個並べられる

なら:

  • 30 ÷ 8 = 3余り6 → 4行必要
    (最後の行は6個しか置けない)

だからこう書いてる。


🧮 まとめると

定数意味
INFO_CHIP_DSP_XNUM1行に並べられるチップの数
INFO_CHIP_DSP_YNUM全チップを並べるのに必要な行数

┌────────────── INFO_AREA_WID ──────────────┐
│ [1][2][3][4][5][6][7][8] ← INFO_CHIP_DSP_XNUM = 8 │
│ [9][10][11][12][13][14][15][16] │
│ [17]…[24] │
│ [25]…[30] ← 余り → 4行必要(INFO_CHIP_DSP_YNUM=4)│
└────────────────────────────────────┘

これは「チップを並べるグリッドの分割数を算出している」だけ。

画面上の表示ロジックを後で柔軟に変えるために、
「何列×何行必要か」を定数として先に計算してるってわけです。(by ChatGPT)


メンバ関数の実装。
(InfoArea.cpp)

//----------------------------------------------------
// map editor
// name:ゆき
//----------------------------------------------------
//InfoArea class
#include<DxLib.h>
#include"InfoArea.h"
#include"EditScene.h"




InfoArea:: InfoArea(EditScene* eds)
{
	edScene = eds;
	infScrn = -1;
}

InfoArea::~InfoArea(void)
{

}

bool InfoArea::SystemInit(void)
{
	//スクリーンの作成
	infScrn = MakeScreen(INFO_AREA_WID,INFO_AREA_HIG,true);
	if (infScrn == -1)return false;

	selChipKind = E_LAND_NON;



	return true;
}

void InfoArea::Update(void)
{

}

void InfoArea::Draw(void)
{
	SetDrawScreen(infScrn);	//情報画面用のスクリーンに切り替え

	DrawBox(0, 0, INFO_AREA_WID, INFO_AREA_HIG, GetColor(255, 255, 255), true);
	DrawString(INFO_INDEX_SX, INFO_INDEX_LIST_SY, "地形一覧", GetColor(247, 14, 70));

	//地形選択画像リストの描画
	for (int xy = 0; xy < E_LAND_MAX; xy++)
	{
		//座標計算だけ先に行う
		int dx = INFO_CHIP_LIST_SX + (MAP_CHIP_WID + INFO_CHIP_DISTANCE_DX) * (xy % INFO_CHIP_DSP_XNUM);
		int dy = INFO_CHIP_LIST_SY + (MAP_CHIP_HIG + INFO_CHIP_DISTANCE_DY) * (xy / INFO_CHIP_DSP_YNUM);
		//描画したい画像のハンドルを取得する
		int land = edScene->GetLandImageHndl((eLandFormKind)xy);//引数の型が違うのでキャストする
		DrawGraph(dx, dy, land, true);
	}

}

bool InfoArea::Release(void)
{

	return true;
}

今日はここまで。

コメント

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