2016年3月12日土曜日

Invader Block を HTML5 で作ってみた

ゲームはC言語で作る派のシーラカンス・プログラマな私ですが、一応Web系の企業に勤めているのでJSも書けますよというアピール的な意味で、Invader BlockをHTML5に移植してみました。

・PCブラウザ専用(Chrome推奨)
・カーソルキーで左右に移動
・ブロック崩しの要領で敵を倒す
・メダルを取るとスコアの基点が上がる
・連続してインヴェーダーを倒すと獲得スコアに倍率が掛かる(最大16倍)
・メダルを一定数取ると味方からの援護射撃(レーザー)が来る
・このレーザーはリアルでハードコアなものなので、当たるとプレイヤーも撃破される 

ソースコードを(9leapからもDLできるようにしていますが)GitHubでも公開しています。
https://github.com/suzukiplan/invader-block-5

ターミナルで以下のような感じでコマンドを叩けばローカルで遊べます。
$ git clone https://github.com/suzukiplan/invader-block-5.git
$ cd invader-block-5
$ open local-index.html

※ローカルプレイの場合はリプレイ時はブラウザリロードしてください

今回は、ソースだけでなく、画像や音声(全部自作)もリベラル・ライセンス(CC4)になっていますので、alt Invader Block を誰でも作れるというかなり誰得仕様にしてきました。

ひとつ注意点として、Chrome以外のブラウザでの動作は不完全です。
・Firefox: 音が鳴らない(プレイはできる)
・Safari: 音が鳴らない(プレイはできる)
・IE: 音が鳴らない(プレイはできる)
Edge: プレイできない(ロード中に止まる)
・スマホ: プレイできない

HTML5の普及がイマイチな原因のひとつがブラウザ依存ですね。性能的な面ならPCブラウザで十分ゲームが作れるけど、結局特定のブラウザでしか完全に動かないのであれば、(ゲームデベロッパ脳で考えると)ネイティブで作った方が性能が良いからネイティブで作るという結論になる。(スマホのWebViewは重すぎるし)

プログラミング環境としては、JavaScriptならC言語とだいたい同じノリで作れるから結構良い感じかもしれません。ゲーム本体のコードは下記で公開していますが、Cプログラマな方にとっては結構とっつき易い感じではないでしょうか。
https://github.com/suzukiplan/invader-block-5/blob/master/game.js
JavaScriptは、データ型と宣言の概念さえあれば、もっと普及した言語だったかも(そこら辺がバグ作り込みリスクがかなり高い)。宣言については use strict で解消できるけど、データ型の件はどうにもならない(だからtype scriptがそこそこ流行っている)という感じか。

2016年3月5日土曜日

【更新】一部iOSアプリがiOS9.2で起動できない件について

久々にSUZUKI PLAN製アプリを(iPod touch 5で)動かしてみたら、起動時に落ちてしまう問題が発覚しました。確認してみたところ、以下のアプリで同件の現象が顕在化します。
・Battle Marine
・Lunatic Clay
・Canon Sniper
・NOKOGI Rider(製品版)
・Invader Block 3

最新のXCODEでリビルドするだけで動くようになったため、iOS側のアップデートで過去のバージョンとの互換性を失う何らかのデグレードがあったものと考えられます。

順次アップデートをしていきますが、最新のXCODEでビルドすると、動作できるiOSのバージョンが4.3以降から6.0以降に変わります。

[追記]
上記ですが、原因が分かりました。ストアからダウンロードせずにXCODEでビルドしたものを使っていて、プロビジョニング・プロファイルの期限が切れていたことが原因でした。という訳で、ストアからダウンロードして動かす分には問題無いことを確認したので、アップデートはしません。

2016年2月27日土曜日

無駄な手順は誰も踏みたがらない

先日、英雄伝説4の原曲集をiTunesで買ってから、ファルコムのFM音源アルバムをiTunesで色々と買い揃えてみました。いや、全部CDで持っているんですけどね。(CDを再生する機械が手元にないから仕方がない)
イース4と風の伝説ザナドゥは、パソコン(PC-98)ではなくPCエンジンが原作なので、原曲 = 波形メモリ音源 or CD-DAですが、PC-98のFM音源(YM2608)で作られた原曲の原曲版です。

98のFM音源で原曲を作ってから波形メモリ音源なり生楽器なりでアレンジしたものをゲームで使っていたようです。チップチューンの頃は、機種毎に音源仕様が全く異なるので、音楽を作る人が最も得意な環境で最初に作ってから、ターゲット機種向けにアレンジするということは割とよくあったのではないかと思います。

こういうのは最近無いですね。

世界樹の迷宮(任天堂DS)など、PC-8801のサンプリング音を使ってBGMを作ったFM音源原曲(?)の比較的新しいゲームとかならあったりしますが。去年YAMAHAがDX refaceという最新のFM音源をリリースしたりした(恐らく現代でもかなり戦力になる音源だと思う)ので、FM音源で作られたゲーム音楽は今後もチラホラ出てくるのではないだろうかと思っています。サンプリング音や生楽器よりも音的にゲームに向いていると思うので。

