続・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

DirectX11ことはじめ

2019年もひと月が過ぎて2月になりました。
2019年としては今更感がすごいのですが、DirectX11に触り始めました。

というのも現在使っているPCがWindows10になってからVisual Studioでゲームらしいものを作っておらず、過去に作りかけたプロジェクトを開いてみるも環境が違うためビルドができないという状態になってしまっていまして。
以前の環境がWindows7+Visual Studio 2010なので、一気にVisual Studio 2017にバージョンアップしようものなら浦島太郎状態にもなるものですね。
DirectX10でのスケルトン的なものは以前に作っていたので、それをもとにDirectX11に書き換えてみるところから始めてみました。

続きを読む DirectX11ことはじめ

broox-l公開

先日の3分ゲーコンテストに参加したbroox-lを公開しました
ゲーム内容は変わりませんが、不要なファイルを消したうえで効果音がwav形式だったものを一括でogg形式に変換し、ファイルサイズを小さくしています(56.3MB→19.7MB)。

LÖVEではMac用の実行ファイルもそこそこ手軽に作成できるためMac版も試しに作ってみたのですが、BGMとメトロノームのタイミングが大きくずれてしまうため見送っています。
遊ぶことはできるものの、どうもSource:tellで取得できる時刻が実際の0.95倍くらい(体感)になってしまうようです。
oggファイルのエンコードの問題かも知れませんが原因は謎。

3分ゲー21

第21回3分ゲーコンテストの応募受付が始まっていました。
このタイミングなので以前に少しずつ作りかけていたワンキーゲームを投稿出来たらいいな、と考えています。…ここ数か月手を付けられていませんが、現状でだいたい形になっているので今月中には何とかなるはず。

コンテスト自体も一度休止したのち、前回の第20回からも大分間が開いての開催となる形ですね。
小さいゲームを公開する動機としてもいい機会なので、出すことを目的に気負わず進めていきたいところ。

ピコピコ

ゴールデンウィークが終わりました。
作りかけのゲームが進まないのも何なので、チップチューン的な曲を作ってワンキーゲームに組み込んでみました。
録画にしてみたのがこれ。

チップチューン的と言いつつあえてリバーブを強くかけてみたりしてますけども。
ゲーム的に曲を数曲作る必要があるので、軽く作った曲でも組み込めると後々便利でもあります。
ブロックを壊した時の音をアルペジオにしてみたのですが、少しタイミングがずれるとリズムがずれることにもなるので難度はちょっと高そう。
1曲あたり1分ちょっとは欲しいので、もう少し曲を伸ばす必要はあるものの使えそうです。

最近はインディーゲーム等でドット絵のゲームをよく見かけることもあり、それに合わせてBGMもピコピコ系のものを聞く機会が増えている気がします。
ドット絵でも加算合成のパーティクルやブラーのエフェクトがかかっていることがあるので、曲の方にエフェクトを多くかけるのもいいよねとテスト的に作ってみたのが先の動画です。
ファミコン風の音色(今回はmagical8bitplug)だと使える音の種類が限られるので、音色で悩む時間が減るという意味で曲作りを進めやすそうな印象がありました。
ただしチップチューンを追求してアルペジオの再現等をしようとすると骨が折れそうなため、あくまで広義の(?)チップチューンであるピコピコ音楽にとどめておくのが得策でしょうか。

落とし合いLダウンロード版

先日ブラウザ用ゲームとして公開した落とし合いLのページの一番下にダウンロード版へのリンクを追加しました。
折角Love2dでの習作なので、Win版とMac版を一緒に作れるよというテストです。…ブラウザ版と同じ内容なのでわざわざダウンロードするまでも無い内容ではありますけれども。

この二つを追加するにあたって大元のLove2dがVer.11.0にバージョンアップされていたので、本体の更新を行いました。更新内容のリストも参照ください。
この更新の中に影響の大きい変更が含まれていまして、その修正に手間を要することになってしまいました。
その変更点とは「Love.exe単体で起動した際の画面がSuperToastでなくなった」…ではなく、「SetColor等で指定する色の値の範囲が0-255から0-1に変更になった」というもの。

一往そのままゲームが動くことは動きますが、大半の色が正常に表示されなくなっているために色として指定している値を全部書き換える必要が出てきました。途中の段階で止まっているワンキーゲームの方も値の書き換えが必要になると考えると少し骨が折れそうです。
その他音声関係の処理も変更が入っているので、旧コードのままだとエラーで止まってしまいました。

また確認はしていませんが、Love2dのバージョンが変わったことでjavascriptへの変換にしようしていたlove.jsが使用できなくなっている可能性があります。まあブラウザで動かせるのはある意味おまけのようなものであると割り切ることもできますけれども。

Luaのコードの軽量化

先日Love2dの習作として作った落とし合いLを更新しました。
更新と言ってもゲーム内容は変わらず、ゲームデータの軽量化を試してみました。

--

Love2dで作ったゲームをlove.jsを使用してブラウザ用に出力すると、luaで書いたコードはそのままdataファイル内に保存されるようです。このファイルには改行やスペースもそのまま残っているようであるため、読み込むためのデータとしては効率が悪いと言えます。
もとのluaで書かれた文を圧縮できれば、ブラウザで遊ぶときにダウンロードするデータ量が減ってちょっとお得になります。また外部の人が見たときに、ぱっと見でソースを読み取りにくくなって無駄の多いコードでもバレにくい(?)という効果もついてきます。

という訣で試してみたのがSquish。コード量を小さくする(minify)ほか、難読化やrequireで呼ばれる複数のファイルを一つにまとめる機能もあるツールです。
実行できるLuaのバージョンはLua5.1版までのようですが、実際にデータ量の削減に成功することができました。素のコードの46065バイトが15799バイトまで減りました。65%減となるとかなりお得感がありますね。

