レースゲームリメイクへの道

もう9年か10年前くらいになりますか、レースゲームを作りかけていたことがあります。
OpenGLで作っていて、コース4つとCPUの動きまで出来ていたのですが、それ以降のUIまわりの対応や自分の技術的問題で公開できないままとなっていました。

今でもそのゲームに未練がありまして、何ならUnityを使えば当時よりもはるかに作りやすいんじゃないのと思い立ちました。
そして先日Twitterにも投稿した動画がこちら。

……いかにもUnityですね。まずは動くことが大事。

当たり判定の計算の都合で平らに見える地面でも派手に跳ねていますが後々空を飛ぶ予定なので(恐らく)問題なし。
Terrainで地面を作ってブロックを置くくらいならだいぶ楽に作れますね。その割に当たり判定にやや苦戦しました。
以下ごく基本的な内容ですが、自分が試した方法を書いてみます。

続きを読む レースゲームリメイクへの道

mac版を追加してみるテスト

譜面配置ツールBe-Sequence Object Placerと、公開から時間が経って今更感のあるbroox-lのmac版を公開してみました。

LÖVE製なのでmac版のappファイルも比較的簡単に作れるのですが、macOSはCatalinaから所謂野良Appが全てマルウェアの疑いのあるものとして扱われることになったので、ダウンロードしたAppを開く際はCtrlを押しながら開くなどしないと起動することができません。安全を担保する意味でzipファイルのチェックサム的なものを記載したほうがいいのか知らん。
マルウェア疑惑を晴らすためにはAppleにファイルを送信して公証を受ける必要があり、これのために年99ドル払ってApple Developer Programに登録するのは割に合わないため当分はこのままとします。そもそもLÖVE製のAppで公証を受けられるのかは謎なところ。

macOS配布用のAppファイルを作るにあたって、現在のwikiに記載されている方法ではAppのアイコンを変えることができなくなっていたため、Assets.carを変更する別の対応を行う必要がありました。これについては恐らく後日メモ代わりにまとめておきます。

続きを読む mac版を追加してみるテスト

当たり判定のテスト

今年の正月の休みにLÖVEを使って大量のオブジェクトの当たり判定を行うテストを作ってみました。
やっていることは(検索で上に出てくるところの解説が親切な)四分木での判定です。

850個の丸を動かしてみたのがこれ。

実際に自分で試したことが無かったのと言語の都合上ビット演算が使えなかったりでわりと苦戦しました。
全てのオブジェクト同士で比較を行うと毎フレーム約36万回の判定を行う必要があるところ、四分木判定で大体1/6くらいに回数を減らすことができました。丸の大きさが小さいとさらに判定回数が減ります。
座標の計算等に無駄は多そうですが、今の状態でもそれなりに速くなったので成功と言えそうです。

しかしこの四分木判定だと、画面の中央に丸がある場合は領域を分割できずに全ての丸との判定を行う必要が出てくるので、真ん中に大きいオブジェクトが固定される場合に少し弱そうですね。
それでも十分使えることが分かったので、アクションとかシューティングゲームを作るときには今後取り入れていきたい所存。

ビットレート変換の段

前回Waveファイルのサンプリングレート変換らしいことをしてみたので、次はビットレートの変換もできるようにしました。ビットレートというよりはビット深度ですか。
前回軽く解説的なことをしたので、今回もメモ的に残してみます。とはいえややこしいところは少ないので、周波数の変換に比べればだいぶ楽ですね。

Waveファイルのフォーマットではだいたい8ビット、16ビット、24ビット、32ビットの4種類が使われていて、
それぞれsigned char, short, int, floatの型で表すことができます(32ビット整数型もありますがややこしいのでスルー)。

それぞれのビットレートで持てる値の範囲は以下の通り。

8bit
0 ~ 255
16bit
-32768 ~ 32767
24bit
-8388608 ~ 8388607
32bit float
-1.0 ~ 1.0(範囲外の値も持てる)

基本的に値が0の時に無音なのですが、8ビットのみ128で無音になるので注意が必要ですね。

続きを読む ビットレート変換の段

サンプリングレート変換の段

今作っているゲームでは音声の再生にWASAPIを使ってみているのですが、
PCの設定次第で出力される音声フォーマットが違うのでそれぞれ対応する必要があることに気付きました。

用意している音声データは16bit/44100Hzで、同じ出力フォーマットの環境だと問題ないものの
HDMI側の音声出力を使ってサウンドコントロールパネルから16bit/48000Hzの形式に変えると音が間延びして再生されます。
これを正しく再生させるための対応として、44100Hzの音声データを別のサンプリングレートに変換する必要が出てきました。
Unity等だとこの辺りは自動でやってくれそうですね。