ただ、私の言う「こういうの」というのは、そういうことではなく、原曲の原案を敢えて8bit機、16bit機のチップチューン音源で作ってから、最新のサンプリング音源で曲を作り直すということ。一見すると無駄手間のように見えます...というか、無駄以外の何物でも無いかもしれません。

いや、もしかすると私が知らないだけで、作曲の最初期の段階では MSX + FB-01(※操作にMSXが必要なオーパーツ的なFM音源)で作り、それを基に最新の機材でアレンジしたものを最終納品物にしているプロが今でも居るのかもしれません。

それなら、原案版のサントラも出した方が売り上げ的な意味でも良いと思うのですが、そういうのが無いということは、やっぱりそういう人は居ないのだろうか。俄には信じ難いのですが。少なくとも私は一見すると無駄手間のように見えるその手順を踏まないと作れないので。

何故か?

うまく説明できないのですが、ノリとしてはこんな感じだろうか。

2016年2月23日火曜日

KOBUSHI mode

前回の記事で書いたFM音源の仕組みを使って、東方VGSにKOBUSHIモードという機能を入れてみました。KOBUSHIというのは演歌のこぶし(小節)から付けた名前ですが、厳密には演歌のこぶしとは若干違います。(単に音をビブラートさせているだけです)

ついでに、Google Play とかで「KOBUSHI」で検索すると何故か太極拳関連のアプリがよくヒットするのですが、太極拳のシンボルマークによく陰陽マーク(?)が見られるので、東方とも相性が良かろうと。
コレとか
(陰陽マークって太極拳のシンボルマークなんですかね)

KOBUSHIモードを入れたAndroid版の東方VGSは昨日リリース済みで、iOS版は昨夜未明に審査に出したところです。(追記: 2016.02.25 released)

KOBUSHIモードで与えているモジュレータのパラメタは、vgs-bgm-decoderのソースコードを参照。
https://github.com/suzukiplan/vgs-bgm-decoder/blob/master/src/vgsdec.c
※VGSDEC_REG_KOBUSHI という名称のレジスタでON/OFF可能な仕様

若干意図した通りの時間経過による波形加工ができていなかったりしますが、お遊び機能なのでまぁ良いかなと。(後でも直すかも)

モジュレータに与えるパラメタを変えることでもっと色々なパターンのKOBUSHIが作れたりします。(KOBUSHIパラメタをお好みに調整できる機能は後で入れるかもしれません)

このKOBUSHIパラメタの調整というのは、要するにFM音源に与える音色パラメタを調整することとだいたい同義です。実際のFM音源とKOBUSHI音源の違いとしては、KOBUSHIの場合、音を揺らす装置(モジュレータ)が1機しか付いていない点かな。つまり、KOBUSHI音源は2オペレータ(1キャリア, 1モジュレータ)のFM音源ということになります。

有名どころのFM音源のオペレータ数としては、DX7が6オペレータ(1キャリア+5モジュレータ)、YM-2203が4オペレータ(1キャリア+3オペレータ)とかだったと思います。オペレータが3機以上あれば、オペレータの並び順(FM音源の世界ではアルゴリズムと呼ばれている)を変えることができたりします。

本格的なFM音源にすると、東方VGSの元データを弄らずに加工することが難しくなるので、再アレンジが必要になりそうな感じですが、それもまた一興かなと。

2016年2月20日土曜日

FM音源を作ってみる

英雄伝説4の原曲をiTunesで買ってみて聴き倒してみたのですが、やっぱりFM音源って良いですね。

なので、FM音源を作ってみたくなりました。
まずは、基本的な仕組みをYAMAHAの記事(以下)で確認。

FM音源とは

YAMAHAの記事に書いてあることを一言で纏めてみると「FM音源=波形を揺らしたもの」ということです。VGSの波形メモリ音源の場合、三角波、矩形波、ノコギリ波、ノイズの4種類の波形テーブルを持っていますが、これらの波形の読み込み方を変えることで波形を揺らすことができます。

波形の揺らし方

それでは、どうやってやるのか?一応、その辺の仕組みもYAMAHAの記事に書いてありますが、ちょっと専門用語が多くて分かり難い。そこら辺の仕組みはWikipediaで数式を確認することで理解できました。

サイン波は、その名の通り sin(r) で求めることができます。sin関数の引数r(ラジアン値)は時間経過で増加させるのですが、増加させる値が大きければ音が波の周期が短く(音が高く)なり、小さくすれば波の周期が長く(音が低く)なります。

Wikipediaに書かれていた数式を見れば分かるように、sin関数の引数内βsin(2πMt)という別のsin関数で求まる値を加算しています。こうすることで元のAsinのラジアン値の進み方に揺らぎが生まれます。つまり、音が揺れます。

実際に揺らしてみる

