HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0908
新開地翔ローマ字入力のブレについて6未解決


新開地翔

リンク

2011/9/8(Thu) 19:34:06|NO.41245

こんにちは、現在HSPでタイピングゲームに挑戦中の新開地翔と申します。

現在製作中のゲームにローマ字入力のブレ(例:「し」では"shi"と"si"のような感じのもの)に
対応させてみたいと思い、プログラムを組んでみようと考えたわけですが、プログラムを組む
途中でテストしてみたところ、凍ってしまいます。

どうすれば解決するでしょうか。

こちらが私のプログラム(一部を抜粋・未完)です。


#pack "type00.wav" #pack "romaji1.txt" #pack "romaji2.txt" mmload "type00.wav",0 mmload "beep01.wav",1 *start screen 0,800,640,0,100,70 notesel data noteload "romaji1.txt" notesel data2 noteload "romaji2.txt" hiragana="いいなおすけ" romaji="" mojif=2 shf=0 tsuf=0 k1=48 k2=49 k3=50 k4=51 k5=52 k6=53 k7=54 k8=55 k9=56 k0=57 a=65 b=66 c=67 d=68 e=69 f=70 g=71 h=72 i=73 j=74 k=75 l=76 m=77 n=78 o=79 p=80 q=81 r=82 s=83 t=84 u=85 v=86 w=87 x=88 y=89 z=90 goto *henkan ;ひらがな→ローマ字変換に飛ぶ *type moji=strmid(hiragana,0,2) if strlen(hiragana)!=2 :moji2=strmid(hiragana,0,4) :else moji2="/" roma=strmid(romaji,0,1) if strlen(romaji)!=1 :roma2=strmid(romaji,0,2) :else roma2="/" rr=strlen(romaji) buffer 1,800,640 pos 20,294 mes hiragana mes romaji gsel 0 gcopy 1,0,0,800,640 key=0 key=iparam if key=a { if roma="a" :goto *eraseboth :else :goto *miss } if key=i { if roma="i" :goto *eraseboth :else :goto *miss } if key=u { if roma="u" :goto *eraseboth :else :goto *miss } if key=e { if roma="e" :goto *eraseboth :else :goto *miss } if key=o { if roma="o" :goto *eraseboth :else :goto *miss } if key=k { if roma="k" { if moji="っ" :goto *eraseboth if instr(data2,0,moji2)!=-1 :mojif=4 goto *eraseroma } else :goto *miss } if key=s { if roma="s" { if moji="っ" :goto *eraseboth if instr(data2,0,moji2)!=-1 :mojif=4 if roma2="sh" :shf=1 if tsuf=1 { mmplay 0 tsuf=0 goto *type } goto *eraseroma } else :goto *miss } if key=c { if roma="c" { if moji="っ" :goto *eraseboth if instr(data2,0,moji2)!=-1 :mojif=4 goto *eraseroma } else :goto *miss } if key=t { if roma="c" { if moji="っ" :{ gosub *cxtu goto *eraseboth } } } goto *type *cxtu getstr romaji2,romaji,2 romaji="tt"+romaji2 return *eraseroma mmplay 0 getstr romaji2,romaji,1 romaji=romaji2 goto *type *eraseboth mmplay 0 getstr romaji2,romaji,1 getstr hiragana2,hiragana,mojif romaji=romaji2 hiragana=hiragana2 mojif=2 goto *type *miss mmplay 1 goto *type



この記事に返信する


新開地翔

リンク

2011/9/8(Thu) 19:35:37|NO.41246

書き忘れましたが、*henkanのラベルのところのプログラムは省略しました(この部分は正常に
動いているため)



FPW

リンク

2011/9/8(Thu) 19:52:33|NO.41248

掲示板に乗せるスクリプトは、コピペで動作(不具合)が確認できる
状態のものにしましょう。
ファイルの読み込みは他の方は出来ません。
また、gotoで*henkanに飛んでいますが、*henkanが省略されてしまっているので
その後の流れが分からなくなっています。
以後お気をつけください。