というわけでサンプリングレート変換の方法は大まかに下の二つの模様。

  • 音声データをn倍したり1/nに間引く
  • フーリエ変換して周波数成分を取り出し、逆変換して戻す

……このあたりの知識はあまり無いのですが、後者の方法は見るからに大変そうな上にちゃんと戻せるのか不安なところがあります。
というわけで前者の方法を取ることにしました。(10/4 フーリエ変換の方法を試してみました
続きを読む サンプリングレート変換の段

音楽ゲーム作りの段

もう5月も終わりですね。
COVID-19による緊急事態宣言も一往は解除されたということで、徐々にステイホームしなくてもいい感じになりますね。しっかり手洗いをしたり適度に距離を開けたりといった自己防衛は引き続き大事です。

自宅にいる期間が長かったこともあり、去年の5月にほんの少しだけ作りかけて放置していた音楽ゲーム(予定)の続きを進めてみました。
ひとまず曲を読み込めて演奏できるところまで。曲はアレっぽい風味でとりあえず。

……動画で見ても分かりにくいかもしれませんが、譜面のスクロールは手動で行う形です。曲の現在の演奏箇所も基本的には表示されず、練習時のアシスト機能としては自動スクロールと合わせて表示できる形にする予定。

この動画の状態からスコアの計算を入れたら一往は音楽ゲームらしい形になりそうです。多分。
続きを読む 音楽ゲーム作りの段

Lo-Fiというもの

スマートフォンから記事を更新するようになったとは言うものの、電車やバス等で長めに座っている時間が無いとなかなか更新できませんねー。
書こうと思っている内容は溜まっているくらいなのですが、時期を過ぎてしまうとさらに動きづらくなるという。

先日、所謂Lo-Fi的な感じの曲を試しに作ってみました。

boorx-lのステージとして作ると効果音で不協和音のような音が生まれる点はどうしようもないですね。
効果音もランダムでいくつか鳴らす形なので、曲に展開があってもそれに合わせて変更することができないという問題もあります。
展開をつけられない故に1分くらいの曲をさくっと作って組み込めるというあたりは利点。
曲を作った段階では効果音について考えていないので蛇足となりがちなあたりは難点。

続きを読む Lo-Fiというもの

続々々・DirectX11(完)

完と云うか一区切りですけれども。
前回で基本的な図形を描画できるようになったので、数年前にDirectX10で作りかけたアクションゲームを同じくらいのところまで作りかけてみました。

ゲームとして作るなら探索系かなーと思っていたところ、新作の海腹川背Fresh!が既に探索系なのでした。ちょうど今日体験版が配信開始とのこと。Switchを持ってる方はチェック。

続々・DirectX11

非常に遅々としていますが、DirectX11でのスケルトン?作りをまだ進めています。
本当は前回のものを作った時点で以前作りかけたアクションゲームを移植してみようかと考えていたのですが、
単純に置換するだけではどうにもならず二進も三進もいかなくなってしまったので、改めて一から作ろうと思いなおしました。
作業の半分以上は車輪の再発明である。

そして現在の状況がこちら。

……何だかよく分からない状態になっていますが、回転する立方体2つと板2つを用意して

  • 全画面をビューポートにした立方体2つ
  • 小さいビューポートで違うカメラから見た立方体2つ
  • 最前面に色を付けた板2つ

を描画しています。違うレイヤーで順番にオブジェクトを描画するみたいな。
続きを読む 続々・DirectX11

続・DirectX11

先日のDirectXのスケルトンのような形から少しずつ手を加え、ひとまず複数のオブジェクトを描画できる状態にもってきました。

ここでオブジェクトごとに行列を持たせるようにクラスのメンバにXMMATRIX型のものを作っていたところ、コンパイル時に「ヒープで割り当てられたオブジェクトが 16 にアラインメントされていない可能性があります」という警告が出るようになりました。
さらに無視して続けていると
C2338 You've instantiated std::aligned_storage with an extended alignment (in other words, Align > alignof(max_align_t)). Before VS 2017 15.8, the member type would non-conformingly have an alignment of only alignof(max_align_t). VS 2017 15.8 was fixed to handle this correctly, but the fix inherently changes layout and breaks binary compatibility (*only* for uses of aligned_storage with extended alignments). Please define either (1) _ENABLE_EXTENDED_ALIGNED_STORAGE to acknowledge that you understand this message and that you actually want a type with an extended alignment, or (2) _DISABLE_EXTENDED_ALIGNED_STORAGE to silence this message and get the old non-conformant behavior.」という長いエラーが出て実行不能に。
続きを読む 続・DirectX11