blog2020-02-08みんなでアドベンチャーゲームを作ってみませんか?これは何?「みんなでアドベンチャーゲームを作ったらどうなるのだろうか?」ふと浮かんだ、この試みを実際に始めてみました。↓↓↓早速プロジェクト自体を見たい方はこちら↓↓↓github.comアドベンチャーゲームとは?ここで言う「アドベンチャーゲーム」というのは、テキストと選択肢によって構成される物語で、選択肢に応じて物語が分岐し、プレイヤー毎に異なるストーリーを楽しむことができるゲームのことです。単なる小説とは違い、選択肢による分岐ごとに異なるストーリを展開することができるため「みんなで作る」のに向いているのでは?と考えました。みんなで作るために工夫していることGit/GitHubを使うみんなでアドベンチャーゲームを作るためには、差分を取り込む仕組みが必要です。今回はこれを簡単に解決するためにGit/GitHubを使うことにしました。差分はGitで管理し、GitHub上で取り込みのためのコミュニケーションができます。ブラウザですぐに遊べるみんなで作るためには、「みんなで遊べる」ことが重要です。特定の環境に依存していたり、インストールが必要であったりすると、遊ぶためのハードルが高くなります。ストーリを作る際も、さっと動作を試せることが重要です。そのため、今回はブラウザで動作するようにゲームエンジンを作成しました。Pagesで簡単にホスティングすることもできました。cloneしてきたhtmlをブラウザで開くだけで遊ぶことができるので、開発時も簡単に動作確認できます。↓ちょっと味気ないですが、Webブラウザで誰でも遊べます。BGM、書式設定などなど、アドベンチャーゲームを盛り上げるための様々な機能を搭載しています。「みんなで作る」という観点では、これらの機能が利用できることで、アドベンチャーゲームにクォリティが求められるようになり、参入の障壁が高くなってしまうことが予想されました。そこで、今回はシンプルなゲームエンジンを自作し、本当にストーリーだけに注力してアドベンチャーゲームを開発できるようにしました。ゲームエンジンから揉めそうな要素を排除それでもゲームエンジンには、いくつかの機能があります。選択肢でジャンプする先を表す「ラベル」や、状態を表す「フラグ」、フラグによる「条件分岐」などです。ここで「ラベル」と「フラグ」に関してはそれぞれ固有の名前が必要です。一般的なゲームエンジンでは「場面1」「学校のシーン」「ライフルを持っているか」など、「ラベル」「フラグ」にはわかりやすい名前を付けます。みんなでアドベンチャーゲームを作る場合、これらの名前が衝突したり、一定のルールを強制するなど、わかりやすい名前にしたいがためにもめごとが起きることが予想されました。そこで、今回はUUIDをベースとした名前を採用することで、わかりやすい名前という利点とは引き換えに、命名が衝突するという問題を回避しました。ライセンスを明記アドベンチャーゲームをみんなで作るということは、そのシナリオのライセンスで揉めることが予想されました。BY-SAのライセンスを明記しています。このライセンスにより、誰でもこのストーリーを利用することができ、またこのストーリーから派生したストーリについても同様のライセンスを強制することを実現しています。ゲームエンジン紹介このゲームエンジンの雰囲気を知ってもらうためにストーリの例を紹介します。下に示したように、基本的にはストーリを書いていくだけです。選択肢は「:」で始め、選択肢の文字列と、飛び先ラベルIDを記載します。ラベルIDは暗号のようですが、これは自動生成したものです。このようにラベルIDを自動生成することで、命名で揉めないようにしています。ラベルは「*」で始め、ラベルIDとそれに続けて人間がわかるラベルの名前を記載します。このラベルの名前は他と被っても大丈夫です。「%」で始まるのはその他の命令で、ここでは「%end」というゲーム終了の命令を利用しています。今のところ他には「%set」と「%eqif」があります。(詳しく知りたい方はリポジトリの説明を読んでください。)*l972e5150755648f9abe435c10df2d231,初めのシーンみんなで作るゲームエンジンのサンプルです。Requestをいただきました。Requestを作成したのですが、変更の仕方によってずいぶん印象が違うように思いました。存在しているストーリーを少しだけ変更することは、様々な整合性を考慮する必要があり、普通に0からストーリーを作るのとはまた違った難しさを感じました。選択肢を増やすだけで、またすぐ元の流れに合流するような変更は変更差分が少ないためストーリーそのものを考えるほどの想像力や労力はかからないように思いました。存在しているストーリーから分岐するものの、その後の展開は完全にオリジナルというようなストーリーを作るのは、整合性に関する難しさはほとんどない代わりに、新たなストーリを考えるという想像力と比較的長い文章を書くための労力が必要だと感じました。このように、このみんなでアドベンチャーゲームを作るという試みでは、従来の1人でストーリを作るのとはまた違ったスタイルで開発が行えることがわかりました。Requestをいただき、一応コラボレーションできているという状態まで持ってこれました。今後ものんびりと進めていければと考えていますので、この記事を読んでみて「面白そうだな」と思った方は、ぜひプロジェクトをforkして物語を追加してみてください。16:24みんなでアドベンチャーゲームを作ってみませんか?Tweet広告を非表示にするもっと読むコメントを書く2020-01-26FusionPCBを使って(ほぼ)はんだ付けせずに自作ゲーム機を作った(PCBA)↑この状態で中国から届く!というのがPCBAです。Assemblyの省略なのですが、要は「電子基板の作成(PCB)」と「電子パーツのはんだ付け(A)」をやってくれるサービスです。電子工作をある程度取り組んでいると、「自分の作ったものを人に配りたい/売りたい」という欲求がわいてきます。最近は中国のサービスを使うと比較的安くでプリント基板(PCB)の製造をお願いすることができます。1枚あたり500円いかない)これを使うことで、人に配る・売ることがかなり現実味を帯びてきます。そこで、まず思いつくのは「自分で作って売る」です。5個くらいなら何とかなりそうですが、10個を超えたあたりからつらくなってきそうです。次に思いつくのは「キットとして売る」です。実際私も自作電子楽器RakuChordをキットとして何度か販売しました。これも思ったほど楽ではない、、何なら「自分で作って売る」より神経を使います。究極は「誰かに作ってもらって売る」です。そんなことやってくれる人はいるのでしょうか・・・?そう、それがPCBAです。作ってもらう流れPCBAは名前の通りPCB+Aです。手順はほとんどプリント基板(PCB)を発注するときと同じです。PCBの手順については以前ブログ記事に書いたので(RakuChordの回路を発注してみた。blog)、基本的にはそれと同じです。気になるAの部分について少し紹介します。A=Assembleを依頼するために必要なのは、PCBの依頼に加えて、わずか3種類のファイルを用意するだけです。実装図これは基板のどこにどの番号の部品を置くかを記載したPDFファイルです。KICADを使って回路を設計していれば、本当に簡単な手順で出力することができます。ピック&プレースファイルこちらもKICADでポチポチするだけで出力できます。BOM(部品表)最後が一番用意するのが大変な部品表です。これは要は、基板上のどの番号に、どの部品を配置するかという対応表です。以前私はここを用意するのが大変で、PCBAをためらってしまっていました。今回の私には強い味方がいます。それがFusionPCBが提供する「OPL」です。Libraryの略で、FusionPCBが在庫として抱えているパーツの一覧です。(https://www.fusionpcb.jp/opl.html)ここにあるパーツであればFusionPCB内で在庫が存在するため、比較的早く見積もり・製造をしてくれるというものです。私にとってうれしかったのは、星の数ほどある部品の中から良さげなものを選んでくれているという点です。高周波なものやアナログ回路などを設計する人にとっては部品選定こそがメインの戦場なのでしょうが、私が作るような16MHz程度のデジタル回路においては、部品の違いなんていうのはほとんどありません。いうことで、今回はほぼ「OPLにあるパーツ縛り」で基板を設計しました。OPLは一部の部品に対してはフットプリントも公開しているので、これを使うと本当に簡単にPCBAに挑戦することができます。残念ながらすべての部品に対してフットプリントがあるわけではないので、無い部分はそれっぽいものを自作するなり、KICADの標準ライブラリのものを使いました。この「それっぽいフットプリント」も発注前は心配でしたが、ちゃんと部品が実装できるように作ってあれば、それっぽいフットプリントで問題なく実装してくれました。一部の部品はOPLには存在しなかったので、BOM表にはURLを書く形でみんな大好きLCSCのパーツのURLを貼り付けて発注してみました。すると、「カートに入っているのですが、決済できない」、という状態になり(どうやらOPL以外の部品を入れると部品の見積もりを行っているようです。)数日後に見積もりが終わり決済ができるようになりました。OPLだけで設計してあればすぐに決済できたのだと思います。その後決済を行うと、基板の製造と部品の調達が並行して行われます。ここでもOPLの場合はすぐに調達できるのですが、今回のように別のところから調達しようとすると数日待たされます。(おそらく調達先は少ないほうが良いだろうと思い今回はLCSCだけにしました。)そして、部品が調達できると実装(Assemble)が行われて、製品が発送されます。前述したように、カートに入れてから決済できるようになるまで2日間ほどかかりました。その後は下の図に書かれたようなスケジュールで製造が進みました。2020/01/02に入稿されたデータは、01/10に実装が完了しました。その後DHLで配送され、1/14に我が家に届きました。現在FusionPCBではPCBA5枚限定の「実装無料」というセールをやっています。なんと0円になります!(通常これらは$150ほどかかります。なんと送料も無料です。すごい!https://www.fusionpcb.jp/free-assembly-for-5-pcbs.html今回の基板の場合は5枚で大体$40くらいでした。1枚$10しない!すごい!あくまでセール価格なので、この値段を基にして原価を計算すべきではありませんが、PCBAを試したい人にとってはまたとないチャンスです。実装については個人的には大満足です。自分でやるのに比べて明らかにきれいです。今回は5枚中1枚、どうも不良の部品が実装されているようで、正しく動作しないものがありました。クレームをつけても良いのでしょうが、OPLではない部品だったこともあり、今回は何も言わずに受け取っていますが、たくさん作ってこの割合で不良品が入っていたら大変つらそうです。部品選定は大事だなと感じています。この辺をしっかりするためには、怪しいパーツの動作テストをしてもらうなどが必要そうです(FusionPCBでできるのかな?)バグどんなものにもバグはあります。今回私が設計した自作ゲーム機のハードウェアにもバグがありました。このスイッチです(右上)。私の計画ではこの部品はUSB端子と同じ側に実装されるつもりでした(左下)。私の送ったデータはそうなっておらず、(当然)指示通りの間違った側に実装されてしまいました。この部品はフットプリントが大きめだったので、5つすべてのスイッチをつけなおしました。つけなおすためには、はんだを加熱して部品をはがす必要があり、これは部品を実装する以上に手間です。やりたくないです・・PCBAのコツ表面実装部品を積極的に使うPCBAの醍醐味は表面実装部品です。リード部品は手でも簡単に実装できますが、面積を取ります。ICなどは表面実装パッケージしかないものもあります。実装費に関しては、リフローで実装できる表面実装部品のほうが安い(はず)です。PCBAするからには表面実装部品を使いたいところです。初めからOPLにある部品で設計するOPLにある部品を使うと、製造がスムーズにできます。そのため、PCBAで製造する基板で使用する部品はOPLにある部品を指定するのが良いです。後から部品を変更するのは大変です。OPLにある部品はAliExpressでも簡単に買える部品が多いので、事前にそれらの部品で動作確認をしておくのが良いでしょう。今回は抵抗・コンデンサは1206サイズを使って設計したのですが、OPLで安く手に入るのはもう少し小さなサイズ(0805とか0603、0402など)でした。次回作るときは先にサイズを確認しようと思っています。手はんだできる部品で設計する表面実装部品もある程度の大きさであれば手ではんだ付けできます。後述する手実装のフェーズのためになるべく手実装しやすい大きさの部品を使いましょう。一度PCBで発注して手実装して様子を見るPCBAは結構お金がかかります。そのため失敗したときのダメージが大きいので、一度PCBを作ってもらい自分で実装して動作確認をするのが良いです。今回の自作ゲーム機は3回PCBを作り部品の種類や配置の変更を繰り返し4回目にPCBAに挑戦しました。4回の変更で実装部品が大幅に減り、実装ミスの少ない基板が設計できました。5枚PCBAするせっかくセールで安く少ないロットで注文できるので、これを利用しない手はありません。数百個作りたい場合はまずは5枚のPCBAで様子を見るのはどうでしょう?私のケースのように品質の悪い部品や、実装面のまちがいなど意外な凡ミスに早期に気づくこととができるでしょう。(大量ロットを注文した時も事前に数枚作って確認する、などができると聞いたことがありますが、私はまだ試していません。個人的な印象ですが、中国で買うタクトスイッチは、安いのですが、なぜか異常にボタンが固いものが多いです。そんな中今回利用した6mmの表面実装タクトスイッチは100gFという軽いタッチが特徴です。データシートを見て、「この値段で100gF?!まさか~?」と思って発注したところ、本当に軽く押しやすいスイッチが実装されて届きました。スイッチの軸の高さが低いのがちょっと気になりますが、100gFのスイッチが欲しい人にはかなりおススメの逸品です。いう人のためにちょっと紹介を書いてみました。ここまでそれっぽいことを書いてきましたがまだたった5枚発注しただけのぴよぴよMakerですので、おかしなことを書いているぞ!とか、ほかにも面白いTipsがあるぞ!とう方は、ぜひぜひ教えてください。16:03FusionPCBを使って(ほぼ)はんだ付けせずに自作ゲーム機を作った(PCBA)Tweet広告を非表示にするもっと読むコメントを書く2020-01-03Arduinoだけで和音を鳴らす方法はじめに私はRakuChordというArduinoを基にした電子楽器を作っています。RakuChordはArduinoたった1つでキーの押下の読み取り、ディスプレイの制御、音の生成を制御しています。inajob.github.ioこの記事では、RakuChordでどのように和音を生成しているか?ということを解説していきます。実はこのRakuChord。初期バージョンは10年前くらいで、和音のロジックもそのころから少しずつ改良を加えてきています。どこにもドキュメントを残さずにここまで来たため、自分でもなぜこのソースコードで和音が鳴っているのかよくわからなくなることがありまして・・・自分の備忘録的な意味も込めてこの記事を書く事にしました。ComputersArduinoで「単音」を出すのはとても簡単です。簡単なのは無限ループを作り、そこでdigitalWriteであるピンの出力を上げたり下げたりする方法です。そのピンにスピーカをつなげることで、単音を再生することができます。適切に待ち時間を入れることで、これだけで単音を鳴らすことができます。1/440秒の半分の待ち時間を入れてdigitalWriteでHIGH/LOWを繰り返せばよいのです。2272uS}この方法では、音を鳴らしている間はほかの処理を行うことができません。Arduinoの関数であるtoneを使うとこの問題も解決します。toneは周波数を指定すると即座に処理が終わり、次の命令を実行することができますが、音は鳴り続ける。ここで処理中も音は鳴り続けている}https://www.arduino.cc/reference/jp/language/functions/advanced-io/tone/例えばゲーム機などを作る際、簡単なBGMであればtoneで十分です。Arduinoで「和音」Arduinoで「和音」というのは「単音」の時ほど簡単ではありません。和音を鳴らすためにはいくつかの方法が考えられます。複数のピンを使う和音の数だけピンを使い、オペアンプなどで合成したのちにスピーカーとつなげることで和音を鳴らすことができます。この方法は「単音」を複数並べるという点で単純でわかりやすいですが、ピンをたくさん使うことや、音の合成のためにオペアンプなどの部品が必要なことがデメリットです。ソフトウェアで合成する今回紹介するのはこちらの方法です。この方法では1つのピンの出力で和音を演奏する方法です。ソフトウェアの処理が複雑になりますが、単純な回路で和音を再生することができます。既存のライブラリソフトウェアで和音を合成するためには、これから紹介する「1から処理を書く」方法とは別に、既存のライブラリを利用することもできます。MozziMozziはArduinoで利用できるシンセサイザーライブラリとして非常に有名なものです。下記ページで大量のサンプルを聞くことができます。音関係でやりたいことの大半は、このライブラリを使うことで実現できます。このライブラリは音を扱う様々な処理の詰め合わせセットのようなものです。そのため単に「和音を鳴らしたい」という場合でもそこそこのプログラミングが必要となります。単純に和音を鳴らしたい場合はこの後紹介する別のライブラリのほうが簡単に実現できると思います。単純な和音ではなく、「音作り」にこだわりたい人にとってはMozziの豊富な音関係の関数群は非常に強い武器となるでしょう。PWMDAC_SynthPWMDAC_Synthはまさに「Arduinoで和音を鳴らす」ことに特化したライブラリです。6重和音を扱うことができ、さらにエンベロープも設定できます。VRA8-PシリーズVRA8-Pで利用できる3音を扱えるシンセサイザーのライブラリです。ArduinoのCPUをフルに使うことで、ほかのライブラリを圧倒する高音質を実現しています。この音源はArduinoのメモリ・CPUをかなり占有してしまうため、何かのロジックと組み合わせる場合は注意が必要です。場合によってはArduinoを2つ並べるなどして、片方は制御、片方はVRA8-Pを用いた音源、というような使い方のほうが良いかもしれません。自分で和音を鳴らす処理を書く既存のライブラリでは「痒い所」に手が届かない場合や、メモリ・CPU使用量を細かく調整したい場合、和音の合成処理自体に興味があるような場合は、自分で和音を鳴らす処理を書く事のがおすすめです。いうことで、以降RakuChordの音源での和音の処理について解説していきます。RakuChordの音源のソースコードRakuChordのファームウェアはオープンソースで公開しています。ここからは、このソースコードを眺めながらArduinoで和音を鳴らす方法を紹介します。soundSetupこの関数が音を鳴らすための準備をするものです。起動時に1度だけ呼び出すことを想定しています。内部では和音合成に必要なタイマーのセットアップを行っています。RakuChordで使うのはArduinoのピンのうちDigitalの9番ピンです。9番ピンをOUTPUTに設定しています。次にタイマーの設定を行います。このタイマーは9番ピンのPWMの制御と、和音の波形の計算のタイミング制御のために利用しています。Arduinoが使用しているマイコンATMega328には複数のタイマーが存在しますが、ここではTimer1を使用します。Timer1の設定のためにはTCCR1AとTCCR1Bという2つのレジスタを用います。このレジスタの特定のビットを上げたり、下げたりすることでTimer1の挙動を設定します。ここでは下記のような設定をしています。001分周なしちょっとこれだけでは何を言っているかわかりませんね・・もう少し解説します。分周比Timer1はTCNT1の値を適当な間隔でインクリメントしたりデクリメントしたりする仕組みです。具体的にどのようにTCNT1を動かすのかは後ほど説明しますが、その間隔について指定するときに用いるのが分周比です。ATMega328が動作している周波数に対しての比率でこの間隔を指定します。今回は「分周なし」の指定なので、Arduinoに搭載されている水晶発振子である16MHzの間隔でTCNT1を動かすことになります。比較一致WGM13~10によりTCNT1をどのように動作させるかを指定しています。今回は8bit位相基準PWMという指定です。このモードではTCNT1は0から1ずつカウントアップしていき0xff(8bitの上限)までカウントアップしたら次は1ずつカウントダウンしていきます。0まで下がったらあとは繰り返しです。オーバーフロー割込みは0xffに達したタイミングで実行されます。図にするとこのような感じです。COM1A1~0,はTCNT1の動作と連動してデジタル9番ピンにどのような信号を出力するかを設定しています。今回は「カウントアップ比較一致でLOW、カウントダウン比較一致でHIGH」を指定しています。比較に用いる値はOCR1Aレジスタの値です。図にするとこのような感じです。このようにタイマーと連動してデジタル9番ピンを制御することで、非常に高速にピンをHIGH/LOWに切り替えることができます。OCR1Aの値を変更することで、ON/OFF時間の比率を変更することができます。Modulation)というテクニックです。このように短い間隔でHIGH/LOWを切り替えることで、HIGH(5V)とLOW(0V)という2種類の値しか出力できないデジタル回路においてアナログっぽい値を作ることができます。(厳密にはアナログとは違いますが・・)このPWMを使うことで、単なる矩形波よりも複雑な様々な波形を生成することができます。「和音」も「波形」であらわすことができるため、そのような信号をPWM作ることで和音を鳴らすことができます。最後にこれらのタイマーを有効にするためにTIMASK1にTOIE1のビットを設定します。これでTCNT1が上限に達したときに割込みが発生します。TIMER1_OVF_vect今回利用するTimer1のオーバーフロー割込みはこの名前で呼び出されます。0と繰り返し変化していきます。これを1周期とするとこの1周期にかかる時間はとなります。(ソースコード上ここでTCNT2に値を代入しているが、これは何の意味もなさそう・・・)基本的にはこの割込みルーチンの中でdn[x]にd[x]を足していきます。xは0~4の5通りあり、これがオシレータを表しています。独立した5つの音を制御しているということです。最終的にはこのdn[x]から波形テーブルを引いて、5つあるそれぞれの結果をすべて足し合わせてOCR1Aレジスタの値として設定しています。