2021冬休み開発日記(1)

クレーの冒険

クレーちゃんを育てて、タイピングで敵を倒そう!

設計

大枠

  • 楽をして、とにかくプログラミングを進めて達成感を味わいモチベーションを上げること!
  • UIはプログラムで組むと大変なので、1枚のドット絵を使う
  • クレーは以前作成したドット絵に単純なアニメーションを付けて使う
  • 画像やBGMなどはあまりこだわらず、極力フリー素材を使用する
  • 機能が多くなるのでクラス化する
  • 複雑になるので処理落ちなども懸念されるが、今回は目をつぶる

必要クラス(機能)

  • Sprite…基底クラス
  • Emo…クレーのエモ(Spriteの継承クラス)
  • Charactor…クレーや敵(Spriteの継承クラス)
  • Skill…クレーや敵の技(Spriteの継承クラス)
  • Bgm…ミュージックプレイヤー(効果音は別)
  • Scence…シーンの管理&背景管理
  • Enum…設定保存管理用
  • TextBox…ドラクエ風文字表示
  • Ui…メイン画面以外のメニューなど管理
  • Theater…キャラを自動で動かす演劇管理(Scenceの子分)

やることリスト

  • キャラを自動的に動かすクラスの設計
  • タイピング管理クラスの設計

開発日記

12月23日(木)

Emoクラスを作成。エモ一覧を表示する関数も作成。エモは「ぴぽや」さんの「感情・状態アイコン」を使わせてもらいました。

12月24日(金)

UI画面を作成してゲームっぽい雰囲気を出す。気分も上がって開発意欲も上がる。

12月25日(土)

育成ゲームにするのかタイピングゲームにするのか迷走始まる。こまったこまった。

12月26日(日)

フィールド画面を作成。Aseprite1.3で追加された「Tilemap」が便利すぎて感謝感謝!

12月27日(月)

プログラムが複雑になってきたので、キャラクターや背景などの画像の座標やサイズを管理するTransformクラスを作成することにする。

  • position(x,y)
  • rotation(rot)
  • size(w, h)

ドラクエ風文字表示クラスの作成。メッセージを渡すと指定した座標領域に収まるように整形して、1文字ずつメッセージが表示されていく様にする。

12月28日(火)

シアタークラス。難航しそうだ。とりあえず、表現したいことの一覧を書き出して突破口を見つけてみる。

  • エモ表示…キャラ、エモ番号、持続時間
  • 一時停止…キャラ、持続時間
  • 移動…キャラ、X、Y、持続時間
  • アニメーション…キャラ、種類、持続時間

12月29日(水)

予想通りシアタークラスで難航中。とりあえず、手探りでクラスを実装していく。が、午後から納品があるので準備やらで手が付かず。納品の準備をしながら、休憩中や風呂に入っている時間に解決策を考え続けた。

12月30日(木)

頑張って考えていたおかげで、朝起きたらアイディアがまとまってきた。

12月31日(金)

とりあえず今年はここまで!

1月1日(土)

お酒飲んで楽しんだ🍺

1月2日(日)

Charactorクラスを使って宝箱が開く演出を作ってみた。クラスをちゃんと作ってあったのですぐ出来て気分が良かった!ただ、クラスや関数が増えすぎて、混乱してきたので、全体像を確認するために図を描いた。

1月3日(月)

昨日はなんだか開発意欲が沸かず、深夜までApexやりまくり🤪さんざんやったので気が済んだ。朝からちゃんと開発開発。
ところが!新しく実装しようとしたテキストボックスのページ送り機能を作っていたら、バグ発見!「とりあえず」的に作ってきた罰なのかApexで遊びすぎた罰なのか。4時間ほど奮闘して解決した。
どんどん先に作り進めたい気持ちに駆られるけど、着実にあいまいな所をツブして行かないといけないね!

1月4日(火)

バグも取れてスッキリした所だけど、思った以上に進まない!これじゃゲームが出来上がるのなんていつになるのやら…という想いに駆られるが、基本機能なくしてゲームは作れないもんね。地道な作業は嫌いではないので、頑張ろう!

停滞しているときは、頭で考えると進まなくなるので、とにかく書き出す!

  • Charactorクラスに「向き」を実装する…12:52完成
  • Spriteクラスの効果音プロトタイプを作ってみる…14:24完成(dict()を学ぶ。便利だ!)
  • Sceneクラスに画面推移効果プロトタイプを作ってみる…21:06完成。というか途中でトラブって残念なプロトタイプになった。

1月5日(水)

若干、開発が疲れてきた。椅子に座っているとイライラするので、片付けをしながらSelectBoxクラスの構想を練る。体を動かすと良いアイディア出るんだよね!

1月6日(木)

イライラの原因が判明!シナリオシステムを主軸に作ってきたけど、肝心のタイピング(戦闘)とか育成システムの実装を考慮していなかったので、そちらのシステムどうやって実装すればいいか検討がつかなくなってきているのを薄々気づいていたからだ。

とりあえずシナリオシステムを現状の方針のまま完成させて、大問題はその後じっくり考えることにしよう!そうしないと不安がチラついて集中できない。

  • Sceneクラスの名前が良くないのでStageクラスに変更する
  • シナリオシステムに分岐処理を実装する
    • シーケンシャルだったけど、Seekで戻れるように修正する
    • Theater LABEL
    • Theater SEEK

1月7日(金)

昨日完成したシナリオシステムに満足して、今日は開発なし。代わりに先延ばしにしていた雑用を片付けた。

1月8日(土)

とりあえずデモを作ろうと、タイトル画像を作り始めたらどっぷりハマってしまった。当初の大枠「簡単に楽に作る」はどこへ行ったのやら〜あっという間に3時間。楽しかったからいいけど🤪

1月9日(日)