*henkanのあと*typeへ飛んでいると思われるのでその前提で話します。
*type〜goto *typeループの中にawait等を入れないと過度な処理負担によりフリーズします。
無限ループを作る際は必ずawait命令を入れましょう。



backdrop

リンク

2011/9/8(Thu) 19:55:18|NO.41249

凍る原因はhenkanで何をやってるのかともかく
waitがどこにも入っていないぞ。

スクリプトの最初文字コードを一文字づつメモっているようだが
サンプルのタイピングゲームにあるように、onkeyなら
iparamから簡単に文字コードを取得できるぞ。
あれは次の文字と入力したキーの文字が合致しているかを見比べ
必要な処理を行っているのだ。

で、
そのサンプルにあったものを改造している前提で
結局こういうことがやりたいんだろう。
※最初にmod_regexp.asをインクルードしておくこと。

//Shiftキー誤検知防止 if ( iparam == 0 ) and ( wparam == 16 ) : return //タイプ成功フラグ(0:失敗 1:成功) typeok = 0 //今の位置にある文字を取得 now_cur = peek( mondai.current, meposition ) //その前にある文字を取得 if meposition > 0 : prev_cur = peek( mondai.current, meposition-1 ) //カレント+1 if meposition < strlen( mondai.current ) : next_cur = peek( mondai.current, meposition+1 ) //カレント+2 if meposition < strlen( mondai.current )-1 : wait_cur = peek( mondai.current, meposition+2 ) //原則として完全一致 //シフトキー if shiftkey{ if ( a == '?' ) and ( iparam == 47 ) : typeok = 1 if ( a == '!' ) and ( iparam == 49 ) : typeok = 1 }else:if iparam == a : typeok = 1 //特例措置一覧 //別例:SHI⇔SI if( prev_cur == 'S' ) and ( now_cur == 'H' ) and ( next_cur == 'I' ) and ( iparam == 'I' ){ replace( mondai.current, "SHI", "SI" ) typeok = 1 } if( prev_cur == 'S' ) and ( now_cur == 'I' ) and ( iparam == 'H' ){ replace( mondai.current, "SI", "SHI" ) typeok = 1 } //別例:ZI⇔JI if( now_cur == 'Z' ) and ( next_cur == 'I' ) and ( iparam == 'J' ){ replace( mondai.current, "ZI", "JI" ) typeok = 1 } if( now_cur == 'J' ) and ( next_cur == 'I' ) and ( iparam == 'Z' ){ replace( mondai.current, "JI", "ZI" ) typeok = 1 }
全部は書いてないけどね。
何をどう操作してるのかはよく読めばわかると思うから頑張ってくれ
あとはサンプルのスクリプトを、typeokの値で入力チェックするようにすれば大丈夫



backdrop

リンク

2011/9/8(Thu) 20:00:55|NO.41250

↑追記
変数current:入力されるはずのワードが格納された配列変数mondaiに対して、今の問題の番号
mondaiの各要素は、「大文字の」英数のみで入力しないと
onkeyで取得したiparamと合致しないので注意。

変数typeok:最初のコメント参照
この後正しく入力されたかのチェックを個の変数の値で行う

変数meposition:mondai.currentの文字列に対して、次に入力される文字の位置
基本的にinstrやstrmidで扱うインデックス値と同じ。

ちなみにwparam=16というのはShiftキーだ。
読めばわかるが、'!'や'?'に対応させるために追加している。



新開地翔

リンク

2011/9/8(Thu) 21:30:26|NO.41252

>FPMさん
ご指摘ありがとうございます! ファイルの読み込みは関係ないと考え、音楽ファイルには
あえて触れませんでした。以後気をつけます。

>backdropさん
ご指摘とスクリプトの提供ありがとうございます! 参考にさせて頂きます。



backdrop

リンク

2011/9/10(Sat) 14:52:50|NO.41287

あ、あと訂正
正しく処理できるようにすればいいけど、replace関数は置き換え後の文字列を返すので
適当な変数に代入しておいて



ONION software Copyright 1997-2021(c) All rights reserved.