先日記事にしたVGS-SPUを使って、実際に波形を揺らして鳴らしてみます。
上記プログラム中で使っている table.h は コチラ
普通に math.h の sin関数 でも良いのですが、それだと浮動小数点を扱う必要があるし、関数呼び出しのオーバーヘッドもバカにならないので、固定小数点で扱えるsin関数テーブルみたいなものです。ついでに、sin(サイン波)だけではなく、矩形波とノコギリ波と音程を求めるためのラジアン値増分も入れてあります。

2016年2月17日水曜日

Androidで目覚ましアプリとか入れない方が良いんじゃないですかね

目覚まし時計って、携帯電話の使用用途としてかなり重要な機能だと思います。ガラケーの頃は、少なくとも私が持っていた機種には全て付いていました。しかし、私が使っているAndroid端末(Android 4.4)には目覚まし時計はOSの標準機能として提供されていません。

そのため、目覚まし時計の機能を使うだけのためにガラケーを使い続けていたのですが、昨夜そのガラケーがご臨終されてしまったので、仕方なくアプリの目覚めし時計を使ってみることにしました。

使用してみたアプリは下記です。
https://play.google.com/store/apps/details?id=com.apalon.myclockfree

1000万DL以上されていて評価も高いので、これなら大丈夫だろうと...

しかし、トラブルは起きました。

翌朝、指定時刻になってもアラームが鳴りません。
何故なら、Android本体がバッテリー0%で落ちていたので。

私のAndroid端末は、かなり電池持ちが良いので、標準的な使い方なら、だいたい2日に1回ぐらい充電すれば事足ります。Androidの目覚ましを設定したその夜は、バッテリー残量が70%程度残っていたので、充電せずに就寝したのがマズかった。(多くの人は、寝る前にAndroidを充電した状態にすると思うので気づき難いかもしれませんね)

何故、私がAndroidの目覚ましアプリを信用していなかったのかというと、バックグラウンドで動作するアプリのプロセスを、OSから殺されずに存命させる手段を私が知らないからです。(バックグラウンドで動作するアプリを開発しているのでその辺の事情をよく知っているつもり)

OSから不要プロセスとして殺されないようにするには、何かしらのタスクを動かし続ける必要があります。タスクを動かし続ければ、当然ぐんぐん電池が減っていく訳です。(その減り方が想定以上に最悪だったためトラブった)

目覚まし時計のアプリが正常に動作できるようにするには、休眠状態でもOSから殺されず、かつ、指定時刻には正常に動く必要があります。その点を解決するには、次の何れかの機能をOSが提供している必要があります。
・目覚まし時計はOSの機能の一部として提供されている
・定時実行タスクとして登録する機能(cronのようなもの)をOSが提供する

Androidにはそのどちらの機能もありません。
後者の機能は悪用の余地が多いと思うので、実装されたら嫌だな...

ちなみに、iOSの場合は、OSの標準機能として目覚まし時計(アラーム)があるので、それを使う分には問題無いと思います(が、サードパーティー製の目覚ましアプリは基本的に信用できないと思っています)。

[追記] push通知でやれば実現できなくもないかと一瞬思ったけど、push通知だとアプリが立ち上がる訳ではないからダメか(ついでに、それだけのためにサーバーを立てるのもそもそもアホらしい気もする)

2016年2月14日日曜日

1996年が20年前な件

え、割と最近じゃね?
とか言い出したりしたらもうオッサンですね。
おぉ、怖い怖い。

1996年といえば、東方Project第一弾(東方靈異伝)が東京電機大学の文化祭に展示されたりとか。ですが、その辺のネタには触れません。というより、当時東方Projectの存在を知らなかったので、触れようがありません。(私が最初に東方Projectを知ったのは2002年の新作から)

1996年といえば、日本ファルコムの英雄伝説4が発売された年ですね。
発売日に予約して買いました。
久々に音楽が聴きたくなって iTunes で買ってみました。(全曲セットで1800円)

このゲームの凄いところは、ストーリーその他は全く思い出せないのですが、音楽だけは未だに鮮明に覚えているということ。(無意識に似ているモチーフが自分の曲で使われたりすることもある)

ストーリーとかは多分プレイすれば思い出せると思います。
もう一度プレイしたいとは思いませんが。

音楽を未だに鮮明に覚えているのは、絵や音楽は脳内で再生し易い→気に入ったものは日常的に反復再生され続ける→記憶から追い出され難いみたいな感じではないでしょうか。

あと、コレが私にとって「真っ当に遊んだ」最後の市販ゲームだったからというのも大きいです。記憶を上書きする材料がほぼ無くなってしまったから、鮮明に残り続けたのかもしれません。これ以降にも何本か市販ゲームは買って遊びましたが、遊んだ記憶が残っていません。(遊んだ記憶が残る次のゲームに出会うのは、それから12年先の2008年〜)

ストーリーは覚えていませんがw

ストーリーというのは私にとって然程重要なものではありません。音楽やグラフィックを引き立てるため、ゲームのストーリーはシンプルな方が良いと思います。ストーリーをメインで楽しみたければ、ゲームよりも映画、小説、漫画などの方が適しています。ストーリーメインなら、むしろ、わざわざ操作が必要なのは面倒臭い。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...