月別アーカイブ: 2023年3月

Linux Mint 21.1 Cinnamon →すこぶる調子が良い。

最近、21.1にUpdateしてみたが、すこぶる調子が良い。Updateする前は、カーネルをアップデートしたらファンが常に回りだして焦ったが、Updateしたら解消されて、現在はすこぶる調子が良い。

マウスの形が可愛くなって、しかも変更の仕方が分からいのが、最初は難点と思っていたが、慣れたら全然問題ないということで、快適なLinux Mintライフを満喫している。

逃げ恥。

久々に最初から見ている。人間模様が楽しい。

それにしても、Netflix。なんて便利。ノンストップで全部見れてしまうのは、病気になるな。

確定申告クエスト(序章)

人生初の確定申告に向けて始動。先々週末に実施予定が、39.0前後の高熱にダウンしたため、3日間の作業がビハインドしていて、少し焦っている今日この頃。

締切の3月15日まであと10日。果たして間に合うのか。

無知という不安の権化を解消すべく、今日は、生まれて初めて税務署へGO。午後に仕事を休んで、最寄りの税務署へ行くも、なんと確定申告の相談は受け付けておらず、4.1Km離れた場所を案内された。

せっかくなので、バスで片道290円の道のりを移動して、案内された税務署へ。

入館すると、すぐに案内されて、大勢がいる待合室に通された。どうやら同じ目的の人々ばかりのようだ。なるほど、今の時期は、確定申告しかないよねって感じ。

30分程待って、案内された。今回は相談だけだったので、結構すんなり。要点だけささっと確認して、5分程で終了。

どうやら最近はe-Taxという、確定申告にもDXの波が訪れていて、デジタル化が進んでいる。話を聞くだけでは、e-Taxは、夜間含めて好きな時に申請できる優れものである。

必要経費などを計算してから、e-Taxで試みてみようと、今日は一旦帰宅。

果たして、うまく行くのだろうか。

日常生活で禅を感じる。

禅の考え方は日常生活で意識すれば体験できるはず。

禅の本質は「今、この瞬間を生きること」だと思っていて、言い換えると、目の前で起こっていることに集中することだと思う。なぜなら、人間は思考する生き物であって、無意識的に過去も現実も未来も、十把一絡げに思考して思考し続けているだろうから、その思考を「今、目の前で起こっていることに集中する」ことで、ある意味で「停止」させているのだろう。

僕の経験から、具体的には、例えば以下のように、何ら変哲もない日常生活の動作をするだけでも感じることができると考えている。

朝起きて、顔を洗う時。蛇口をひねる音、水が出る音、出た水が洗面台に当たる音、手で水を救う音、顔を洗ったときの水と肌が触れ合う音、タオルを手に取った時にタオルと手が触れる音…。

インスタントコーヒーを淹れる時、お湯を沸かすためにポッドを手に取る時の音、ポッドをガス代に置いた時のカチャッという音、ガスをひねって点火するときのチッチッチッという音、換気扇の音、お湯が沸こうとしている時の音、お湯が沸いたときの音、ポッドからカップにお湯を注ぐ音…。

音で雨が降っている。家のソファに座って、眼を閉じる。雨が降る音、降った雨が壁や地面に当たる音、車のエンジンの音、車のタイヤが濡れている地面に接して通過していく音、風が吹く音…。

こういう細かだけど、確かに発生する音を聞き逃すまいとすることでも、今この瞬間を生きることができていると思う。瞑想もできている気がする。頭の中がスッキリするときもある。

何気ない日常で感じることができるなら、時間とお金の費用対効果は最高だし、なによりこんなに幸せなことはない。

どうなる確定申告。

①副業と、②不動産収入、そして③ふるさと納税。

会社での年末調整は終わっているものの、これら3つの新要素が今年度は発生しているので、確定申告に初挑戦。

ただ、先週末に謎の39.0前後の高熱に3日間やられてしまい、予定していたタスクがさばけておらず、結構焦っている。

来週日曜日には、シビックテックの発表会もあって、プロトタイプ作成しているが、こちらもビハインドしているし…。

さて、どうしたものか。なんだかおもしろくなってきた。とりあえず、寝よう。

JSでゲーム開発の勉強メモ

index.html

画面を表示するためのhtmlファイル。body部分で、JSコードを読み込む。

main.js

JSのメインとなるコード。ゲームの主軸となる流れを書いていく。書く中で、各種JSファイルを適宜読み込んでいく。

game.js

