プログラミングを春休みの自由研究にしてみる 3日目
六花です。
https://komochiduki.net/ikupro/2020/03/03/238/の続き、3日目です。
シリーズリスト :
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/
唐突にこの企画を思いついたので諸々突貫工事だったため、今日は眠くて体が動かないところからスタートです。
娘は、見かけ上は飲み込みが良く、すぐに理解したように見えるものの、しっかりと解ってはいないことは想像の範囲内です。
今日は、マスくんをはじめこのゲームで大切な要素である2次元座標と状態遷移図について再度説明しました。
前日の内容を説明させてみると、やはり「なんだっけ……?」というような状態でしたが、いくつかヒントを提示すると合点がいったようで、「あれだね!」と笑顔になりました。
ゲームを作る上では回避できない構造体について学んでもらうため、まずはマスくんの構造体を作ってもらうことにしました。
struct s_マスくん
{
double x;
};
x座標だけ保持する構造体を作り、「これに何が必要だと思う?」と話題を作ってy座標を追加してもらう算段です。
しかし、これには大きな問題がありました。
娘はまだアルファベットがうまく読めなかったのです。(前日に説明したときに出てきた英単語も、私がそう読んでいたからそのまま真似して読んでいた)
そこで、以前一度だけやらせたタイピング練習を今日からの日課にすることにしました。
アルファベットの大文字と小文字の区別は並行してやってもらう予定です。
久々のタイピング練習は、前回から間が開いているにも関わらず、大分好調でした。
特にキーボード入力をするという機会があったわけではないと思うのですが、前回の経験が活きたのでしょうか。
今日の目標はマスくんを動かすことだったので、DXライブラリにあるキーボードの入力状態を取得する関数を使用して、if文でx座標を変更して動かすことにしました。
if文の意味について再度説明し、「マスくんを右に動かすときはx座標を増やす? 減らす?」と尋ねながらコードを(私が)書いていき、娘が矢印キーでマスくんを動かしたところで今日の作業は終了。
全体を通して、前日の知識は「何となくは覚えてるが自分からは思い出せない」という程度でした。
その体験から「勉強の復習というのは大事なんだよ」と小学生の頃の私は考えもしなかったようなことを娘に教えられたことはいい機会だったかなと思います。(体験がないと納得できませんものね!)
↓今日遊んだコード
#include "DxLib.h"
struct s_マスくん
{
double x;
double y;
enum class e_状態 : int{立ってる, 空中, 水中};
e_状態 状態;
};
s_マスくん マスくん;
// プログラムは WinMain から始まります
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(true); // ウインドウモードで起動
SetWindowStyleMode(7); // 7:最大化ボタンが存在するウインドウモードに変更
SetGraphMode(1920, 1080, 32);
SetWindowSize(1920, 1080); // 初期ウインドウの大きさ
SetWindowSizeChangeEnableFlag(true, true); // ウインドウサイズ変更を可能にする(縦横比変更不可)
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetTransColor(255, 255, 255);
SetUsePremulAlphaConvertLoad(true); // 画像を読み込んだ後、乗算済みアルファ画像に変換する設定を有効にする
SetDrawScreen(DX_SCREEN_BACK);//裏画面
// 画像読み込み
int 画像_マスくん_立ち = LoadGraph("../../data/マスくん_立ち.png");
int 画像_マスくんの手 = LoadGraph("../../data/マスくんの手.png");
int 画像_マスくんの手_ドリル = LoadGraph("../../data/マスくんの手_ドリル.png");
マスくん.x = 1920 / 2;
マスくん.y = 1080 / 2;
while (ProcessMessage() != -1)
{
ClearDrawScreen(); // 画面を掃除する
// キーボードの入力を取得する
char keydata[256];
GetHitKeyStateAll(keydata);
if (keydata[KEY_INPUT_RIGHT] == 1)
{
マスくん.x += double(10);
// マスくん.x = マスくん.x + double(10);
}
if (keydata[KEY_INPUT_LEFT] == 1)
{
マスくん.x -= double(10);
}
DrawGraph(マスくん.x, マスくん.y, 画像_マスくん_立ち, true);
ScreenCopy(); // 描画を反映する
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}