情報エリア内
地形一覧=マップチップ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_XNUM | 1行に並べられるチップの数 |
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;
}
今日はここまで。
コメント