プログラミングを春休みの自由研究にしてみる 15 – 21日目[本編3 – 9日目]
六花です。
https://komochiduki.net/ikupro/2020/03/15/289/の続き、15-21日目[本編3-9日目]です。
シリーズリスト :
1日目 : https://komochiduki.net/ikupro/2020/03/01/234/
2日目 : https://komochiduki.net/ikupro/2020/03/03/238/
3日目 : https://komochiduki.net/ikupro/2020/03/03/245/
4日目 : https://komochiduki.net/ikupro/2020/03/04/250/
5日目 : https://komochiduki.net/ikupro/2020/03/04/253/
6日目 : https://komochiduki.net/ikupro/2020/03/09/259/
7、8、9日目 : https://komochiduki.net/ikupro/2020/03/11/263/
10、11、12日目 : https://komochiduki.net/ikupro/2020/03/12/268/
13日目[本編1日目] : https://komochiduki.net/ikupro/2020/03/13/286/
14日目[本編2日目] : https://komochiduki.net/ikupro/2020/03/15/289/
15-21日目[本編3-9日目] : https://komochiduki.net/ikupro/2020/03/21/302/
投稿が空いて申し訳ありません。
というのも、一応親子そろって真面目に取り組んでいたのですが、記事にまとめるのは難しい内容だったのでついつい後回しにしてしまいました。
端的に説明すると、私の説明不足が原因で中々進展していませんでした。
その結果、「娘に具体的なコメントを書いてもらって、それを親がコーディングする」という手法に行きつきました。
疑似コードを書いてもらうようなものですが、その疑似コードの文法について取り決めるのも手間なので、とくに取り決めはしませんでした。(構造体の定義は例外として娘に書いてもらいます。)
親が担当する設計の粒度は悩んでいて、AABBの重なり判定レベルからコメントを書かせるのか、それともどの程度なら一行のコメントで済ませても良いか、手探りでやっています。
現状は、娘と対話しながらコメントをブラッシュアップし、それを元にコーディングしています。
#include <array>
#include <algorithm>
#include "DxLib.h"
constexpr int ウインドウの大きさ_x = 640;
constexpr int ウインドウの大きさ_y = 480;
constexpr int ブロックの大きさ = ウインドウの大きさ_y / 16;
double カメラのいちx = 0.0;
//==============================================
// グローバル変数や構造体、関数の宣言
//==============================================
enum class e_ブロック : int { 空気, 水, 草, 丸太, いちご };
enum class e_キャラクター :int { 決まってない, マスくん, ドリル, こぐま, おやぐま, はりせんぼん, くじら };
enum class e_むき : bool { 右むき = false, 左むき = true };
struct s_キャラクター
{
e_キャラクター キャラクターのしゅるい = e_キャラクター::決まってない;
e_むき むき = e_むき::左むき;
//いち
double いちx;
double いちy;
//はやさ (そくど)
double はやさx;
double はやさy;
//かそくど
double かそくどx;
double かそくどy;
// はんていのおおきさ(はばたかさ)
double はんていのおおきさw;
double はんていのおおきさn;
// はんていのいち
double はんていのいちx;
double はんていのいちy;
// じょうたい
enum class e_じょうたい : int { 足がついている, ういている, みずのなか, };
e_じょうたい じょうたい;
};
struct s_ブロック
{
e_ブロック ブロックのしゅるい;
};
//==============================================
// main関数
//==============================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//==============================================
// DXライブラリの下準備
//==============================================
ChangeWindowMode(true); // ウインドウモードで起動
SetWindowStyleMode(7); // 7:最大化ボタンが存在するウインドウモードに変更
SetGraphMode(ウインドウの大きさ_x, ウインドウの大きさ_y, 32);
SetWindowSize(ウインドウの大きさ_x, ウインドウの大きさ_y); // 初期ウインドウの大きさ
SetWindowSizeChangeEnableFlag(true, true); // ウインドウサイズ変更を可能にする(縦横比変更不可)
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetTransColor(255, 255, 255);
SetUsePremulAlphaConvertLoad(true); // 画像を読み込んだ後、乗算済みアルファ画像に変換する設定を有効にする
SetDrawScreen(DX_SCREEN_BACK);//裏画面
//==============================================
// その他の下準備
//==============================================
// マスくんをつくる
s_キャラクター マスくん;
// ドリルををつくる
s_キャラクター ドリル;
// マップからブロックとてきをつくる
std::array<std::array<s_ブロック, 16>, 128> ブロック;
std::array<s_キャラクター, 10> てき;
{
int マップ = LoadSoftImage("../../data/マップ_1ステージ目.png");
int つぎのてきのばんごう = 0;
// マップ情報をブロックに変換
for (int i_x = 0; i_x < 128; i_x += 1)
{
for (int i_y = 0; i_y < 16; i_y += 1)
{
int R, G, B, A;
GetPixelSoftImage(マップ, i_x, i_y, &R, &G, &B, &A);
/**/ if (R == 255 && G == 255 && B == 255) { ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::空気; }
else if (R == 207 && G == 143 && B == 79) { ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::草; }
else if (R == 128 && G == 64 && B == 0) { ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::丸太; }
else if (R == 0 && G == 254 && B == 0) { ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::いちご; }
else if (R == 0 && G == 128 && B == 255) { ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::水; }
else if (R == 255 && G == 122 && B == 0)
{
ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::空気;
}
else if (R == 254 && G == 0 && B == 0)
{
ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::空気;
てき.at(つぎのてきのばんごう).キャラクターのしゅるい = e_キャラクター::こぐま;
てき.at(つぎのてきのばんごう).いちx = i_x * ブロックの大きさ;
てき.at(つぎのてきのばんごう).いちy = i_y * ブロックの大きさ;
てき.at(つぎのてきのばんごう).はんていのいちx = 41;
てき.at(つぎのてきのばんごう).はんていのいちy = 47;
てき.at(つぎのてきのばんごう).はんていのおおきさw = 43;
てき.at(つぎのてきのばんごう).はんていのおおきさn = 36;
つぎのてきのばんごう += 1;
}
else if (R == 254 && G == 0 && B == 254)
{
ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::空気;
てき.at(つぎのてきのばんごう).キャラクターのしゅるい = e_キャラクター::おやぐま;
てき.at(つぎのてきのばんごう).いちx = i_x * ブロックの大きさ;
てき.at(つぎのてきのばんごう).いちy = i_y * ブロックの大きさ;
てき.at(つぎのてきのばんごう).はんていのいちx = 44;
てき.at(つぎのてきのばんごう).はんていのいちy = 29;
てき.at(つぎのてきのばんごう).はんていのおおきさw = 39;
てき.at(つぎのてきのばんごう).はんていのおおきさn = 98;
つぎのてきのばんごう += 1;
}
else if (R == 255 && G == 248 && B == 64)
{
ブロック.at(i_x).at(i_y).ブロックのしゅるい = e_ブロック::水;
てき.at(つぎのてきのばんごう).キャラクターのしゅるい = e_キャラクター::はりせんぼん;
てき.at(つぎのてきのばんごう).いちx = i_x * ブロックの大きさ;
てき.at(つぎのてきのばんごう).いちy = i_y * ブロックの大きさ;
てき.at(つぎのてきのばんごう).はんていのいちx = 22;
てき.at(つぎのてきのばんごう).はんていのいちy = 25;
てき.at(つぎのてきのばんごう).はんていのおおきさw = 80;
てき.at(つぎのてきのばんごう).はんていのおおきさn = 74;
つぎのてきのばんごう += 1;
}
}
}
}
while (ProcessMessage() != -1)
{
ClearDrawScreen(); // 画面をきれいにする
/* キーがおされているかをしらべるコメントがありません */
// zをおしたらマスくんの手からドリルを下にはっしゃ
// fをおしたらマスくんの手からドリルをまえにはっしゃ
// yをおしたらマスくんの手からドリルを上にはっしゃ
// 右キーをおしたらマスくんが右にすすむ
// 左キーをおしたらマスくんが左にすすむ
// 上キーをおしたらマスくんがジャンプ
// 空中にいったらおちてくる
/* だれが空中にいたら? */
// マスくんは下におちたらブロックにはまらない
/* こぐまとおやぐまはおちてるときにブロックにはまってもよい? */
// マスくんとこぐまとおやぐまはよこからブロックにぶつかったらはまらない
// ブロックをがめんにうつす
for (int i_x = 0; i_x < 128; i_x += 1)
{
for (int i_y = 16 - 1; i_y >= 0; i_y -= 1)
{
int このブロックのいちx = ブロックの大きさ * i_x;
int このブロックのいちy = ブロックの大きさ * i_y;
/* うつすがぞうがよみこまれていません */
}
}
// マスくんをがめんにうつす
/* うつすがぞうがよみこまれていません */
// キャラクターをがめんにうつす
/* 「キャラクター」とは「てき」のことですか? */
/* うつすがぞうがよみこまれていません */
//xをおしたらドリルをがめんにうつす
/* xをおしていないときはドリルがきえてもよい?*/
// マスくんがうごいたらがめんもうごく
カメラのいちx = std::clamp(マスくん.いちx - (ウインドウの大きさ_x / 2), 0.0, double(ブロックの大きさ * 128 - (ウインドウの大きさ_x / 2)));
ScreenCopy(); // 画面(がめん)を更新(こうしん)する
}
//==============================================
// ループ終了時の処理
//==============================================
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}