ボタン拡張
 NScripter&Luaのサンプル、ボタン拡張スクリプトをアップしました。Delusionist's Utopia -NScripter-からDLできます。

 bexecなどの新ボタン系命令では、スプライトボタンをカーソルで選択して決定する、ということができません。bexecがカーソルの入力も捉えてしまうからです。これはちと不便だなと思ったので、カーソルで選択できるようにしてみました。
 まずはbspとbclearを上書き。bspでスプライト番号をLuaでテーブルに保存、bclearでテーブルを初期化します。次にspfocusnext、spfocusprev、spexecの3命令を追加。spfocusnextで次の、spfocusprevで前のスプライトにフォーカスを移すことができます。スプライトにフォーカスを移した状態でspexec命令が実行されると、選択されたスプライトの番号を得ることができます。使い方としては下のような感じ。
*loop
bexec $0,%0
if $0 == "UP" spfocusprev:goto *loop
if $0 == "DOWN" spfocusnext:goto *loop
if $0 == "RETURN" spexec %0
if %0 != -1 ;ここにスプライトが押された場合の処理を書く
goto *loop


 そこそこ使い勝手はいいと思うのですが、このスクリプトはまだ問題を残しています。
 たとえば「スプライトにフォーカスを移した状態でspexec命令が実行されると」と書きましたが、単にスプライトにマウスカーソルが重なっている状態でspexec命令が実行されてもスプライトの値は返ってきません。これはspexec命令が値を返す条件が「命令が実行された際にスプライトの左上座標とマウスの現在位置が重なっているか」というものだからです。
 スプライトの幅・高さからマウスカーソルがスプライト上に存在するかを判断してもいいのですが、もし新ボタン命令が透過ボタンに対応したらbexecとspexecで動作が食い違う可能性が出てきますし、そもそもマウスを動かせるのにクリックじゃなくてキーボードでボタンを選択するのも変な話です(ノートPCならありうるのかもしれませんが。タッチパッドの左ボタンよりキーボードの方が押しやすいとか)。
 なのでとりあえずは現状維持で行こうかなと。

 他にボタン命令を使いやすくできるアイデアが思いついたら、このボタン拡張スクリプトに盛り込むことにします。
 さて、次はテーブル周りとファイルの入出力でもやろうかな。



[追記]
 よく考えたら、透過ボタンの場合はスプライトの左上座標にカーソルを持っていってもボタンに重なるとは限らないんですよね。それなのにspexecで値が返ってきて押下処理されちゃうと、「カーソルが重なった状態」を飛び越して一気に「ボタンが押された状態」に行ってしまうことに……。うん、困った。
 旧ボタン命令でtransbtnを使用した場合、カーソルでスプライトを選択すると「透過されていない一番左上の部分」にカーソルが移動するようです。これと同様の処理を新ボタン命令でやるには、スプライトから1ピクセル抜き出して色・透過情報を調べられる命令を作ってもらうか、スプライトに対する当たり判定命令を作ってもらうかしないと、透過ボタンに対応するのは難しそうです。

[2009年5月11日追記]
 最新版でbexec命令が更新され、カーソルキーでの選択がデフォルトで可能になりました。btrans命令が追加されて透過ボタンにも対応。また、フルカスタマイズ用にスプライト系の命令がいくつか追加されるとのことです。
 ということでカーソルキー関連は、今後はそちらで対応することにしましょう。
[PR]
by lyricist_m | 2009-04-26 18:12 | NSLua
<< Luaのテーブル周りメモ 新ボタン命令について >>