アイワナ:継承のすゝめ
アイワナでボスとか作る時に継承という機能を使うと便利ですよって話です.
たぶん使ったことがある機能だとは思いますが,使い方によってはもっと便利だよっていう記事になります.
継承とは?
親オブジェクトの動作などを子オブジェクトに引き継ぐことができる機能です.
継承をするとどうなるかというと,
- 上書きされていないイベント(Create, Step, etc...)が子オブジェクトにも適用される
- 他のオブジェクト中のCollision[親オブジェクト]イベントが,子オブジェクトに接触したときにも動作する
ということが起こります.
ということで,ここからはこの2つの動作について詳しく説明します.
オブジェクト編集画面のParentってとこから継承をすることができます.
イベントの継承
簡単な例で説明します.
object_pを作成し,Createイベントに以下のようなコードを書き込んだとします.
//object_p create event image_speed = 0
次に,object_pを継承したobject_cを作成します.
『object_pを継承する』というのは,Parentがobject_pになっている状態です.
このとき,object_cのCreateイベントは親から継承したものとなっているため,image_speed = 0
が適用された状態となっています.
ではここで,イベントの上書きをしたらどうなるでしょう?
object_cのCreateイベントに以下のようなコードを書き込んだとします.
//object_c create event depth = 10
この状態では,親オブジェクトのCreateイベントは上書きされ,depth = 10
という部分のみが動作する状態となります.
では,「object_cのCreateイベントだけではなくobject_pのCreateイベントも実行したい」というときはどうすればいいでしょうか?
これは,event_inherited()
という命令によって実現できます.
この命令は,親オブジェクトの同じイベントを実行するというものなので,object_cのCreateイベントを以下のようにすることで両方のCreateイベントが実行されることになります.
//object_c create event event_inherited() depth = 10
Collisionイベントの動作
これは,実際のオブジェクトを使って説明します.
某エンジンのPlayerオブジェクトの中を見てみると,Collision[playerKiller]イベントがあります.このCollisionイベントの中身は以下のようになっています.
//collision playerKiller event killPlayer()
playerKillerオブジェクトに接触したときにプレイヤーが死ぬという簡単なコードです.
しかし,アイワナを作成するときにステージ上にplayerKillerオブジェクトを配置することはありません.
ではなぜ針やリンゴに接触したら死ぬのか?
これは針やリンゴのオブジェクトがplayerKillerを継承しているからです.つまり,触れたら死ぬオブジェクトを作成したいときにいちいちPlayerのCollisionイベントに追加する必要はなく,playerKillerを継承すればいいだけになります.
イメージとしてはplayerKillerを継承しているspikeDownは,spikeDownであると同時にplayerKillerである,みたいな感じです.
継承を使うと何ができるの?
ここまでの話を聞いててもそんなの知ってるし今更いらんわっていう意見あると思いますが,もうちょっと工夫するともっと便利になります.
え?これも知ってるって?すいません...
実際に使ってみる
「複数体のボスを作る」という場面を考えます.
このとき,どのボスにも弾が当たったときに
- HPを減らす
- 効果音を鳴らす
- ヒットエフェクトを出す
- 無敵時間を発生させる
- 当たった弾を消す
などの共通する処理を書くことになると思います.
ボスを作るたびにこれらの処理全てを書いてもいいのですが,さすがにめんどくさいし無駄じゃないですか?
そこで,ボスの基本形となるオブジェクトを作り,それを継承することでボスの作成が少し簡単になります.
ボスの基本形を作る
ボスの基本形となるオブジェクトboss(playerKillerを継承)を作成し,必要な処理を書いていきます.
ちなみに,playerKillerを継承しているbossを継承すると,playerKillerも継承された状態になります.
bossのCollision[bullet]イベントと,無敵時間を解除するためのalarm[11]はこんな感じ.
//collision bullet event if(image_blend != c_gray){ hp -= 1 image_blend = c_gray alarm[11] = 60 } sound_play(sndBossHit) with(other){ repeat(3) instance_create(x, y, hit_effect) instance_destroy() }
// alarm[11] event image_blend = -1
だいたいさっきボスに必要だといった処理を書いてますが,ちょっと変な処理としてはimage_blend
を使っているところです.
以下の記事でも書いていますが,image_blend
を使うと簡単に色をちょっとだけ変えることができます.
toki0177.hatenablog.com
ここでは無敵時間中にちょっと見た目が暗くなるようにしています.
そしてここで作ったbossオブジェクトを継承して実際のボスを作成することで,弾が当たったときの処理とかをいちいち書く必要がなくなるわけです.
HPバーを表示するとかも全部のボスに共通する処理だと思うので,親オブジェクトに書いておくと楽ですね.
まとめ
継承って機能を使うと,いろいろ楽になるし便利なのでどんどん使いましょうって話でした.
ここではボスの作成のみについて話しましたが,道中にザコ敵を出すみたいな,似たようなオブジェクトを複数作る予定があるなら積極的に使っていきましょう.
あとimage_blend
も便利だよ.
久しぶりに本を衝動買いした
たぶんこの記事はネタバレを含みません.
偶然暇だったので,冴えカノの劇場版を公開初日に見てきました.
これまでに放映されたアニメはすべて見ていて小説も途中までは集めてるくらいにはかなり好きな作品だったので,どんな終わり方するのかなあと楽しみに思いながら見に行ったわけです.
本当に面白かったし,素敵な作品でした.
ラブコメというくくりで話してしまうのはもったいない,今までに自分が出会ったことのない物語だと感じました.
小説にしろアニメにしろ,普通に面白いぐらいの作品だと完結したときにすっきりした気持ちが大きいのですが,本当に面白くてドハマりしているような作品だとすっきりした気持ち・満足感よりも喪失感みたいなものを強く感じてしまうんですよね.
冴えカノはまさしくそうでした.
とてもきれいに続く余地なく終わってしまったので,本当に面白かったと思う一方でもっと続きを読みたいという気持ちが拭えません.
この感じもまた好きなのでいいですが.
でまあここからはタイトル通りです.
途中までしか集めていなかったし,最近は残りを集めようということも考えていなかったんですが劇場版を見た後は文章で読みたくてたまらなくなってしまい,思わずポチってしまいました.
本を衝動買いするのってなんか楽しいですよね.
届くのが待ち遠しいです.
あともう1回ぐらい見に行こうかな.
十二国記が楽しみすぎて勢いで書いた記事
タイトルの通り.
十二国記というシリーズの(たぶん)5年ぶり18年ぶりの新作が10月12日に発売されるということで,とりあえずなんか書いとけの精神で書いているわけです.
台風のせいで発売日には買えなさそうではありますが...
自分がこの作品と出会ったのは小説からではなくアニメからでした.
当時はアニメ作品としてとても面白く見ており,後から原作小説の存在を知りました.
1巻のタイトルは『月の影 影の海』.
当時の絶賛中二病発症中だった自分はこのタイトルにも強く惹かれて読み始めたわけです.
これがめちゃくちゃ面白かったんですよ.
衝撃を受けました.
自分の中での最高の作品リストに新たなシリーズが加わりました.
この作品にこれほどまでに惹きこまれる理由はなんだろうって考えたときに,やっぱり一番大きいのは世界観なんですよね.
十二国記の世界観のどこが素晴らしいっていうとそれはリアリティだと思います.
実際にありそうという意味ではなく,十二国記に出てくるような世界が存在していたとしたら作中に書かれているような文化・慣習・人々の生活などが存在しているのだろうという,ファンタジー世界の設定に従う場合でのもっともらしさみたいなものです.
このようなリアルな設定で,さらにリアルな登場人物たちが出てくるわけです.
登場人物のリアルさもさっき書いたのと同じように,「そのような過去を持った,こういう人物がいたら実際にそのように振る舞うだろうな」と思わせるような説得感みたいなものですね.
『月の影 影の海』の主人公はごく普通の女子高生で,ある日突然異界に行くことになるわけです.
もちろんすぐにそんな世界に馴染めるはずもなく,最初は様々なことに戸惑い,騙され,徐々に世界に順応していく.
この過程がとてもリアルで,本当に面白い.
この作品の魅力として他にも考えられるのは「実在しない獣・妖魔」の存在です.
ファンタジー小説の面白さとしてこのような存在しないものの姿を想像することが挙げられると思うのですが,この作品はそういったモノの描写が丁寧で,それでいて想像の余地を残しているので自分の中での姿を思い描くことができるわけです.
アニメもアニメで良さはありますが,自分が本という媒体が好きなのはこういうところです.
読み手によって異なる形をとる,というのはいかにも怪異譚らしくていいですね.
今回新作が出るのは12国あるうちの「戴」という国についての物語です.
この国の物語は途中までは描かれており,5年間未完の状態でした.
十二国記のシリーズの中でもこの国の物語は「異端」といってもいいような物語だと思っています.
続編がいつか出るんじゃないかと待ち続けていたものがついに出るということで本当に嬉しいです.
思わずこんな記事を書いてしまうほどには嬉しいです.
特にまとまりも流れもない文章を書きなぐってしまいましたが,新作を楽しみにしながら台風を耐えたいと思っています.
需要とか関係なくまたこういう思ったことを垂れ流すだけの記事を書くのも悪くないかなと思ったりも.
新作アイワナを投稿した話
タイトル通り,新作アイワナを投稿しました.
タイトルは「I wanna be the Palette」です.
ダウンロードはこちらからできます!
長さは中編ぐらいの感じ.
道中は針・罠とボスで,耐久もあります.
道中は難易度低め,耐久は少し難易度高めになってます.
タイトル画面はこんな感じ.
この画面見ても何もわかりませんが,プレイしていくと少し変化があります.
制作開始が実は2018年の8月ぐらいだった気がするのでかなり時間がかかってますがほとんどサボってたせいですね.
耐久作成が初めてだったりとか,それなりに頑張ってるので是非遊んでみてください!
このアイワナの制作中に知った便利な関数とかそういうのも紹介していきたいですね.
AnacondaのNumPyとPyPIのNumPyの違いについて
以前の記事で書いたnumpy.ndarray.copy()が遅かったという話の補足みたいな記事.
numpy.ndarray.copy()が遅かったという話 - とりあえずなんか書いとけ
copy()がpipでインストールしたPyPI版のNumPyでとても低速だったのに,condaでインストールしたAnaconda版のNumPyでは十分高速に動作した理由を見つけたので,載せておきます.
minus9d.hatenablog.com
原因としては実装の違いっぽいですね.
自分はcopy()について言及しましたが,他の命令についてもだいたいAnacondaのNumPyのほうが高速でしょう.
リンクを貼った記事を見たところ,実行が高速なだけでなくCPUの負荷もAnacondaのNumPyのほうが優れているようで,動作の重いプログラムを実装するときはAnacondaのNumPyを使う方がいいのかもしれません.
流行りのニューラルネットワークだかディープラーニングだかをやってみたいし,動作が少しでも軽いに越したことはないですね.
MacでPythonの環境を構築する
タイトル通りMacでPython3の環境を構築していきます.
セットアップした直後の何もいじっていない状態からです.
調べればいろいろ出てきますが,自分で覚えておく用に.
主に以下のサイトを参考にしました.
startappdevfrom35.com
Homebrewのインストール
まずはターミナルを起動して以下のコマンドを実行し,Homebrewをインストールします.
Homebrewはパッケージ管理を行ってくれる感じのやつだと思います.
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
これを実行すると,HomebrewとXcodeのCommand Line Toolsをインストールしてくれます.
インストールしたら以下のコマンドで正常にインストールできてるか確認.
$ brew doctor
これを実行して以下のような出力がされればOKです.
Your system is ready to brew.
次に,コマンドラインのアプリケーション以外(PyCharm入れたい)をインストールできるようにするためにHomebrew-Caskを導入します.
$ brew tap caskroom/cask
とりあえずHomebrewはこれでOKです.
pyenvのインストール
今回はpyenvで環境を作っていくので,pyenvとvirtualenvのインストール.
$ brew install pyenv-virtualenv
そして~/.bash_profileに以下のものを追加します.
今回は.bash_profileがまだ無かったので作成する部分から.
cdだけ入力してホームディレクトリに移動し,ファイルを作成します.
$ cd
$ vim .bash_profile
書き込む内容は以下の通り.
export PYENV_ROOT=${HOME}/.pyenv if [ -d "${PYENV_ROOT}" ]; then export PATH=${PYENV_ROOT}/bin:$PATH eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" fi
Pythonのインストール
pyenvを用いてPythonのインストールをしていきます.
以下のコマンドでインストール可能なPythonのバージョン一覧を表示することができます.
今回は記事の執筆時点で最新安定版である3.7.2をインストールします.
最新安定版は以下のページから確認できます.
Download Python | Python.org
この記事に書いてある方法でもできます.
pyenvでPythonの最新安定版をインストールするワンライナー - Qiita
ということで以下のコマンドを実行.
$ pyenv install 3.7.2
$ pyenv global 3.7.2
$ python --version
これでバージョンを確認すると3.7.2になるはずだったのですがやってみたらデフォルトでインストールされてる2.7.10になっていました.
ということでこれも変更しました.
参考にしたのは以下の記事.
pyenvでPythonがSystemバージョンから切り替わらない時の対処 - Qiita
そして無事にバージョンがPython3.7.2になりました.
PyCharmのインストール
Pythonのインストールは終わりましたが,ここからはPyCharmのインストールを行っていきます.
無料版のPyCharm Community Editionをインストールするので,実行するコマンドは以下の通り.
$ brew cask install pycharm-ce
これでインストールされたらFinderから起動して,あれやこれやして完了です.
最後雑になりましたが,こんな感じです.
まとめ
無事に初期の状態からPythonのインストールができました.
今後もパッケージのインストールとかいろいろ書いていくと思います.
コーディングにおすすめのフォント
コーディング向けのフォントみたいなのはたくさん出てきますが,個人的には一択だと思うぐらい気に入っているフォントがあります.
それがRicty Diminishedです.
かなり有名なので知ってる人も多いと思いますが,それでも書きたかったので書きます.
あとコーディングって言ってるけどエディタだけじゃなくコンソールとかでも使いやすいです.
このフォントの一番の魅力は可読性と文字のバランスでしょう.
半角と全角の文字幅が1:2になっていたり,Iと1などの文字が判別しやすくなっています.
あまり書くこともありませんが使いやすいのでコーディングする人はみんな使いましょう.
インストール方法
まずは以下のリンクから最新版をダウンロードします.
プログラミング用フォント Ricty Diminished
そして以下のコマンドで解凍.
$ tar -zxvf ricty_diminished-x.x.x.tar.gz
そうするとttfファイルができるのでこれをインストールすれば使えます.
余談ですが,.tar.gzを解凍するコマンドって毎回忘れて調べたりしますよね.
あとはインストールしたRicty Diminishedをコンソールとかエディタとかのフォントに設定してあげればOKです.
Ricty Diminishedで充実したコーディングライフを送りましょう.