color×2

自分なりに学んだ事を記すところ

オリジナルゲームの紹介

こんにちは。プリアマウマです。

今後、『オリジナルゲームの改造』がメインになりそうなので、そのオリジナルゲームについて先に紹介しておきたいと思います。

 

使用した言語などなど

使用言語はPython3です。ライブラリはPygame(*1)とPyxel(*2)を使用。
基本的にはPyxelで組み立てましたが、wavファイルの効果音を鳴らす時はPyxelでは出来なかったのでPygameを使いました。

(*1)Pythonでゲームを作る時によく使われるやつ。
(*2)Python向けのレトロゲームエンジン。Pygame みたいにインストールすれば使えて、ドット絵スタイルのゲーム制作が気軽に楽しめる。使える色は 16 色のみ、のように色々決まってたりする。

Pyxelって初めて聞いた!なんか面白そう!って方は公式サイトや他の方が使用しているところを見たりすると楽しさがアップするかもしれません。

 

オリジナルゲームの概要

見た方が分かりやすいと思うので、まずはタイトル画面出しちゃいます。

f:id:galaxylikeflan:20220129053912p:plain

じゃーん。全画面表示にしてるからデカめの画像になったけど気にしないで下さい。

タイトルは『TASK DESTRUCTION』。まんまです。
一言で言い表すと、課題を撲滅するゲームです。
大学生であれば誰しもが嫌う課題。撲滅出来たら爽快感を味わえそうです。

どうやって撲滅するのかというと、

f:id:galaxylikeflan:20220129053916p:plain

だいたいインベーダーゲームを元にしています。

弾丸をバンバン出して敵を撲滅していこうという算段です。

敵を課題にしている訳ですが、私にとっての『課題』はPCを使用して制作する物が多いので、お世話になっているソフトのアイコンを攻撃対象にしています。

 

敵の種類

f:id:galaxylikeflan:20220129190136j:plain

PowerPoint:プレゼン時必ず使用するソフト。
Word:レポート作成時に必ず使用するソフト。
IllustratorAdobe 製品。
Premiere ProAdobe 製品。大学の PC でたまにフリーズする時があった。
After EffectsAdobe 製品。大学の PC で全く動かず、ワンクリックごとにフリーズする時があった。最悪画面が真っ青になった。

Adobeに恨みを抱いているのが一目で分かるかと思います。(だって普段大して使わないのに課題でadobeのソフト使って制作しろって言われるんだもん…一時的に買うにしても高すぎるし)
大学のPC関連が過去形になっているのは、今は新しめのPCに変わったからです。これで後輩は授業中にAEが動かなくてぼんやりする事は無くなったでしょう。よかったよかった。

 

操作方法

インベーダーゲームってキーボード操作が定番ですよね(?)
プレイヤーが素早く動く&連打して撲滅する爽快感を得たかったのでマウス操作にしてみました。

キーボード操作でも連打は出来ますが…マウスの左クリックの方が慣れてるし、片手でお気軽に課題破壊出来る方が楽でいいじゃん?

f:id:galaxylikeflan:20220129190133j:plain

ゲームを終了するにはEscキーを押さないと終わりません。
終わる時だけ面倒にしました。ホイール押下したらゲーム終わるなんてしたら間違いなくうっかり終わる。危ない。

 

ゲームの流れ

まずはあのタイトル画面が出て来ます。左クリックすると唐突にゲーム開始です。

f:id:galaxylikeflan:20220129053912p:plain

課題はいつだって唐突にやって来ます。

f:id:galaxylikeflan:20220129053916p:plain

Stage1はPremiere Proです。

左クリックで弾丸を発射、マウスを左右に動かして敵の攻撃を避けましょう。
インベーダーゲームと同様、敵の数が少なくなるとどんどんスピードが速くなります。

Premiere Proを全て倒し切ると、

f:id:galaxylikeflan:20220129231553p:plain

おめでとう!右クリックをすれば次のステージに行けます。

Stage2: Illustrator
Stage3: After Effects
Stage4: PowerPoint
Stage5: Word
と進んでいきます。

じゃあStage6は…

f:id:galaxylikeflan:20220129235942p:plain

またPremiere Proステージです。5種類の敵しか作ってないのでローテーションして敵が出てきます。
同じ順番で延々と5種類の課題を撲滅していきます。

そして、一度でも敵の攻撃を受けるか、敵がウィンドウ外までやってきたら…

f:id:galaxylikeflan:20220129231445p:plain

ゲームオーバーです。課題に慈悲はありません。

また一からプレイするなら右クリック、もうやめるならEscキーです。
ちなみに、Escキーは常時対応しています。いつでも課題を破壊する事をやめられます。

この流れを動画にしているので効果音付きで見たい方はどうぞ。

 

制作に至った経緯

ゼミの課題でオリジナルゲーム作れ!って言われたのが一番のきっかけです。

ゲームか~せっかく作るならおもろいのにしたいな~なんて事を同じゼミの友人と話してたんですが、その話の中で出てきたのが、『いっそ課題撲滅させたら?』。

それや!!!課題撲滅しよう!!

でも、どうやって撲滅する…?
考えた結果、インベーダーゲームが真っ先に出てきました。
どちらも終わりという概念は無く、延々とやってくるじゃないか…これです。

