読者です 読者をやめる 読者になる 読者になる

ウチツクシ

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

フォントをなるべく低メモリ・低負荷で拡大時もキレイに描画したい

f:id:K-s:20170129151158p:plain

と思ったけど考えたら2Dゲームに於いてはそんなに拡大することってないかも…でもせっかく調べたしアウトプットしとく。シルエットとかこのブログのロゴみたいなのにも使えそうなので。

続きを読む

Notepad++でHSPスクリプトを編集・実行できるようにする

面白そうなので便乗。6日目の記事になる予定です。はてなブログの予約投稿の実験も兼ねて。

概要

タイトル通りです。あとシンタックスハイライトや自動補完用キーワード集、ラベル・ユーザー定義命令のリスト表示など。自作ツールも使っててその紹介も兼ねてます。

MacLinux での環境構築の投稿もありますが、この記事は Windows 用です。当方の環境は Windows10、Notepad++ 7.2.2、HSP 3.5β4。後で出てくるHSPのキーワード用ファイルも 3.5β4 で作ってます。

なんでNotepad++?

ロゴのキャラがかわいい!

標準のスクリプトエディタでも最低限できるんですが、自動補完とか便利な機能に慣れてしまうともう戻れないのです。もちろん他にも良いエディタはあると思います。日本語対応とか考えるとサクラエディタが良さそうだし、新しい Sublime Text とか Visual Studio Code も良さそうなんですが、詳しい導入方法がよく分からんのです。Vimは、なんか次元が違う…
webのスクリプトコピペして実行したり数行のスクリプト書くときは TeraPad 使ってます。軽い。


そしてこんな記事書いといて何ですがNotepad++をHSPで使うのをオススメはしません。どっちかと言えばサクラエディタをオススメします!?

それでもOKという方はどうぞ。

続きを読む

ゲーセン近況

f:id:K-s:20161106113535j:plain

ゲーセンというかクリクロ近況になってるけど…

ついに最終決戦?EXBOSS2来たぞ。5面入ったとき残0、道中でエクステンドしてそのままボスまでノーミス(初かも)、ボス発狂で1ミスしてEX突入。ノーミスで倒してEX2開幕で殺られた。ビックリして焦ったちくしょう!

5面道中ノーミスが大きかったのかスコアを3000億近く更新できたのも嬉しい。クリアするまで止めとくつもりだったけど思わず撮影してしまった。クリアしてもこのスコア出せないかもしれないから。(クリアボーナス1兆とかだったら知らんw

にしてもランキングトップの6兆7兆とかどうなってんだろう。残機ボーナスで1機1兆くらい入るの?自分もそれなりに稼いでるつもりだけど、全ノーミスで上手くいってもあそこまでいきそうにないぞ。まだ知らない稼ぎ方があるんだろう。

とりあえずクリア目指してるけど、ダブルブレイクが心地よすぎて稼ぎに走ってしまう…
ただもうクリアはもうすぐだと思いたい!次の近況はクリア報告にしたい!

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

以前、ピスコラ動かしたときキーマニの専コン思い出して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に更新したら動かなくなった…