このSquishですが、実際に動作させるまでになかなか苦労させられました。もし動作に引っかかる方がいたらメモ程度に使い方をまとめておこうかと思いますが……さすがに居ませんね。
コード量の削減はブラウザ用以外でももちろん有効です。特にLove2dでWindows用のexeファイルを作るときはデータをZipで圧縮するだけという手軽さなので、圧縮前に難読化をかけておくとデータを解凍されても改造されにくくなりそうですね。あくまでされにくくなるだけですけれども。

またLove2dはLuaJITというLuaを高速で動作させられる何かにも対応しているので、配布ファイルを作る前にこの形式に変換しておくと動作速度とコードの読みにくさがさらにアップしそうです。ただし、Squishと併せて下準備がそれなりに大変なので、Love2d本来の手軽さからは大きく離れた作業になってしまうのが難点と言えます。

なお、love.jsを使ってブラウザ用に作る方法はLuaJITには対応していないようなので注意が必要です。

公開:落とし合いL

Love2dの習作として、ゲームをひとつ公開しました
落とし合いLです。LはLÖVEだったりLuaだったり。

JavascriptへのコンパイラであるEmscriptenを使ったLove.jsを使うとブラウザで動作するものが作れるらしいので、上のリンクはそのテストも兼ねてブラウザ版です。
ブラウザや設定次第で動かない場合もあるかと思いますが、スマートフォンからでも動作するようです(iPhone7で確認)。

こちらが確認した限りでは60FPS結構サクサク動きますね。シンプルなゲームなら十分いけそう。
PCからだとキーボード入力が出来る一方で携帯端末だとタッチ操作をすることになるため、今回みたいなアクション系だと操作感が大きく変わってくるのが難しいところです。
落とし合いLでは指を左右に動かすとその方向に移動、という形にしました。慣れればそこそこいける……?
また操作をシンプルにするため前作にあった方向キー二度押しのダッシュ/急ブレーキコマンドはありません。面倒だったとも言う。

操作性の他にタッチ操作の問題点として、キャンバスの外の部分をタップしてしまうと思わぬ場面で画面が上下にスクロールしたり前のページに戻ろうとしてしまう現象がそこそこ発生しやすいこともあります。PCゲーム(スーパーフックガールとか)でもウィンドウ外をクリックして画面が見えなくなったりすることがありますが、それに近い問題ですね。
シビアなゲームの場合はフォーカスが外れた際にポーズをかけるような処理が必要になりそうです。

今回は画面サイズは640x480(過去の落とし合いの2倍)固定で、携帯端末の場合は画面が横幅一杯に収まるようにHTML側で設定をしています。横縦比が4:3なので、縦長の端末で画面を横向きにすると、横幅が画面に合わされて上下が画面に収まらなくなってしまいます。
横長の画面の場合は縦幅を画面に合わせるような設定にできそうですが未検証です。縦長のSTGならともかく、縦横どちらでもプレイできる画面サイズの場合はしっかり設定する必要がありますね。

続きを読む 公開:落とし合いL

ワンキーゲーム続行中の2

先週はゴールデンウィークということで、ゲームの制作もそれなりに進行しています。
先日Twitterに上げた動画はこちら。

一番手前にあるブロックと同じ色のタイミングでキーを押していくゲームです。タイミングは音楽に合わせるとちょうどいいかもしれない、というやつ。
音楽違いで他に複数ステージ作るつもりのため、その曲を準備するのもなかなか手間取っております。効果音も複数種類用意したいところです。
この動画だと「赤・青」で2拍ごとのタイミングとなっていますが、「赤・赤・青・青」で2拍を1拍ごとに分割したり「赤・青・赤・青」と表拍と裏拍に分けたりすることもできます。ゲームバランス的に難しくなりそうなのでそのあたりは追々調整を。
当初はさくっと作って軽く公開するつもりでしたが、やはりというか少しずつ作業量が増えていきますねー。とりあえずの目標は今月中に一通り形にすることでしょうか。

特に大きな用事は無かったのにかかわらず、連休中にゲームをいくつかプレイするという予定については全く実行できずに終わってしまいました。残念。

ワンキーゲーム続行中

Love2dを使ってのワンキーゲーム制作を続けています。現状はこんな感じ。

携帯端末を見越して画面を16:9のサイズにしました。

空いた画面の左側を情報表示用兼タップ用スペースとするとして、実際にスコアを表示させてみるとゲームらしい感じが出てきますね。円形の文字配置は一度やってみたかったので試しに。
画面の左側を開けていますが、右手で操作するとなると左右を反転させて右側を開けた表示にできるようにもしたほうがよさそうですねー。

Love2dはapkファイルを書き出して、実際にAndroid端末で動作することを確認しました。やはり導入はある程度の手間がかかりますが、一度環境ができてしまえばそこそこ楽に作れそうです。手順はAndroid版のWikiに書かれているもので大丈夫な模様。
宿命として音声の再生にはどうしても若干のラグが発生が発生しますが、新しめの端末なら気になりにくい程度に改善されている気がします。
iOS版の確認はゲーム本体がもっと形になってから試す予定です。形になるまで作れるといいですね。

このゲームを作る上でBGMとなる曲も合わせて作ると必要があるため、以降の製作ペースは遅くなりそうです。ある程度形を作ったところで放り投げがちなので、ここから地道に続けることが重要となります。他のゲームのアイデアが突然浮かんだりした場合は放り投げ率がアップ。今の所は順調に進んでいるので何とか公開までは持っていきたいところです。