オープニングを作ることによって新たな問題に直面。ゲームにはオープニングだったり、戦闘だったり、アイテム購入だったり様々なシーンがあるよね。それぞれのシーンは全く異なる動作やビジュアルが存在するわけで、いわばミニゲームみたいな作品の集まってゲームになっている訳です。なので各シーンの切り替え・管理をスムーズに行う仕組みが必要になる。ということでSceneクラスを実装しないといけなくなっちゃった。またクラス増える〜〜〜〜😭

1月14日(金)

冬休みが終わって時間が取れなくなってしまったが、久しぶりの更新!Sceneクラスについて、ダラダラ書きながら構想を練ってみよう!

  • メンバにそのシーンで使用するCharactorなどのオブジェクトを持つ
  • BGMに関しては全シーンで使用するので、参照だけ渡したほうがいいのかなぁと思う
  • 各シーンをどのように推移させるか?
  • →Theaterと同じようにするのか?
  • 呼び出されたSceneオブジェクトは何をするのか?
  • コントラスタとデストラクタで使用したCharactorなどを生成、消滅をしっかりする必要がある
  • Drawで実行されるようにメソッドを親要素から呼んで貰う必要がある。
  • 親要素はDraw上でSceneオブジェクトを生成、生成後、SceneのDraw的メソッドを呼び続ける
  • Sceneの終了時を感知して、次のSceneオブジェクトを生成。

1月16日(日)

昨日はTheaterクラスの代用になる仕組みを考えているだけで一日終わってしまった。Theaterクラスのメリット・デメリットは…

メリット

  • メソッド一つで順に動作を定義できる。
  • コード上でストーリーが確認しやすい

デメリット

  • SelectBoxなどで選択された項目に対して、分岐処理などが出来ない
  • 複数のオブジェクトの同時進行が出来ない

リストにストーリーを記述する方式を変えて、ストーリーをプログラムで普通に書きたい。どうやらコルーチンを使うと良さそうだというところまで見えていたので、コルーチンと無名関数(ラムダ式)を勉強してみた。

頭から相当な煙が出たけど、4時間ほどでなんとか解決。

    def init(self)
        self.a = self.clTest()
        self.isComplete = next(self.a)
        
    def clTest(self):
        
        self.tb2.setMsg(u"テストだよ1", 20, Enum.AUTO_NEXT)
        self.jin.flash(30)
        print("clTest1")
        yield lambda: not(self.tb2.isActing or self.jin.isActing)
        
        self.tb2.isVisible = False
        self.sb1.setItems(u"あ,い,う,え,お", 30, 3)
        self.klee.flash(30)
        print("clTest2")
        yield lambda: not(self.sb1.isActing or self.klee.isActing)
        
        self.tb1.setMsg(self.sb1.result, 1, Enum.AUTO_NEXT)
        self.sb1.setItems(u"か,き,く,け,こ", 30, 3)
        print("clTest3")
        yield lambda: not(self.sb1.isActing)
        
        self.sb1.setItems(u"さ,し,す,せ,そ", 30, 3)
        print("clTest4")
        yield lambda: not(self.sb1.isActing)
        
        self.isPlaying = False
        yield

1月17日(月)

dict型やコルーチンなどの新しい技術を仕入れたので、今まで作った分かりづらいところを修正することにした。一回作った所を手直しするとソースコードは見やすくなるけど、全体の進展はないからモチベーションがやや下がり気味。でも頑張った甲斐があってソースコードはスッキリ。使い勝手も良くなってメデタシメデタシ。

1月21日(金)

平日はAPEXの誘惑に勝てないので😵週末は頑張って開発する。
システムが複雑になってきて、過去に作ったプログラム(関数の引数)の意味が判別できず、その都度ソースを調べるのが大変なので、引数周りをきれいにすることにした。

  • 第2引数以降はその引数が何なのか関数名から推測しづらいので、Enumで何を渡しているのかわかるように修正する。
  • 初期化関数が多いので、できるだけオブジェクトの生成時に勝手に済ませられるようにする。
self.stage.setStage(5, 10) # 数字だと何のステージかわからないよね
self.stage.setStage(u"璃月") # 日本語で書けると判りやすいよね

1月25日(火)

開発規模が大きくなってきてProcessingのIDEだとコーディングがキツくなってきた。VSCodeでコーディングできるように設定してみた。

  • 自動保存
  • 【プラグイン】indent-rainbow
  • 【プラグイン】ZenKaku
  • 【プラグイン】Trailing Spaces
  • 【プラグインテーマ】Darcula PyCharm Theme→Darcula PyCharm with Dark GUI
  • 【プラグインテーマ】GitHub Them→GitHub Dark Dimmed
  • 【フォント】’M PLUS 1 Code Regular’ 「1」と「Code」の間の空白が1つかと思ったら2個だった!!

タブの移動
alt + command + ← or →

行の移動
alt + ↑ or ↓

折りたたみ/展開
alt + command + [ or ]

折りたたみの切り替え Cmd + K Cmd+ L

すべて折りたたみ Cmd + K Cmd+ 0(ゼロです)
すべて展開 Cmd + K Cmd+ J
再帰的に折りたたみ Cmd + K Cmd+ [
再帰的に展開 Cmd + K Cmd+ ]

VSCodeでGitを使う

https://taccuma.com/install-vscode-and-git-in-win10/

上記のサイトを参考にしながら、ところどころ自分なりに設定してみた。

https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be

アイディア備忘録

基本魔法

基本魔法は習熟度が増すと、攻撃力が上がり、ある程度習熟度が上がるとランクアップして複数or連打が可能になる

  • energyball
  • fireball
  • wind
  • stone

特殊魔法

特殊魔法は、図書館での勉強や、実践でのひらめく。

  • lightning

コメントする