ゲームエンジンのメインとなるコード。ゲームエンジンとは、ゲーム作りに使う機能をあらかじめ作ってまとめたもの。

例えば、画像や文字を表示する機能などを作っておく。そすうると、同じ機能を都度作成せずに、必要な時に呼び出せばOKなので、効率よく、かつ開発者目線でも分かりやすく開発することができる。

UnityやUnreal Engine、melon.js、phina.jsなどが有名。

canvas

HTML5の機能。絵を描画する範囲を示す。今回は、game.jsのコンストラクタでcanvasをcreateElementしてbodyに追加する形で使っていく。

メインループ(game.js内)

ゲームプログラミングでは、①変数、②条件分岐、③繰り返しがよく使われる、というか常に使われている。描画は繰り返し実行される。いわば、アニメでいうワンシーンごとを描画しているイメージ。特に、繰り返しは常に行われており、これをメインループとして実装する。

game.js内に、メインループおよび、メインループを呼び出す関数を書く。

メインループでは、canvasのコンテキストを呼び出して描画するという内容を書いておく。実際には、game.jp内に描画するモノ=オブジェクトを格納する配列を用意しておいて、スプライドのupdate()を呼び出す際の引数とし渡すことで、意図したオブジェクトを繰り返し描画する。

なお、オブジェクト格納する配列に、オブジェクトを追加していく関数はgame.jpにメインループとは別関数として書いておく。

スプライト

ゲームに表示させるキャラや背景などの画像をスプライトと言う。

ゲームエンジンの一つとして記載する。コードは別ファイルに保存する(例えば、sprite.js)。

sprite.jsの中身は、画像ファイルへのパスを受け取って、Imageクラスのインスタンスを作って、x座標y座標を初期化するコンストラクタと、画像を表示するためのメソッドであるrender()、およびrender()を呼び出して実際に画像を描画するためのメソッドupdate()とする。

個人的には、描画するコードを記載しているrender()と、そのrender()を呼び出すupdate()を別々に記載している構成が参考になった。一見、render()とupdate()は一緒にしておいて良さそうだが、「機能」と「その機能を実行する機能」を別々に記載しておけば、インスタンスを作って操作する際に細かな作り込みができそうなので良いのだろう、と今は思っている(要するに、現時点では、関数を分ける意味がなんとなく感覚でわかっているというレベル)

キー入力で操作できるようにする

game.jsにkeybind関数やeventListener()を使って、使うキー(今回は上下左右の矢印キー)の登録と、キーが押下された際の挙動を書く。

シーンを描画できるようにする

シーン専用のクラスを作成する。シーン(オブジェクト)を詰め込む配列と、その配列にシーンオブジェクトを追加するメソッドを書く。

game.jsでシーンを入れておくための専用の配列および、現在のシーンを格納する変数を用意する。また、シーンを追加するためのadd関数も用意する。

main.jsでシーンオブジェクトを作成する部分と、指定したシーンにスプライトを格納する部分、そしてそのシーンをgameに追加する箇所を記載する。

シーンクラスを作成するメリットは、画像や音楽や別シーンへの切り替えといった中身をシーンごとに記載して整理することができること。RPGはシーンの集まり、シーンの入れ替わりと考えると、確かにこの構成、すなわちシーンごとに機能を記載するプログラム構成は正しいと言える気がする。

タイルとタイルマップ

タイルマップとは、タイルを組み合わせることで作られるマップのこと。タイルとは、マップを構成する最小単位=部品のこと。

タイルマップ用にTilemapクラスを作成。基本構成はスプライト用のクラスと同じ。

コンストラクタで、Imageのインスタンスを作成して、タイル用のファイル指定や、xy座標、タイルの最小単位サイズを指定する。今回は32ビット。あと、二次元配列でマップを作れるようにするための配列も用意。

このTilemapクラスでも、描画する機能のrender()関数と、そのrender()を呼び出すためのupdate()関数を記載。update()では常に呼び出されるオーバライド用の関数も作成。

Tilemapクラスは、main.jsで呼び出して使う。マップ用の二次元配列は、main.jsに直で記載指定も良いが、map.jsとして別で記載しておけば、頭の整理がしやすい=分かりやすい構成になる。

キャラクターはタイルマップ上に表示するが、タイルの種類によって通過できる・できないを判定したり、例えばゴールや扉のような特定の場所に触れたら条件付きで動作を変更するなどの処理を施す場合は、単にスプライトとして表示するのではなくて、タイルとしてキャラも表示する方が処理がしやすい(のこと)。

