Udemy講座、Pyxelを用いてレトロゲームのギャラクシアンを作成しました。
ギャラクシアンはインベーダーゲームのようにエイリアンを倒すシューティングゲームです。敵は編隊を組んで攻撃を仕掛けてき、攻撃中のエイリアンからミサイルが放たれます。画面外に移動したエイリアンは元の位置に戻ります。
学習できること
PyxelはPython環境がある方であれば、手軽に使用できるのでお勧めです。この講座を通して
- Pyxelモジュールの使い方
- 同梱ツールによるドット絵作成
- 同梱ツールによるファミコンサウンドの作成(いわゆるピコピコ音)
- これらを通してギャラクシアンを作成
また、自分はゲームが好きなのもあって、プログラミングで何か簡単なゲームを作成してみたいという思いもありました。youtube等を見ると、プログラミングで~~を作ってみた。のような動画が出ており、もしかして簡単なゲームなら作れるかも・・・?と思ったのもあって探していたところ、この講座を見つけたので取り組みました。
ゲーム作成は、自キャラ、敵キャラ、背景、攻撃(弾)等、様々なものが出たり消えたりするのでクラスを用いてプログラミングをします。この使い方にも少し慣れたいという思いもありました。
ギャラクシアン作成
敵キャラ(エイリアン)の作成
同梱ツールを使用して敵キャラを描画します。1枚の大きなキャンバスに絵を描画していき、このキャンバスのx,y座標と幅、高さを指定することで切り出す範囲を指定し、ゲーム画面にキャラを配置することができます。同じ色のキャラが2体いるのは、よく見ると手が上下しているのが分かると思います。この2体を一定フレームごとに表示することでエイリアンの動きを表現します。こんな感じです。
背景(star)、攻撃(missile, beam)を追加
背景、攻撃はPyxelがもつモジュールで描画します。点、矩形、円などを描画する関数が備わっているのでこれらを使用します。背景の星は点、攻撃は長方形を使用すればよさそうです。
背景の星は、表示できる最大数を決めておき、画面上から画面下へ動くように設定、生成される際には色、速度をランダムに決めるよう記述し、それっぽく見えるようにしています。
ビームは自キャラから上方向へ、スペースキーを押したら発射されるようになっています。こちらもPyxelの関数でスペースキーを押したらTrueを返すものがあるのでこちらを使用。
ちょっとそれっぽくなってきましたね。
当たり判定の追加
作ってる側としてはここまで見ても「お~~!」という感じなのですが、ゲームとしてはまだです。各攻撃が当たったときの当たり判定とその時の動作を加えます。
beam => alian
missile => ship
alian => ship
この3パターンが接触した際に当たったと判定する部分です。
当たった際には、爆発するように描画します(これも描画のツールで書いてます)
当たり判定は、
キャラのx座標 < 攻撃のx座標 and 攻撃のx座標 < キャラのx座標 + キャラの幅
厳密に言うと少し違うのですが、今回のゲーム程度であればほぼ問題なく判定してくれます。
こんな感じです。例えば、ビームとミサイル間でも当たり判定を加えると、エイリアンの攻撃が避けられないときに自キャラの攻撃で道を開く、といったように幅が広がると思います。
その他の機能追加
ほぼ完成間近ですが、ゲームとして完成させるためにスコア、残機などの実装を行います。さらに、例えばですが、敵キャラが打ってくるミサイル攻撃に関してです。
def move(self):
if pyxel.frame_count % 2 != 0:
return
for i in range(len(self.missiles) - 1, -1, -1):
if self.missiles[i][1] + 1 > SIZE_Y:
self.missiles.pop(i)
else:
self.missiles[i][1] += 1
こちらが講座の元のコードです。こちらに少し手を加えて
def move(self, pos):
ship_x, ship_y = pos
if pyxel.frame_count % 2 != 0:
return
for i in range(len(self.missiles) - 1, -1, -1):
if self.missiles[i][1] + 1 > SIZE_Y:
self.missiles.pop(i)
else:
self.missiles[i][1] += 1
if pyxel.frame_count % 8 == 0:
missile_dir = self.missiles[i][0] - (ship_x + 2)
if missile_dir > 0:
self.missiles[i][0] -= 1
elif missile_dir < 0:
self.missiles[i][0] += 1
このようにミサイルが自キャラより左にあれば、右に少しずつ動き、逆に右にあれば少しずつ左に動くようになるので、ミサイルが自キャラを追尾するように変更することができました。
こちらが完成版です。
講座を受けての感想
途中自分の理解が追いつかない部分もありましたが、ただ写すだけでなくこのコードが何をしているのかを少し考えるだけでも一気に理解がぐっと深まります。
これくらいのゲームであっても、1から作るのは少し骨が折れそうですが、とても楽しかったです。しかし、他のゲームエンジンに比べてとても手軽に作成できるのではないでしょうか。
ゲーム作成してみたいけどハードル高そう、と思っている方がいれば、ぜひPyxelを触ってみることをお勧めします。
コメント