ウチツクシ

やったゲームのこと(大体STG)とか作ったゲームのこと

キーボードマニア専用コントローラの入力を取得する

以前、ピスコラ動かしたときキーマニの専コン思い出してPCに繋いだら認識してるみたいで、楽しくなってちょっと遊んでた。



ただホイールの入力が取れなくて、なんとか取得できないかと色々調べてたらUSBの入出力を直接扱うような方法で取ることができた。

それでモジュール作ったりソフトシンセ的なもの作っていたとき、win10の無料アップデート期間が過ぎかけていたから更新したら専コンが認識しなくなった…他のゲームパッドは認識してるのになんでや…

せっかく作ったモジュールやソフトシンセもったいなかったから、ソフトシンセは(PCの)キーボードで操作できるようにした (Mk-Synth)。モジュールも初めは公開しておこうと思ってたけど自分のPCでも動かないもの上げても…結局そのまま放置した。

しばらく忘れてたころ、windowsの更新で思い出してモジュール動かしてみたら認識した!?更新で不具合が解消されたのか、あのときはたまたま認識しなかっただけなのか…専コン繋げたままPCを再起動したりスリープ復帰すると接続が切れてるけど、繋ぎ直せば認識する。

ということでモジュールも公開。HSP使ってて専コン持ってる人が他にいるかとか考えない!

鍵盤とスタート・セレクトボタンだけならHSPに標準で入ってる mod_joystick.as(winmmのjoyGetPosEx)でも取得はできる。ホイール取得するためだけにこんな面倒なことしなくても、他の簡単な方法ありそうな気もする。

あとホイールはアナログ値じゃなくてデジタル。左右のホイールは共有してるから、左右別々には取れない。アナログだったら使い幅もっと広がりそうだったのが残念…

モジュール作る際に、HSPに付属の mod_usbio.as と USB for HSP | GHP(仮) は大変参考になりました。あと、ReadFile のオーバーラップ処理はほんと手こずった…入力に変更があるまで関数から帰ってこない現象に悩みまくってた。

リアルタイムにサウンドを生成・再生する

f:id:K-s:20160925193304p:plain
Mk-Synth、サウンドの再生にwaveOut系のAPIを使っているのだけど、スクリプトがHSPTV部門用に詰めてて自分でも分かりにくいので、再生部分だけでも分かりやすくなるようにサンプル書いた。
実行するといきなり音が鳴るので音量注意!マウス左ボタンで波形の形を変えれる。

; HSP3.5b4
#include "winmm.as"

  ; 基になる波形の準備
  bwsize = 100 ; 一周期の長さ
  ddim bwbuf, bwsize
  repeat bwsize
    if (cnt < bwsize / 2) {
      bwbuf(cnt) = 0.2
    } else {
      bwbuf(cnt) = -0.2
    }
  loop
  bwpos = 0
  
  boxsize = 3
  asprate = 0.5
  winsx = bwsize * boxsize
  winsy = asprate * winsx
  screen 0, winsx, winsy
  gosub *drawBaseWave

  channels = 1
  bits = 16
  samples = 44100
  blockalign = channels * bits / 8
  wbufnum = 5
  wbufblock = 1000
  wbufsize = wbufblock * blockalign ; 小さい程反応が早いが音が途切れやすい
  
  dim wfx, 4 ; WAVEFORMATEX
  wfx(0) = 1 | (channels << 16) ; WAVE_FORMAT_PCM
  wfx(1) = samples
  wfx(2) = samples * blockalign
  wfx(3) = blockalign | (bits << 16)
  
  ; デバイス オープン
  dim hwo
  waveOutOpen varptr(hwo), $ffffffff, varptr(wfx), 0, 0, 0 ; WAVE_MAPPER
  if stat {
    dialog "デバイスのオープンに失敗しました"
    end
  }
  
  ; マルチバッファリング用のバッファ準備
  sdim wavBuf, wbufsize * wbufnum
  dim whd, 8, wbufnum  ; WAVEHDR
  ptwhd = varptr(whd)
  repeat wbufnum
    whd(0, cnt) = varptr(wavBuf) + wbufsize * cnt, wbufsize
    pt = ptwhd + cnt * 32
    waveOutPrepareHeader hwo, pt, 32
    waveOutWrite hwo, pt, 32
  loop
  nowbuf = 0
  
  onexit goto *bye
  
