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に格納される)
今後…
⇒編集エリアの中に入っているかどうかの判定
⇒編集エリア内の座標に変換
⇒ボタン押下のチェック …の予定。

コメント