そのため、タイルとしてキャラを表示するために、Tileクラスを作成。この際に、Spriteクラスを継承する。

タイルはタイルマップ上に存在する(ようにする)ため、タイルマップは同時に移動したり、タイルマップの何番目のタイルとして表示するかを取得したりする。

キャラクターではなくタイルマップを移動する

タイルマップのサイズが大きくなったら、キャラを移動させるよりも、代わりにタイルマップを移動させることで、あたかもキャラを操作しているように見せた方が便利だ。すなわち、常にキャラを中央に位置しておいて、タイルマップ(背景)を動かすようにする。

キャラを基準に、その背景であるタイルマップや、タイルマップ上に表示する他の部品(村人キャラなど)を設置して、なおかつキャラではなくてタイルマップを移動させる。キャラ自身もクラスやその継承でタイルマップやタイルと同じように表示するので、移動するかどうかの同期を取る・取らないの機能を追加した方が扱いやすい。

進もうとする先が、移動できるか・できないかを判定するための機能も実装する。some()というJSの関数を活用すると、簡潔に実装できる。

その他

各クラスやインスタンスで使用する「this」というものが、最初はなかなか分かりにくかったけれど、「そのインスタンス」を意味するということと、thisのおかげで他のインスタンスや条件などど比較したり参照したりできるということが、RGPを作成することが理解できた気がする。

thisって慣れないと、たまがごちゃごちゃする。というか、クラスとインスタンスという概念を、机上だけでなくて、実際にスクリプトを組むという手を動かしたり、デバッグなどの経験を通すことで「ちゃんと理解する」といいうことが大事だな、と改めて痛感。何でもそうだけど。

参考サイト

JavaScriptでRPGを作ろう!スマホにも対応したゲームの作り方
https://original-game.com/make-an-rpg-with-javascript/

FF

僕のFFは9で終わっているんだけど、たまたまYouTubeで10を見たら、8よりも映画っぽくなってて驚いた。あの頃のトレンドって、こういうのだったのか?

最新作の13とかどうなってるんだろう。召喚獣のシーンはYouTubeで見て、なんかもうゲームというジャンルじゃないなって思った記憶はある。ストーリー展開とか、演出とか、10よりもすごいのだろうな。

シビックテックのハッカソン大詰め。

2023年3月12日、すなわち来週の日曜日に、「シビックテックによる市民協働のまちづくりシンポジウム」が予定されている。

これは、沖縄県宜野湾市において、今まで取り組んできたシビックテック(講座やハッカソン)の結果をお披露目する場でも会って、僕もプレゼンすることになっている。

シビックテックによる市民協働まりづくり講座2022
https://ginowan-civictech-2022.ipublishing.jp/

今日は、本番前のメンバMTG。プレゼン資料はだいたいできているけれど、プロトタイプがまだできていない。僕が開発しているが、先週末は風邪で39.0度近くの熱が3日も続いていて、作業する予定が全くできずに、ビハインドしている状態だ。

メンバに現状共有したし、プレゼン資料もOKそうなので、あとはできるだけ作り込んで、プレゼン当日に臨むだけだ。ということで、残り時間は、プレゼン資料を修正して(これも僕が実施)、時間ギリギリまで開発だ。やれるだけことは、やろう。

ちなみに、僕は介護チームに所属している。「介護の関係人口が少ない」ことを本質の課題と捉えていて、解決のために「ゲームの活用」ということで、介護に関するRPGを開発している。

検討・議論していて改めて思ったけれど、ゲームって、実はとても良い手段だ。気軽にできるし、きっかけとか、とりかかりのハードルが下がるからだ。

ゲームの特性を戦略的に活用する思想である「ゲームにクス」も勉強する予定。

社会貢献はゲームでできる、というか、ゲームだからできる、と言っても過言じゃないとすら思えている。自分でも予想していなかったが、ゲーム開発にハマっているここ最近。おもしろい。

3月4日は三線の日。

沖縄では、3月4日は三線(さんしん)の日ということで、本日は、会社の上司の三線発表会におじゃました。

とある先生の門下生一同による発表会。みなさん一生懸命演奏されていてよかったし、上級者の沖縄の古典演目には目を見張るものがあって、参加した良かった気がする。

なぜか抽選大会があったのと、代表のあいさつがなんと言うか、自分に酔っている感じがして、誰得のイベント?と思ったのが残念だった。イベントの実施も、目的や対象(ターゲット)、そしてその対象に何を伝えたいのかを明確にしないといけないな、と改めて勉強になった。