*mainLoop
  await 1
  stick key, 256
  if (key & 256) { ; マウス左ボタン
    bwbuf(mousex / boxsize) = double((mousey - winsy / 2) / boxsize) * boxsize / winsy * 2
    gosub *drawBaseWave
  }
  if (whd(4, nowbuf) & 1) { ; WHDR_DONE(1): バッファの再生が終了している
    gosub *writeWave
  }
  goto *mainLoop

*drawBaseWave
  redraw 0
  color 255, 255, 255
  boxf
  color 0, 0, 0
  repeat bwsize
    x = cnt * boxsize
    y = (bwbuf(cnt) + 1) / 2 * winsy
    boxf x, y, x + boxsize - 1, y + boxsize - 1
  loop
  redraw 1
  return
  
*writeWave
  p = nowbuf * wbufsize
  repeat wbufblock
    wpoke wavBuf, cnt * 2 + p, int(bwbuf(bwpos) * $7fff)
    bwpos = (bwpos + 1) \ bwsize
  loop
  waveOutWrite hwo, ptwhd + nowbuf * 32, 32
  nowbuf = (nowbuf + 1) \ wbufnum
  return
  
*bye
  waveOutReset hwo
  repeat wbufnum
    waveOutUnprepareHeader hwo, ptwhd + cnt * 32, 32
  loop
  waveOutClose hwo
  end
  end

サウンドのバッファを複数用意しておいて再生が終わったバッファに波形を書くの繰り返し。再生が終わったのを知るのは oncmd で MM_WOM_DONE を受け取る方法もある(こっちが普通?)けど、今回は WAVEHDR構造体 の dwFlags をループでチェックしてる。

波形の作り方で色々音が変わるのが結構楽しい。キーマニ専コンで弾きたかった(Win10に更新したら動かなくなった…

ゲーセン近況

クリクロようやっと5ボス撃破できた!1面で2ミスして諦め全開だったのに何故かそのまま5ボス発狂まで行けて、しかも残一という初記録。ブレイク、ボムぶっ放しで撃破しましたよ。それに発狂の動きもだいぶ分かってきたのもある。バウンドの大小があって大きい時に抜ける感じ。初めはコレ絶対無理って思ってたけど、なんとかなるもんだ。

撃破してよっしゃクリアー!!とはいかないわけで。やっぱりいたよ、二体目が…接近してきてビーム撃ってくる攻撃で終わった。こいつ開幕から嫌らしいバラマキやってくるな。というかこのゲーム全般的になんか弾避けづらい気が…(言い訳

ボチボチ三年以上経つけどクリアはまだ遠そう。まだあのボスもう一回くらい変形隠してそうだし。あとちょっと気分転換に一号機と三号機でもやってみたけど、ロックが遅くて自機スピードが速い三号機が結構辛かった。一号機は二号機とあまり変わらない感じ。どっちも一応5ボスまでは行けた。Z機は、後で出てきた機体だから他のでクリア出来たら使ってみようかな。クリアできるか分からんがw

Mk-Synth

PCのキーボードを鍵盤代わりに音を鳴らしたり、鳴らした音を録音してwavファイルに出力したりします。

f:id:K-s:20160904022358p:plain:w240

HSPプログラムコンテスト2016 HSPTV部門に応募しました。
http://dev.onionsoft.net/seed/info.ax?id=1199

2016.12.10: スタンドアロン版(+ソースコード)公開しました。(2017.3.5: URLが間違っていました…)
https://1drv.ms/f/s!Ar6lqe2DjQo0gjIJgxFbihYbXRlX

とどけ蟻 スタンドアロン版(+ソースコード) とaxダイエット

HSPコンテストの季節がやってきた。今年で14年目、長寿なコンテストだなあと思う。作品応募者としては目標ができるし、ユーザーとしてはいろんな作品見られるし、今後もどんどん続いて欲しいな。
で、前回自分が応募したページ見ていてソース公開してなかったのに気づいて、せっかくなんでexeも作って公開しました。以下URLより。
https://1drv.ms/f/s!Ar6lqe2DjQo0gif3iUp0It6oqEC7

久々にスクリプト見て、ちょっとやり忘れ?な部分と memfile+picload で気づいたことを以下書く。

続きを読む