インベーダーゲームと課題に共通点を見出した銀河の果ては、すぐ制作に取り掛かりました。

こんなところに制作の経緯を載せたのは、今まで説明してきた物を踏まえてインベーダーゲームと課題に何かしら共通点を感じてくれてたらいいなぁと企んでいたからです。

・・・共通点、感じました?

 

一番気を付けたこと

効果音ですね。

ゲームオーバー判定とかじゃないの?って思われた方が居るかもしれませんが、別にそんな事無かったです。ググったら出るし…

この課題撲滅ゲームで鳴る効果音は次の通りです。

  • ゲームオーバー音
  • 敵消滅音
  • 敵移動音
  • ショット音(プレイヤーが弾丸を打つ時の音)

この中で鳴らないとマズいのはゲームオーバー音敵消滅音です。

無音のゲームオーバーって寂しいですよね?無音で敵が消滅するのも味気ない。
絶対鳴ってほしい効果音を無音にしないために何か気を付けたんだなって思ってください。

何故わざわざ無音にならないように対策するのかというと、敵を攻撃しようと左クリックを連打する事で、ショット音がバンバン鳴って他の音が聞こえなくなるからです。

今からどうやって実現させたのかプログラミングした詳細を説明しますが、そんなんよく分からん!ゲームの内容だけ見たい!という人はココをクリックすると飛ばすことが出来ます。

効果音の制御をするためにpygame.mixerを使用しています。

# 効果音
pygame.mixer.init()

shot_sound = pygame.mixer.Sound(os.path.abspath("./assets/shot.wav"))
move_sound = pygame.mixer.Sound(os.path.abspath("./assets/move.wav"))
dead_sound = pygame.mixer.Sound(os.path.abspath("./assets/dead.wav"))
gameover_sound = pygame.mixer.Sound(os.path.abspath("./assets/gameover.wav"))

move_sound.set_volume(0.5)
dead_sound.set_volume(0.6)

# チャンネル指定
pygame.mixer.set_reserved(2)
gameover_channel =  pygame.mixer.Channel(0)   # ゲームオーバー用の音
dead_channel =  pygame.mixer.Channel(1)       # 敵消滅用の音

Pygame で同時に再生できる音は 8 音まで、そのチャンネル番号として0-7 番が割り振られています。

どのチャンネルで鳴らすかは Pygame に任せるのが基本で、普段は記述しなくて良いのですが、今回は自分で指定して、特定の効果音は指定されたチャンネルだけで鳴るようにします。

理由は先述の通りですが、細かく言うと、プレイヤーが連打して弾丸を打ち続けるので、ショット音でチャンネルを占領されて他の音が鳴らなくなる問題をどうにかするためです。 チャンネルの割り当てとしては、以下の通りになります。

0:ゲームオーバー音 (gameover_channel)

1:敵消滅音 (dead_channel)

その他(2-7):ショット音・敵移動音

コードの流れとしては、
wavファイルを読み込んで、音量調節して、予約するチャンネル数を伝えて(*1)、実際に予約してる(*2)感じです。

(*1)pygame.mixer.set_reserved(予約するチャンネル数)

(*2)pygame.mixer.channel(チャンネル番号)

チャンネルの使い方としては、このチャンネルでこの音を鳴らしてね、と命令するイメージです。ゲームオーバー音を鳴らす時はこんな感じで命令してます。

gameover_channel.play(gameover_sound)

詳しくはこちらのサイトを見てみてください。制作する時もこちらを参考にさせていただきました。

 

コードの全貌

ゼミの時に作ったpdfを掲載します。
改良前のコードで説明しているので分かりにくいところがありますが、雰囲気つかむくらいの軽い気持ちで読んでみてください。説明はここで紹介した物と大体同じ内容です。

 

今後改造したいところ

  • ポーズ(一時停止)を可能にする
  • タイトルBGMつける
  • 難易度調整
  • 敵の種類を増やす
  • 破壊する敵を選べるカスタムステージ追加?
  • ボーナスステージ追加?
  • ハイスコア履歴残す?、名前も入力して残す?
  • プレイ開始を唐突にしない?(敵が並んでいく動作追加)

すでにポーズは出来るようになってるので紹介出来たらします。(簡単すぎるので)
次はタイトルBGMをつけるかもしれません。

敵の種類、今のところ自分が恨みに思っている物しか実装されていないので他の方が撲滅したい課題も入れ込みたいと考えています。

もし良かったら、撲滅してみたい課題(宿題も可)をコメントで教えて下さい!
15×15pxで表現できる物であれば実装します。

 

お借りした物のリンク

効果音を色々なところからお借りしたのでここに記します。

オトロジック (https://otologic.jp) 
魔王魂 (https://maou.audio/) 
無料効果音で遊ぼう! (https://taira-komori.jpn.org/) 

 

以上です。付け足したい事とか、『これよくわからんから説明して!』のようなコメントをいただいたら更新します。

 

(+α)ブログを書くにあたって参考にさせて頂いたサイト

ブログ初心者なのでかなり参考になりました。どのサイトも細かく、丁寧に説明されていたので理解しやすかったです。ありがとうございます!!

↑こちらのサイトからさらに参考にさせて頂いたサイトは載せていません(めちゃくちゃ多くなってしまうので)