購入に至る流れ
シューティングゲームは得意ではないのですが、一部のタイトルは遊び続けています。その1つがバトルガレッガです。
PS4版のバトルガレッガも持っているのですが、うちの環境の問題なのか快適にプレイすることはできませんでした。
メーカーによる遅延対策がされていて、快適にプレイされている皆さんがいることは知っています。
そのためどこかに原因があるのだろうとモニター等の買い換えも考えていたくらいです。
しかしうちの環境は一応ゲーミングモニターかつ新しめのアケコンなので、買い換えても思ったほど効果が出ない可能性があります。
PS4版が出てからしばらくの間、基板価格がみるみる間に高騰していった時期がありました。
「このままいくと手に入れられなくなるのでは?」
「PS4版をストレス感じながら遊ぶよりも買えるうちに買っておいた方がいいのでは?」
「ゲームセンターまで割と遠いので、交通費が抑えられることを考えたらいけるのでは?」
「でも高すぎてもう手が出ないかなー」
などとヤフオクや基板屋さんの価格情報を定期的にチェックする日々が続きました。
そんなある時、相場よりはお安めな価格で出ているのを見つけました。
基板屋さんなのでヤフオクよりは安心ですし、のちのち売却することになっても大きな損はしないか、と買ってしまいました。
現在(2019.02)では値段も上げ止まったようなのですが、当分手放す予定はないですし、買って正解だったと思います。
ガレッガ用コントローラーを作製する
バーチャなどの他のゲーム用のコントローラーと兼用することも可能ではありますが、ボタン配置の変更が面倒そうです。
全ての入力を一度Arduinoなどのマイコンに入れて、ボタン配置変更や連射・コマンドコントローラー等の機能を持たせた、どんなゲームにも対応可能な高機能なものを作成しようかと考えたこともあります。
しかし、シンプルなものにした方がのちのちの修正もしやすそうだと思い直しました。
何より遊べるようになるまでの期間が長すぎると嫌になってしまう可能性もありますからね。
自分は、格ゲーは三和レバー・シューティングではセイミツレバーを使うことが多いのですが、こういった物理的な操作感はマイコンではどうしようもないですし、せっかくガレッガを家でやるのですから、複数の連射速度に対応させたボタンを付けたいという思いもあります。
やはりガレッガ用コントローラーは別に用意することにしました。
アケコンを入手する
以前コントローラー部分を作製したときと同じく、家庭用のアーケードスティックを手に入れて基板などを取り去りアーケード基板用の配線をする方向でいこうと思います。
当初は手持ちのHORI ファイティングスティックVXを使おうと思って配線まで済ませていたのですが、高さが足りないためしばらく放置していました。
レバーの先端が当たる問題はいろいろなサイトで指摘されていますが、自分の配線では各ボタンを複数取る必要があり、通常のファストン端子(メス)とは逆向きにファストン端子(オス)を付け、そこから分岐させたりしています。
そのせいでボタン側でも高さが不足していて、端子部分を横に折るように配置するのも耐久性の面から良くないかと思っていたのでした。
そのため三和・セイミツ等の市販パーツを使用できそうなアケコンをヤフオクで探し、低価格のもの(1000-2000円)を初期値のまま複数入札。落とせればラッキー、という方向で行きます。
ガワだけ使うためにあまりコストをかけたくないのです。
しばらくチャレンジを繰り返したところ、ヤフオクでいくつか格安アケコンを落札できたため、その中で最も状態が悪そうなものを使ってみることにします。
Madcatz FightStickPROというモデルです。
まずはネジを取って基板と配線を撤去し、拭き掃除して汚れとヤニを綺麗にします。
レバーは手持ちのレバーで一番シューティングに相性の良さそうなセイミツLS-32にしました。
ボタン配置を決める
Madcatz FightStickPROは最近のアケコンによくある4ボタンが2列配置されているスタイルです。
自分は上の段を人差し指から薬指までで操作するので、その横に1列追加されると、手の移動が発生します。
何かの拍子に間違ったボタンを押してしまわないとも限らないため、上段右端のボタンは使わないことにしました。
ボタン配置は以下の通りです。
元々アーケード基板を家で遊べるように環境を作り始めた際に、ガレッガ用の連射装置はゲームセンターのガレッガ台によくあるダイヤル式の連射装置を作ろうと考えていました。
そのためダイヤルも買っていて、どのように作るかのイメージもできていたのですが、よく考えてみたら自分はボーンナムしか使わないんですよね。
自機がボーンナムであれば(今のやり方であれば)秒間12連射/15連射/30連射の3段階あればカバーできます。
ガレッガでは一度連射速度を上げてしまうと下げられないという制約があり、処理落ちしている時に連射ボタンを押すと必要以上に速い連射が入ってしまって困ることがあるのです。
ガレッガでは弾を打つ=ランクが上がる、なのでできるだけミスりたくないところ。
ダイヤル連だとステージの合間に回し忘れてた、なんてことがこれまでにもあったため、確実に操作できるように12連と15連だけ別ボタンに割り当てることにしました。
秒間30連はボム連射で使用します。
A+B+Cの3ボタン同時押しは、ボタンの線だけ引き出せればダイオードを挟んでファストン端子につなぐだけです。ダイオードは1N4148を使用しています。
また、上の段を通常のA,B,Cとすることで、手持ち基板のBATSUGUN Special Versionをそのまま遊べるというメリットもあります。
BATSUGUN SPはCボタンにソフト連射が割り当てられているのでちょうど都合がいいのです。
このアケコンではスタートボタンとセレクトボタンは奥側面に配置されています。
・レバーやボタンを取り付ける表面
・スタート・セレクト・コントローラー基板が配置されているプラスチックパーツ
・底板
の3パーツに分かれていてとてもメンテナンス性が悪い。。
なぜこのような配置にしたんでしょうね…(ネジは全部で32個。しかもネジロック率高し。。)
スタートボタンの位置にはそのままスタートボタンを、
セレクトボタンの位置にはサービススイッチを割り当てました。
最初はコインスイッチを割り当てていたのですが、奥側面なので物に当たって押しっぱなしになることもあり、コインエラーとなってゲームが止まってしまうことがあったのです。
そのたびに電源の入れ直しをするのは非常にストレスだったので、サービススイッチにしてしまいました。
D-SUB15ピンコネクタにはサービススイッチの線も来ているため変更はすぐにできました。
ボタンも手持ち在庫を使用したのですが、24Φが1つ足りませんでした。
連射装置
せっかくなので、こちらで作った連射装置(仮)を多少変更しています。
基板用のコマンドコントローラー(バーチャ練習用)を作製したことで、PORT操作ができるようになったため、そのノウハウを活用することにします。
使用するマイコンはうちにたくさんあるArduino UNO R3(互換機なので500円程度)。
コマンドコントローラーで使用したArduino MEGA2560と異なり、Arduino UNOでは使用できるGPIOピン数も少なく、まとめてPORT操作できるピンも少ないです。
そのうち、仮に指定ミスをしても悪影響のなさそうなPORTBを使用することにしました。
見直すにあたりifの濫用をしていて見苦しかったソースを改修してシンプルな作りにしました。
配列の内容を順次GPIOに流し込むだけにしています。
PORTBは上位2bitは操作できないため00固定。
PORTBで操作できるのは下位6bit。
この各bitに各連射速度を割り当てます。
秒間30発のシンクロ連射はシューティングではよく使うので、
10,12,15,20,30(表),30(裏)
という案も当初考えたのですが、自宅で裏は使う機会が少なそうなので、
7.5,10,12,15,20,30
というガレッガダイヤル連によくある連射速度にしました。
Arduinoにはこの6段階の連射信号を出力できるようにしておいて、今回はそのうち12,15,30連だけを使用します。
V-SYNCごとに各bitを立てたり倒したりするようなロジックも考えたのですが、結局ハードコードしています。
連射速度用の6bitをON(0V)/OFF(+5V)させていくとして、例えば一番速度が速い秒間30発だと0,1の繰り返しで、一番速度が遅い秒間7.5発だと0,1,1,1,1,1,1の繰り返しになります。
つまり秒間7.5,10,12,15,20,30発ということを言い換えれば、1発あたりそれぞれ7/60秒,6/60秒,5/60秒,4/60秒,3/60秒,2/60秒ということですから、これらを配列で表現するには少なくとも2,3,4,5,6,7の最小公倍数である(2^2)*3*5*7=420個の要素が必要です。
Byte型の配列で宣言しますので、要素1つあたり1Byteですから420個宣言しても420Byte。
Arduino UNO R3のメモリは2KByteしかありませんが、十分足りる数です。
ロジックで組まずにハードコードするメリットの1つとして、タイミング調整がやりやすいことがあります。
例えば秒間15発の連射速度(4/60秒ごとに1発)の場合、ON,OFF,OFF,OFFの繰り返しで秒間15発ですが、ON,ON,OFF,OFF/ON,ON,ON,OFFの繰り返しでも秒間15発です。
処理速度的なメリットと、ゲームによって柔軟にタイミング調整ができそうだったため、ハードコードすることにしたのでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | volatile byte ren[] = { // 321117 // 005205 発/秒 //------------------ B00000000, B00111111, B00011111, B00101111, B00010111, B00111011, B00001101, B00111110, (中略) B00111111}; volatile int array_num = 0; volatile int array_max = 0; volatile unsigned long time_prev = 0,time_now; unsigned long time_chat = 4; // 4/60Sec. void setup() { // 111100 // 321098 GPIO PinNo. //--------------------------- // 321117 // 005205 発/秒 DDRB |= B00111111; attachInterrupt(0, V_SYNC, FALLING); //pin_no2 array_max = sizeof(ren); // 420 } void loop() { } void V_SYNC() { time_now = millis(); if ( time_now - time_prev > time_chat ) { //チャタリング対策 PORTB = ren[array_num] & B00111111; array_num += 1; if ( array_num > array_max ) { array_num = 0; } time_prev = time_now; } } |
できれば押した瞬間はONから始まるようにしたいとも思ったのですが、押した瞬間に配列をあたまから読むようにするためには、ボタンを押しているかどうかを判定しなくてはなりません。
V-SYNCごとにGNDをON/OFFする通常のシンクロ連射装置でもそのような処理は行っていない物が多いため、ひとまずそのままにすることにして、遊んでいく中でどうしても違和感が出た場合には検討することにしました。
オシロで見たところです。
上から、
・V-SYNC(垂直同期信号)
・秒間12連射
・秒間15連射
・秒間30連射
です。
ちゃんと動いていることがわかります。
動作確認
数ゲームテストプレイしてみましたが特に不具合はありませんでした。大丈夫そうです。
連射速度もゲームセンターで遊んでいる感覚と同じように出ているようで安心しました。
ただ、アケコンの手前側の傾斜とモニターの傾斜がゲームセンターとは違うため慣れが必要です。
モニターにはとても綺麗に映っているし、ビデオ撮りもできるし、快適な環境が手に入ってうれしくなりました。
やり込みますよ!
bookmarked!!, I like your blog!
“Having read this I believed it was really informative. I appreciate you finding the time and effort to put this information together. I once again find myself personally spending a significant amount of time both reading and posting comments. But so what, it was still worthwhile!”