さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
新たにZボタンを押すと弾が2連射されるプログラムを書き換えてみよう まずは配列を用いて弾のデータを取り扱うようにしましょう
配列を使えばfor文を用いて大量のデータを扱うことができfor文の中でbreak;を用いることにより好きなタイミングでfor文の実行から抜けることができるようになります
新たにZボタンを押すと弾が2連射されるプログラムを書き換えてみよう まずは配列を用いて弾のデータを取り扱うようにしましょう
マックス「ぐぬぬぅ・・・・・
理論上は
Zボタンを押している状態で
1回目のwhile{}文のブロック{}内の命令文が実行されると
自分の弾が発射され
3回目のwhile{}文のブロック{}内の命令文が実行されると
自分の弾1が発射される
つまり
弾が続けて発射される
弾が2連射されるわけだ
そして
62回目のwhile{}文のブロック{}内の命令文が実行されると
自分の弾が発射され
64回目のwhile{}文のブロック{}内の命令文が実行されると
自分の弾1が発射される
つまり
弾が続けて発射される
弾が2連射されるはずなんだが・・・
なぜ
実際には
Zボタンを押し続けた状態で弾が2連射されるのは
最初の一回のみで
後は
弾が
1発ずつしか
発射されない?」
そのプログラムはこちらです
👇
#include "DxLib.h"
struct Character {
int x;
int y;
int graphichandle;
int life;
};
//👆🌞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.life = 0;
//👆🌞構造体変数jibunnotamaのメンバ変数の初期化を行っています
//👆😋自分の弾😋のデータをとりあつかっています
struct Character jibunnotama1;
//👆🌞jibunnotama1の構造体変数宣言です
jibunnotama1.x = 0;
jibunnotama1.y = 0;
jibunnotama1.graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama1.life = 0;
//👆🌞構造体変数jibunnotama1のメンバ変数の初期化を行っています
//👆😋自分の弾1😋のデータをとりあつかっています
int i = 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) && (i == 0)) {
if (jibunnotama.life == 0) {
jibunnotama.x = jibunnohikouki.x + 35;
jibunnotama.y = jibunnohikouki.y + 20;
jibunnotama.life = 1;
}
i = 3;
}
//🌞Zボタンが押されるとjibunnotama.life に格納される値が1になります ゲーム画面に自分の弾の画像データの表示が可能となります
if (jibunnotama.life == 1) {
DrawGraph(jibunnotama.x, jibunnotama.y, jibunnotama.graphichandle, TRUE);
jibunnotama.x = jibunnotama.x + 10;
if (jibunnotama.x > 640)
jibunnotama.life = 0;
//🌞🌞 jibunnotama.lifeが0の値をもつと自分の弾の画像はゲーム画面に表示されなくなります
}
if (i > 0) { i = i -1; }//👈🌞🌞🌞ここです
if ((key & PAD_INPUT_A) && (i == 0)) {
if (jibunnotama1.life == 0) {
jibunnotama1.x = jibunnohikouki.x + 35;
jibunnotama1.y = jibunnohikouki.y + 20;
jibunnotama1.life = 1;
}
i = 3;
}
//🌞Zボタンが押されるとjibunnotama1.life に格納される値が1になります ゲーム画面に自分の弾1の画像データの表示が可能となります
if (jibunnotama1.life == 1) {
DrawGraph(jibunnotama1.x, jibunnotama1.y, jibunnotama1.graphichandle, TRUE);
jibunnotama1.x = jibunnotama1.x + 10;
if (jibunnotama1.x > 640)
jibunnotama1.life = 0;
//🌞 🌞jibunnotama1.lifeが0の値をもつと自分の弾1の画像はゲーム画面に表示されなくなります
}
ScreenFlip();
ClearDrawScreen();
};
DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます
return 0; // プログラムを終了します
}
デバッグなしで実行をしてから一度プログラムを終了し
生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです
👇
https://youtu.be/G8prhfmc-cs
(そのまま動画をみただけではわかりにくいのですが
動画を一時停止してみれば弾が2連射されているのがよくわかります)
ソーラー「このプログラムは直しようがないので
しょうがない
あらたな連射プログラムの道を模索しましょう」
マックス「ぬああにぃぃ~」
solarplexuss「うちも
わっかりませ〜ん」
マックス「いったい
どうなってるんだ?
仕組みがわからぬぅぅ」
solarplexuss「ほんと
どうなってるのかな?」
マックス「
どう考えても
プログラムに問題ないようにみえるんだよなあ」
ソーラー「このように
プログラムが理論上正しくても
実際に稼働させてみると
うまく機能しない場合があります
注意してね💖」
マックス「ひいい
なんじゃそりゃああ」
ソーラー「結論として
このプログラムで
Zボタンを押したとき
弾が2連射されつづけるようにすることは
できません」
solarplexuss「なんでそうなるのよー」
ソーラー「
そこで
このプログラムを
新たに書き換えてみようよ
このプログラムで培った技術は
次のプログラムでも使えます💖」
マックス「書き換えるって言ってもなあ
書き換えるところなどないのではないか?」
ソーラー「そうですね
確かにそのようにみえますが・・・
以下のように新たなプログラムを構成してみました
ℤボタンを押しつづけていると
連続した弾が発射され続けるプログラムのプロトタイプはこちらです
👇
マックス「プロトタイプ~?まだ未完成ってことかあ~」
👇
#include "DxLib.h"
struct Character {
int x;
int y;
int graphichandle;
int life;
};
//👆🌞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[3];
for (int i = 0; i < 2; i = i + 1) {
jibunnotama[i].x = 0;
jibunnotama[i].y = 0;
jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].life = 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) {
for (int i = 0; i < 2; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;//👈🌞ここですね
}
}
}
for (int i = 0; i < 2; i = i + 1) {
if (jibunnotama[i].life == 1) {
DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);
jibunnotama[i].x = jibunnotama[i].x + 10;
if (jibunnotama[i].x > 640)
jibunnotama[i].life = 0;
}
}
ScreenFlip();
ClearDrawScreen();
};
DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます
return 0; // プログラムを終了します
}
デバッグなしで実行をしてから一度プログラムを終了し
生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです
👇
https://www.youtube.com/watch?v=28jncLqDckw
(そのまま動画をみただけではわかりにくいのですが
動画を一時停止してみれば弾が2連射されているのがよくわかります)
マックス「動画がちょっとわかりにくいじゃないか?
弾がぶれっぶれに分身してないか?」
ソーラー「自分の弾と自分の弾1の状態は
動画を一時停止して観察してね💖」
マックス「どれどれ 一時停止か・・・
お
くっきり
自分の弾と自分の弾1の画像が表示されているじゃないか
なんだ?
Zボタンを押し続けていると
自分の弾と自分の弾1
が2連射されたあと
ちゃんと
次の発射時も
その次の発射時も
・
・
・
ちゃんと
自分の弾と自分の弾1
が2連射されているようだが・・・
どうなってるんだ?
さっきは単発しか発射されなかったのに
何でちゃんと
自分の弾と自分の弾1
が連続して発射されるようになったんだ?
意味わからんんん
だが・・・
ちょっと難点があるとすれば
自分の弾
と
自分の弾1の距離がちかすぎるってことか・・・
なんか
自分の弾
と
自分の弾1
が
くっつきすぎてないか?
ふ~む
それにしても
このプログラムはさっきのプログラムと似ているよなあ
ううん?なんだ?
if (key & PAD_INPUT_A) {
for (int i = 0; i < 2; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;//👈🌞ここですね
}
}
のなかに記述されている
break;//👈🌞ここですね
は?
なんで
ここに
break;//👈🌞ここですね
が登場してくるんだ?
break;
が実行されるとfor{}文のブロック{}内の命令文の繰り返し
から
抜けるんじゃなかったか?
何でここで登場してくる?
いったい
どういう仕組みなんだ?」
solarplexuss「ほんとだあ
if (key & PAD_INPUT_A) {
for (int i = 0; i < 2; i = i + 1) {
if (jibunnotama[i].life == 0) {
jibunnotama[i].x = jibunnohikouki.x + 35;
jibunnotama[i].y = jibunnohikouki.y + 20;
jibunnotama[i].life = 1;
break;//👈🌞ここですね
}
}
のなかに
break;//👈🌞ここですね
が記述されている・・・
宇宙に浮いている感覚だ・・・」
マックス「ど~いう感覚なんだ? それは?」
ソーラー「そこは気になるところだけど
そこは今はおいておいて・・・
このプログラムでは
Zボタンを押し続けていると
自分の弾と自分の弾1
が2連射されたあと
ちゃんと
次の発射時も
その次の発射時も
・
・
・
自分の弾と自分の弾1
が2連射されています
が
自分の弾と自分の弾1
が
くっつきすぎているのが難点です
自分の弾と自分の弾1
の距離は
いくらでも
調整することができるようになるんだけど
そのお話は
次回のエピソード以降で解説されます」
solarplexuss「それにしても
いきなり
新たなプログラムがあっさり構築されてない?」
ソーラー「えへへ
さっきのプログラムでは
自分の弾のデータを取り扱うのに
jibunnohikoukiのCharacter型の構造体変数宣言
struct Character jibunnohikouki;
//👆🌞jibunnohikoukiの構造体変数宣言です
を行って
Character型の構造体変数jibunnohikoukiのメンバ変数
jibunnohikouki.x
jibunnohikouki.y
jibunnohikouki.graphichandle
jibunnotama.life
を生成し
Character型の構造体変数jibunnohikoukiのメンバ変数
jibunnohikouki.x
jibunnohikouki.y
jibunnohikouki.graphichandle
jibunnotama.life
を
jibunnotama.x = 0;
jibunnotama.y = 0;
jibunnotama.graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama.life = 0;
と初期化していました
次に
自分の弾1のデータを取り扱うのに
jibunnohikouki1のCharacter型の構造体変数宣言
struct Character jibunnohikouki1;
//👆🌞jibunnohikouki1の構造体変数宣言です
を行って
Character型の構造体変数jibunnohikouki1のメンバ変数
jibunnohikouki1.x
jibunnohikouki1.y
jibunnohikouki1.graphichandle
jibunnotama1.life
を生成し
Character型の構造体変数jibunnohikouki1のメンバ変数
jibunnohikouki1.x
jibunnohikouki1.y
jibunnohikouki1.graphichandle
jibunnotama1.life
を
jibunnotama1.x = 0;
jibunnotama1.y = 0;
jibunnotama1.graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama1.life = 0;
と初期化していましたね
この新たなプログラムでは
まず
この部分を配列を使って
struct Character jibunnotama[2];
//👆🌞Character型の構造体変数の配列宣言です
for (int i = 0; i < 2; i = i + 1) {
jibunnotama[i].x = 0;
jibunnotama[i].y = 0;
jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].life = 0;
}
に
置き換えています」
マックス「なんで配列が出てくるんだ?」
ソーラー「配列を使えば
簡単に
大量のデータを取り扱うことができるようになります
今のプログラムの場合
自分の弾
自分の弾1
の2つだけしか取り扱っていません
ですので
自分の弾
自分の弾1
の
2つのデータを取り扱うための
Character型の構造体変数の配列宣言の要素数は
struct Character jibunnotama[2];
のように
2
に設定しています
struct Character jibunnotama[2];
を実行すると
2つのCharacter型の構造体変数
jibunnotama[0]
jibunnotama[1]
のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
が
生成されることになります
配列をもちいて
Character型の構造体変数
jibunnotama[0]
jibunnotama[1]
を作製したことにより
Character型の構造体変数jibunnotama[0]のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
を初期化するのに
jibunnotama[0].x =0;
jibunnotama[0].y =0;
jibunnotama[0].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[0].life =0;
と
jibunnotama[1].x =0;
jibunnotama[1].y =0;
jibunnotama[1].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[1].life =0;
を
実行しなくても
配列とfor{}文を用いて
for (int i = 0; i < 2; i = i + 1) {
jibunnotama[i].x = 0;
jibunnotama[i].y = 0;
jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].life = 0;
}
を行うことにより
Character型の構造体変数jibunnotama[0]のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
を
簡単に初期化することができるようになります
今は
自分の弾
自分の弾1
のデータしか取り扱っていませんでしたが
自分の弾
自分の弾1
自分の弾2
自分の弾3
自分の弾4
の
5つのデータを取り扱う場合は
Character型の構造体変数の配列宣言は
struct Character jibunnotama[5];
のようになります
5つの
Character型の構造体変数のメンバ変数が必要になるので
Character型の構造体変数の配列宣言の要素数は
struct Character jibunnotama[5];
のように
5
となるよね
struct Character jibunnotama[5];
を実行すると
5つのCharacter型の構造体変数
jibunnotama[0]
jibunnotama[1]
jibunnotama[2]
jibunnotama[3]
jibunnotama[4]
が作製され
Character型の構造体変数jibunnotama[0]のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
と
Character型の構造体変数jibunnotama[2]のメンバ変数
jibunnotama[2].x
jibunnotama[2].y
jibunnotama[2].graphichandle
jibunnotama[2].life
と
Character型の構造体変数jibunnotama[3]のメンバ変数
jibunnotama[3].x
jibunnotama[3].y
jibunnotama[3].graphichandle
jibunnotama[3].life
と
Character型の構造体変数jibunnotama[4]のメンバ変数
jibunnotama[4].x
jibunnotama[4].y
jibunnotama[4].graphichandle
jibunnotama[4].life
が生成されます
Character型の構造体変数jibunnotama[0]のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
と
Character型の構造体変数jibunnotama[2]のメンバ変数
jibunnotama[2].x
jibunnotama[2].y
jibunnotama[2].graphichandle
jibunnotama[2].life
と
Character型の構造体変数jibunnotama[3]のメンバ変数
jibunnotama[3].x
jibunnotama[3].y
jibunnotama[3].graphichandle
jibunnotama[3].life
と
Character型の構造体変数jibunnotama[4]のメンバ変数
jibunnotama[4].x
jibunnotama[4].y
jibunnotama[4].graphichandle
jibunnotama[4].life
を初期化するのに
jibunnotama[0].x =0;
jibunnotama[0].y =0;
jibunnotama[0].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[0].life =0;
と
jibunnotama[1].x =0;
jibunnotama[1].y =0;
jibunnotama[1].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[1].life =0;
と
jibunnotama[2].x =0;
jibunnotama[2].y =0;
jibunnotama[2].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[2].life =0;
と
jibunnotama[3].x =0;
jibunnotama[3].y =0;
jibunnotama[3].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[3].life =0;
と
jibunnotama[4].x =0;
jibunnotama[4].y =0;
jibunnotama[4].graphichandle=LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[4].life =0;
を実行しなくても
🌞配列とfor{}文を用いて🌞
for (int i = 0; i <
jibunnotama[i].x = 0;
jibunnotama[i].y = 0;
jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");
jibunnotama[i].life = 0;
}
を行うことにより
簡単に
Character型の構造体変数jibunnotama[0]のメンバ変数
jibunnotama[0].x
jibunnotama[0].y
jibunnotama[0].graphichandle
jibunnotama[0].life
と
Character型の構造体変数jibunnotama[1]のメンバ変数
jibunnotama[1].x
jibunnotama[1].y
jibunnotama[1].graphichandle
jibunnotama[1].life
と
Character型の構造体変数jibunnotama[2]のメンバ変数
jibunnotama[2].x
jibunnotama[2].y
jibunnotama[2].graphichandle
jibunnotama[2].life
と
Character型の構造体変数jibunnotama[3]のメンバ変数
jibunnotama[3].x
jibunnotama[3].y
jibunnotama[3].graphichandle
jibunnotama[3].life
と
Character型の構造体変数jibunnotama[4]のメンバ変数
jibunnotama[4].x
jibunnotama[4].y
jibunnotama[4].graphichandle
jibunnotama[4].life
を
初期化することができるようになります」
マックス「
確かにこれは便利だなあ
自分の弾
と
自分の弾1
のデータ
を使って
Zボタンを押したとき弾が2連射されるプログラムを作ってきたが
Zボタンを押したとき弾が10連射されるプログラムでは
自分の弾
自分の弾1
自分の弾2
自分の弾3
自分の弾4
自分の弾5
自分の弾6
自分の弾7
自分の弾8
自分の弾9
の
10個の弾のデータが必要だからなあ
Character型の構造体変数の配列宣言
struct Character jibunnotama[10];
をおこなわず
1つずつ
jibunnotama
jibunnotama1
jibunnotama2
jibunnotama3
jibunnotama4
jibunnotama5
jibunnotama6
jibunnotama7
jibunnotama8
jibunnotama9
の
Character型の構造体変数宣言を行って
構造体変数
jibunnotama
jibunnotama1
jibunnotama2
jibunnotama3
jibunnotama4
jibunnotama5
jibunnotama6
jibunnotama7
jibunnotama8
jibunnotama9
のメンバ変数
jibunnotama.x
jibunnotama.y
jibunnotama.graphichandle
jibunnotama.life
と
jibunnotama1.x
jibunnotama1.y
jibunnotama1.graphichandle
jibunnotama1.life
と
jibunnotama2.x
jibunnotama2.y
jibunnotama2.graphichandle
jibunnotama2.life
と
jibunnotama3.x
jibunnotama3.y
jibunnotama3.graphichandle
jibunnotama3.life
と
jibunnotama4.x
jibunnotama4.y
jibunnotama4.graphichandle
jibunnotama4.life
と
jibunnotama5.x
jibunnotama5.y
jibunnotama5.graphichandle
jibunnotama5.life
と
jibunnotama6.x
jibunnotama6.y
jibunnotama6.graphichandle
jibunnotama6.life
と
jibunnotama7.x
jibunnotama7.y
jibunnotama7.graphichandle
jibunnotama7.life
と
jibunnotama8.x
jibunnotama8.y
jibunnotama8.graphichandle
jibunnotama8.life
と
jibunnotama9.x
jibunnotama9.y
jibunnotama9.graphichandle
jibunnotama9.life
を
初期化していたら大変だぞ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます