さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
Zボタンを押して発射された自分の弾が画面の外に出たときZボタンを押したら新たに自分の弾が発射されるようにプログラムを構成してみましょう
Zボタンを押して発射された自分の弾が画面の外に出たときZボタンを押したら新たに自分の弾が発射されるようにプログラムを構成してみましょう
ソーラー「
Zボタンを押したとき飛行機の自分の弾が発射されるプログラムは
こちらでした
ただしこのプログラムでは
自分の弾が一つ発射されたあとは
それ以降
何度
Zボタンを押しても
もう自分の弾が発射されることはありません」
そのプログラムはこちらです
👇
#include "DxLib.h"
struct Character {
int x;
int y;
int graphichandle;
};
//👆🌞Characterの構造体宣言です
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウインドウモードに設定します
if (DxLib_Init() == -1) // DXライブラリを初期化処理しています
{
return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します
}
SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です
struct Character jibunnohikouki;
//👆🌞jibunnohikoukiの構造体変数宣言です
jibunnohikouki.x = 0;
jibunnohikouki.y = 0;
jibunnohikouki.graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");
//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています
struct Character jibunnotama;
//👆🌞jibunnotamaの構造体変数宣言です
jibunnotama.x = 0;
jibunnotama.y = 0;
jibunnotama.graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
//👆🌞構造体変数jibunnotamaのメンバ変数の初期化を行っています
int a = 0;
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
}
ScreenFlip();
ClearDrawScreen();
};
DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます
return 0; // プログラムを終了します
}
デバッグなしで実行をしてから一度プログラムを終了し
生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです
👇
https://www.youtube.com/watch?v=VzmvhH-vRHg
ソーラー「
このプログラムが実行されると
while{}文のブロック{}内の
命令文が繰り返し実行されることになります
🌸Zボタンを押している状態で🌸
while{}文のブロック{}内の
命令文が繰り返し実行される場合
具体的には
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
・
・
・
・
・
が実行されることになります
このプログラムをよく観察してね
1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
Zボタンが押されていたなら
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
が実行され
あとの繰り返しの回は
Zボタンが押されている
Zボタンが押されていないにかかわらず
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
が実行されるので
自分の弾の画像が10ドットずつ
横に移動しながら
表示され消える
ということが
ずっとえんえんと行われることになります
いずれは
ゲーム画面の外に
自分の弾の画像は消えていくことになります
が
それでも
jibunnotama.x = jibunnotama.x + 10;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
ScreenFlip();
ClearDrawScreen();
が
ずっと実行されることになります
この状態では
Zボタンが押されている
Zボタンが押されていないにかかわらず
自分の弾の画像が10ドットずつ
横に移動しながら
表示されるということが
ずっとえんえんと行われることになりますが
実行されている命令文
👇
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
・
・
・
・
・
👆
を見てもわかるように
もちろん
Zボタンをおしても
2発目の弾が発射されるなんてことはおこりませんね」
solarplexuss「??ふ〜ん
なんかぱっと
このwhile{}文を見た感じだと
Zボタンを押すと
そのたびに弾が発射されそうにみえるんだけど・・・
気のせいかな?」
ソーラー「そう、思う?
solarplexussさん
いい線いってる😊
そうなんです
このwhile{}文に
ほんのちょっと改良を加えただけで
Zボタンを押すたびに弾が発射されるようにすることができます
まずは
🌹発射された自分の弾が画面の外に出たとき🌹
Zボタンを押したら
弾が発射されるようにしてみましょう
では
ちょっとだけ
while{}文に次のように改良を加えてみるよ」
👇
int a = 0;
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if(jibunnotama.x>640)
a=0;
//👆この部分だけ付け加えました
}
ScreenFlip();
ClearDrawScreen();
};
マックス「
//👇この部分だけ付け加えました
if(jibunnotama.x>640)
a=0;
//👆この部分だけ付け加えました
👆を追加しただけで
発射された自分の弾が画面の外に出たとき
Zボタンを押したら
新たに自分の弾が発射されるようになるのか?
まさかなあ?」
ソーラー「うふふ 不思議だね
ではwhile文に
//👇この部分だけ付け加えました
if(jibunnotama.x>640)
a=0;
//👆この部分だけ付け加えました
👆を追加したプログラムを実行してみましょう
そのプログラムはこちらです
👇
#include "DxLib.h"
struct Character {
int x;
int y;
int graphichandle;
};
//👆🌞Characterの構造体宣言です
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウインドウモードに設定します
if (DxLib_Init() == -1) // DXライブラリを初期化処理しています
{
return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します
}
SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です
struct Character jibunnohikouki;
//👆🌞jibunnohikoukiの構造体変数宣言です
jibunnohikouki.x = 0;
jibunnohikouki.y = 0;
jibunnohikouki.graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");
//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています
struct Character jibunnotama;
//👆🌞jibunnotamaの構造体変数宣言です
jibunnotama.x = 0;
jibunnotama.y = 0;
jibunnotama.graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
//👆🌞構造体変数jibunnotamaのメンバ変数の初期化を行っています
int a = 0;
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
a = 1;
}
}
if (a == 1) {
jibunnotama.x = jibunnotama.x + 10;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
ScreenFlip();
ClearDrawScreen();
};
DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます
return 0; // プログラムを終了します
}
デバッグなしで実行をしてから一度プログラムを終了し
生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです
👇
https://www.youtube.com/watch?v=V6XTd9jtmGs
おまけ
👇
https://www.youtube.com/watch?v=StNCd-wGxS4
マックス「
なんで
//👇この部分だけ付け加えました
if(jibunnotama.x>640)
a=0;
//👆この部分だけ付け加えました
👆を追加しただけで
Zボタンを押して発射された自分の弾が画面の外に出たとき
再び
Zボタンを押したら
自分の弾が発射されるように
なったのか
意味が分からん」
ソーラー「では
変更が加えられたwhile{}文の仕組みをみてみようよ
このプログラムが実行されると
while{}文のブロック{}内の
命令文が繰り返し実行されることになります
まず
while{}文の前で
int a = 0;
が実行されているね
int型の変数aが生成されています
ここでは
int型の変数aに0
が代入されています
int型の変数aに0が代入されている状態だと
if (a == 0){命令文;}
タイプの
命令文は実行されることになるね
さあ
まずは
1回目のwhile{}文のブロック{}内の命令文の繰り返しが実行されます
まず
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
によって
裏画面に青い四角形が描かれ
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
の実行により
キーボードからの入力に応じて(裏画面の)ある位置に飛行機の画像データが表示されることになります
今はキーボードの十字キーからの入力は行われていないとすると
jibunnohikouki.x = 0;
jibunnohikouki.y = 0;
が実行されていたので
(0,0)を始点として
裏画面に飛行機の画像データが表示されることになります
次に
いよいよ
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
の実行ですね
🧩今は🧩
🧩キーボードのZボタンが押されていない状態で🧩
🧩なおかつ
🧩十字キーを押して飛行機を動かしていないとします🧩
つまり何もキーを押していないとします
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
が実行されると
key & PAD_INPUT_A
は
0&16
は
0
となり
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
は
if (0) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
となり
if (0) {}のブロック{}内の命令文
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
は実行されません
このとき
while{}文の前で
int a = 0;
が実行されていたので
aには0が代入されたままです
次に
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
が実行されます
今
aには0が代入されているので
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
は
if (0){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
となるので
ブロック内の命令文
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
は実行されません
ですので
裏画面に
jibunnotama.x
jibunnotama.y
に代入されている値
(
jibunnotama.x=0;
jibunnotama.y=0;
が実行されていたので
)
0
0
を
始点として
🍊自分の弾の画像データが描かれることはありません🍊
飛行機の画像データだけが裏画面に表示されることになります
次に
ScreenFlip();
の実行により
今まで裏画面に描かれた飛行機の画像がしばらくの間
表画面に表示された後
ClearDrawScreen();
の実行により
表画面と裏画面に描かれた飛行機の画像がすべて消去されることになります
つまり
何もボタンをおしてなくても
飛行機の画像は表示されるんだけど
Zボタンは押されていないので
自分の弾は表示されないってわけだね
まあ 普通のことかな?
2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行でも
何もボタンをおしていないと
飛行機の画像は表示されるんだけど
Zボタンは押されていないので
自分の弾は表示されないってわけだね」
solarplexuss「にゃん」
ソーラー「
今は
🧩飛行機を十字キーを押して動かしていない状態で🧩
🧩なおかつ🧩
🧩キーボードのZボタンが押されていない状態🧩
🧩つまり🧩
🧩何もキーを押していない状態でしたが🧩
🧚♂️今度は🧚
🧚飛行機を十字キーを押して動かしていない状態で🧚
🧚キーボードのZボタンが押されている状態🧚
🧚つまり🧚
🧚キーボードのZボタンだけが押されている状態だとします🧚
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
が実行されると
Zボタンを押しているので
key & PAD_INPUT_A
は
16&16
イコール
1
となり
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
は
if (1) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
となり
ブロック{}内の命令文
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
が実行されることになります
このとき
aには
0が代入されているので
a == 0
は
0==0
は
1
となり
if (1) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
となるので
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行されることになります
自分の弾の画像データが表示される位置に関わる
jibunnotama.xは jibunnohikouki.x + 35=0+35=35の値を持ち
jibunnotama.y は jibunnohikouki.y + 20=0+20=20の値を持つことになりますね
で
続く
a = 1;
がポイントだね
int型の変数aに0が代入されている状態だと
if (a == 0){命令文;}
タイプの
命令文が実行されますが
int型の変数aに1が代入されている状態だと
if (a == 1){命令文;}
タイプの
命令文が実行されることになります
a = 1;
を実行することにより
if (a == 1){命令文;}
タイプの
命令文が実行されるように変更されたんだよ
次に
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
が実行されます
今
aには1が代入されているので
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
は
if (1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
となるので
ブロック{}内の命令文
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が実行されることになります
ですので
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
の実行により
裏画面に
jibunnotama.x
jibunnotama.y
(
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
すなわち
jibunnotama.x = 0+ 35;
jibunnotama.y = 0 + 20;
が
実行されていたので
jibunnotama.x
jibunnotama.y
には
35
20
が代入されています)
すなわち
35
20
を
始点として
自分の弾の画像データが描かれることになります
そして
続く
jibunnotama.x = jibunnotama.x + 10;
の実行により
jibunnotama.x に格納されている値は10
増えて
45になります
次に
if (jibunnotama.x > 640)
a = 0;
の実行に移りますが
条件式
jibunnotama.x > 640
は
45>640
は
0
となり
if (jibunnotama.x > 640)
は
if (0)
となるので
if (jibunnotama.x > 640)に続く命令文
a = 0;
は実行されません
ですので
aには1が代入されたままです
次に
ScreenFlip();
の実行により
今まで裏画面に描かれた飛行機と自分の弾の画像がしばらくの間
表画面に表示された後
ClearDrawScreen();
の実行により
表画面と裏画面に描かれた飛行機と自分の弾の画像がすべて消去されることになります
これで
1回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の終了です
さあ
今度は
2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行です
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
によって
裏画面に青い四角形が描かれ
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
の実行により
キーボードからの入力に応じて裏画面に飛行機の画像データが表示されることになります
まず
今はキーボードの十字キーからの入力は行われていないとすると
jibunnohikouki.x = 0;
jibunnohikouki.y = 0;
が実行されていたので
(0,0)を始点として
裏画面に飛行機の画像データが表示されることになります
次に
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
の実行ですね
このとき
キーボードのZボタンは
押され続けているかもしれないし
もう
キーボードのZボタンは
押されていないかもしれません
キーボードのZボタンが押されている状態で
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
が実行されると
key & PAD_INPUT_A
は
16&16
イコール
1
となり
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
は
if (1) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
となり
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
が実行されることになります
このとき
aには
1が代入されているので
a == 0
は
1==0
は
0
となり
if (0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
となるので
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
は実行されません
が
1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行されているので
🍎aには1が代入されたままです🍎
続いて
キーボードのZボタンが押されていない状態で
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
が実行されると
key & PAD_INPUT_A
は
0&16
は
0
となり
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
は
if (0) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
となるので
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
は実行されません
が
1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行されているので
🍎aには1が代入されたままです🍎
つまり
1回目のwhile{}文のブロック{}内の命令文の繰り返しで
Zボタンを押すことにより
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行された場合は
2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で
😊 Zボタンが押されていても 😊
😁 Zボタンが押されていなくても 😁
aには1が代入されたままになります」
solarplexuss「ふ~ん
1回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で
Zボタンを押したら
aには1が代入される
そして
2回目のwhile{}文のブロック{}内の命令文の繰り返しの実行の時点で
😊 Zボタンが押されていても 😊
😁 Zボタンが押されていなくても 😁
aには1が代入されたままなんだ」
ソーラー「そうなんです
実行されない
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
に続いて
次に
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
の実行となりますが
今
aには1が代入されているので
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
は
if (1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
となるので
ブロック内の命令文
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が実行されることになります
1回目のwhile{}文のブロック{}内の命令文の繰り返しのときで
Zボタンを押していた場合は
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
の実行により
jibunnotama.x = 0 + 35;
jibunnotama.y = 0 + 20;
を
始点として
つまり
35
20
を
始点として
自分の弾の画像が描かれましたが
1回目のwhile{}文のブロック{}内の命令文の繰り返しで
その後
jibunnotama.x = jibunnotama.x + 10;
が実行されていたので
jibunnotama.xには45が代入されています
jibunnotama.y
には何も操作が行われていないので
20の値を持ったままとなります
ですので
2回目のwhile{}文のブロック{}内の命令文の繰り返しのときの
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
が実行されると
45
20
を
始点として
自分の弾の画像が描かれることになります
つまり
自分の弾の画像データが水平に10ドット横に移動して描かれることになります
次に
jibunnotama.x = jibunnotama.x + 10;
が実行されるので
jibunnotama.x
は
55
の値を持つことになり
jibunnotama.y
は
20の値を持ったままとなります
次に
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
の実行になりますが
jibunnotama.x > 640
は
55>640
は
0となるので
a = 0;
は実行されません
そして
次は
3回目のwhile{}文のブロック{}内の命令文の繰り返しの実行になりますが
結論を言うと
3回目のwhile{}文のブロック{}内の命令文の繰り返しのときも
今はキーボードの十字キーからの入力は行われていないとすると
jibunnohikouki.x = 0;
jibunnohikouki.y = 0;
が実行されていたので
(0,0)を始点として
裏画面に飛行機の画像データが表示されることになります
そして
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
が実行されることになりますが
さきほど
2回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
jibunnotama.x
は
55
の値を持つことになり
jibunnotama.y
は
20の値を持ったままとなったので
55
20
を
始点として
自分の弾の画像が描かれることになります
次に
jibunnotama.x = jibunnotama.x + 10;
が実行されるので
jibunnotama.x
は
65
の値を持つことになり
jibunnotama.y
は
20の値を持ったままとなります
次に
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
の実行になりますが
jibunnotama.x > 640
は
65>640
は
0となるので
a = 0;
は実行されません
以下
4回目のwhile{}文のブロック{}内の命令文の繰り返し
5回目のwhile{}文のブロック{}内の命令文の繰り返し
6回目のwhile{}文のブロック{}内の命令文の繰り返し
7回目のwhile{}文のブロック{}内の命令文の繰り返し
8回目のwhile{}文のブロック{}内の命令文の繰り返し
・
・
・
と続いていくことになりますが
jibunnotama.xの格納している値は
65
75
85
95
105
・
・
・
と
どんどん増加していき
65
20
75
20
85
20
95
20
105
20
を
始点として
自分の弾の画像が描かれることになります
自分の弾のy座標は20のままなので
自分の弾は10ドットずつ水平に移動して表示されることになるね
62回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
aの値は645になります
では
🧚🏻♀️62回目のwhile{}文のブロック{}内の命令文の繰り返しでは何が行われるかを見ていきましょう🧚🏻♀️
まず
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
が実行されますが
Zボタンを押していて
key & PAD_INPUT_A
が
1になっても
aには1が代入されているので
if (1 == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
となり
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
は実行されません
Zボタンを押していなくて
key & PAD_INPUT_A
が
0になっても
if (a== 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
は実行されないので
ブロック{}内の命令文
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
は実行されません
次に
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
の実行に移ります
aには1が代入されているので
a == 1
は
1 == 1
となり
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が実行されることになります
このとき
実は
61回目のwhile{}文のブロック{}内の命令文の繰り返し実行のとき
jibunnotama.x
は
635
の値を持ち
jibunnotama.y
は
20の値を持つことになったので
635
20
を
始点として
自分の弾の画像が描かれることになります
ゲーム画面の幅は
640なので
ぎりぎり
ゲーム画面の外にはみ出しながら自分の弾の画像
が
表示されることになるね
次に
jibunnotama.x = jibunnotama.x + 10;
が実行されると
jibunnotama.x
は
645
の値を持ちます
今までどおり
jibunnotama.y
は
20の値をもったままです
さあ
いよいよ
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が実行されることになります
jibunnotama.xは645の値を持っているので
jibunnotama.x > 640
は
645 > 640
は
1
となり
a = 0;
が実行されることになります」
マックス「おや?
aに0が代入されることになるのか?
ということは
次の63回目のwhile文の繰り返し実行のときは
🌞また🌞
aに0が代入された状態で
while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {
DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);
int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
if (key & PAD_INPUT_UP) jibunnohikouki.y = jibunnohikouki.y - 4;
if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;
if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;
if (key & PAD_INPUT_RIGHT) jibunnohikouki.x = jibunnohikouki.x + 4;
DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
が実行されることになるのか?
ということは・・・
今までは
aに1が代入されていたので
Zボタンを押しても何も反応がなかったのが
aに0が代入されることにより
再び
Zボタンを押すと
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
}
の
key & PAD_INPUT_A
は
16&16
は
1
となるので
if (key & PAD_INPUT_A) {}の
ブロック{}内の命令文
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
が実行されることになる
aには0が代入されているので
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行される
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
35
20
を
始点として
自分の弾の画像が描かれることになる
で
jibunnotama.x = jibunnotama.x + 10;
が実行されると
jibunnotama.x
は
45
の値を持つんだろう
次に
ScreenFlip();
の実行により
今まで裏画面に描かれた飛行機と自分の弾の画像がしばらくの間
表画面に表示された後
ClearDrawScreen();
の実行により
表画面と裏画面に描かれた飛行機と自分の弾の画像がすべて消去されることになる
2回目のwhile{}文のブロック{}内の命令文の繰り返しの回以降の回は
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
は実行されず
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
だけが
ずっと
以下のように
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
・
・
・
・
・
が実行されることになるわけだ
つまり
1回目のwhile{}文のブロック{}内の命令文の繰り返しのとき
Zボタンが押されていたなら
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
が実行され
あとの繰り返しの回は
Zボタンが押されている
Zボタンが押されていないにかかわらず
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
ScreenFlip();
ClearDrawScreen();
が実行されるので
自分の弾の画像が10ドットずつ
水平に横に移動しながら
表示され消える
ということが
また行われることになるわけだ
まあ まとめると
Zボタンを押して発射された弾が
ゲーム画面の外にでたなら
再び
Zボタンを押して
自分の弾を
発射できるってわけだ」
solarplexuss「へええ〜なるほどぉ〜」
ソーラー「そうなんです
そして
同様に
1回目でなくても
どこかのwhile文の繰り返し実行の回で
Zボタンを押すと
if (key & PAD_INPUT_A) {
if (a == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
}
の
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
が実行されて
aに1が代入されることになります
となると
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
の
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が
実行されることになります
jibunnotama.x > 640
が成立しない限り
その次のwhile文の繰り返し実行の回でも
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
の
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が
実行されることになります
次の次のwhile文の繰り返し実行の回でも
if (a == 1){
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
}
の
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
が
実行されることになります
この後に続く
あるwhile文の繰り返し実行の回で
jibunnotama.x > 640
を満たすことにより
//👇この部分だけ付け加えました
if (jibunnotama.x > 640)
a = 0;
//👆この部分だけ付け加えました
のブロック内の命令文
a=0;
が
実行されて
aに
再び
0が代入されるようになるまでは
Zボタンを押しても
新たに自分の弾は発射されないんだよ
つまり
Zボタンを押して発射された弾が
ゲーム画面の外にでないと
再び
Zボタンを押して
自分の弾を
発射できるようにならないんだ」
solarplexuss「なんか
飛行機がゲーム画面の右の方の位置にいるときは
自分の弾が発射される間隔が短くて
飛行機がゲーム画面の左の方の位置にいるときは
自分の弾が発射される間隔が長くなって間延びしてない???
気のせいかな?」
ソーラー「うう」
マックス「もしや
最初
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
a = 1;
を実行したとき
飛行機がゲーム画面の右端の方にいる
すなわち
jibunnohikouki.xの位置が640に近いと
jibunnotama.x = jibunnotama.x + 10;
が
数回行われただけで
すなわち短い時間で
jibunnotama.x > 640
を満たし
aに0が代入されることになる
だから
Zボタンを押し続けている状態で
飛行機が画面の💕右端💕に近い位置にいると
ゲーム画面の外に自分の弾が出て行く時間は短くなるので
ゲーム画面の外に自分の弾が出て行ったあと
すぐに
自分の弾が発射されることになる
だから
前に発射した自分の弾
と
次に発射する自分の弾
の間隔は短くなるわけだ
Zボタンを押し続けている状態で
飛行機がゲーム画面の💖左端💖の方にいる
すなわち
jibunnohikouki.xの位置が0に近いと
jibunnotama.x = jibunnotama.x + 10;
が
何回も行われて
すなわち
かなり時間がかかって
jibunnotama.x > 640
を満たし
aに0が代入されることになる
つまり
Zボタンを押し続けている状態で
飛行機が画面の左端に近い位置にいると
発射した自分の弾がゲーム画面の外に出るのに時間がかかるので
次の自分の弾が発射されるまでに
時間がかかることになるだろう
つまり
前に発射した自分の弾
と
次に発射する自分の弾
の間隔は長くなるわけだ」
ソーラー「う~わあ
すごいな
よく見抜いたね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます