RPGエディタでオリジナル選択肢関数を使う
投稿者: mosmoss 投稿日:2017/01/14 10:37
とりかさんの簡単ウィンドウ関数とラジアンさんのオリジナル選択肢関数を
RPGエディタで使う場合の数値や注意事項、効率的な書き方の記事です
これらの関数を使うことで、文字表示スピード・カーソル/決定などの効果音設定、
ウィンドウベースの変更、メッセージウィンドウ複数同時表示などが実現します
前々々回の記事の制作中のゲーム内で
この処理を使ったメッセージ選択肢を採用してみました
1日進めるとウィンドウベースの変更もできます
どんなもんか見たい人がいたらチェックしてみてください
スクリプト元
http://rmake.jp/published_items/51019/
オリジナル選択肢関数2
最低限クリップしておくスクリプト素材
スクロールバー
選択肢マーク
選択肢バー
makeデフォルトウィンドウの雛形
最低限、開始スクリプトに書いておく関数
・引数から配列を得る関数(cfm_さんの関数)
・簡単ウィンドウ関数とオリジナル選択肢関数のセット
・自分で設定した、スピーク文と選択肢文に当たる関数
実際のエディタには例えば次のように書く
注意点1
選択肢の配列の一番最初(配列[0])の中身に半角数字の0を設定すると
その選択肢を選ぶことができない(条件はちゃんと突き止めていない)
(カーソルオンでマークが移動するがクリックしても決定扱いにならない)
この場合、英字のオーか全角数字の0で代用するなどの工夫が必要
配列の中に何も入っていない時に選択肢を選べないようにする仕様が関係している?
注意点2.1
キャンパスがビジブルになっていないと文字だけ表示されて枠が表示されない
RPGエディタでは頻繁にキャンパスがリセットされるため、
確実に簡単に枠を表示したい場合、スピーク文を表示するだけの関数を自分で作って
その中にキャンパスをビジブルにする処理を入れたほうがいい
注意点2.2
選択肢も同様の理由で自分で選択肢関数を作ったほうがいい
選択肢に使う配列を用意する際には
cfm_さんの引数から配列を得る関数が便利なので使ったほうがいい
注意点2.3
メッセージを複数立ち上げる時は簡単ウィンドウ関数を使うが、頻繁に使用する場合、
これも同様に、自分で関数を作って中にキャンパスビジブル処理を書いたほうが手間が少ない
注意点3
画面テキストはデフォルトのフェードアウトよりも下のレイヤーにあるので、
デフォルト機能で画面を黒くフェードアウトさせてその上にこの関数で作ったメッセージを表示させることができない
一色フェードアウトをしてその上からメッセージウィンドウ・テキストを表示させるには
cfm_さんのフルカラー画像を使う必要がある
アイデア
オリジナル選択肢関数は見ての通り長い関数です
開始スクリプトに書く場合、他の処理を書いたり編集するのに煩わしくなる場合があるほか
変数や関数をたくさん設定しているゲームの場合はそもそも関数が入りきらない可能性もあります
そこで、大方のゲームに必要な機能を作り終わるまでは
hanasu()関数やchoice()関数の中に普通のspeak(s)やspeakWithSelectArray(a, b)を書いておき
後から関数をコピペ、あるいはコピペできるか検討し可能なら、
oriSpeakText(s)やoriSpeakSelect(a,b,no)に書き換えるという方法がいいかもしれません
ツイート
RPGエディタで使う場合の数値や注意事項、効率的な書き方の記事です
これらの関数を使うことで、文字表示スピード・カーソル/決定などの効果音設定、
ウィンドウベースの変更、メッセージウィンドウ複数同時表示などが実現します
前々々回の記事の制作中のゲーム内で
この処理を使ったメッセージ選択肢を採用してみました
1日進めるとウィンドウベースの変更もできます
どんなもんか見たい人がいたらチェックしてみてください
スクリプト元
http://rmake.jp/published_items/51019/
オリジナル選択肢関数2
最低限クリップしておくスクリプト素材
スクロールバー
選択肢マーク
選択肢バー
makeデフォルトウィンドウの雛形
最低限、開始スクリプトに書いておく関数
・引数から配列を得る関数(cfm_さんの関数)
・簡単ウィンドウ関数とオリジナル選択肢関数のセット
・自分で設定した、スピーク文と選択肢文に当たる関数
#引数から配列を得る関数/引数40個バージョン #選択肢を作るために使います #これを使う場合、選択肢40個まで、それ以上作りたいときは下の関数をいじって増やす def array2(a00,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39) a=createArray() if toString(a00)=="null"&&a00!="null" then return a;else pushArray(a,a00);end if toString(a01)=="null"&&a01!="null" then return a;else pushArray(a,a01);end if toString(a02)=="null"&&a02!="null" then return a;else pushArray(a,a02);end if toString(a03)=="null"&&a03!="null" then return a;else pushArray(a,a03);end if toString(a04)=="null"&&a04!="null" then return a;else pushArray(a,a04);end if toString(a05)=="null"&&a05!="null" then return a;else pushArray(a,a05);end if toString(a06)=="null"&&a06!="null" then return a;else pushArray(a,a06);end if toString(a07)=="null"&&a07!="null" then return a;else pushArray(a,a07);end if toString(a08)=="null"&&a08!="null" then return a;else pushArray(a,a08);end if toString(a09)=="null"&&a09!="null" then return a;else pushArray(a,a09);end if toString(a10)=="null"&&a10!="null" then return a;else pushArray(a,a10);end if toString(a11)=="null"&&a11!="null" then return a;else pushArray(a,a11);end if toString(a12)=="null"&&a12!="null" then return a;else pushArray(a,a12);end if toString(a13)=="null"&&a13!="null" then return a;else pushArray(a,a13);end if toString(a14)=="null"&&a14!="null" then return a;else pushArray(a,a14);end if toString(a15)=="null"&&a15!="null" then return a;else pushArray(a,a15);end if toString(a16)=="null"&&a16!="null" then return a;else pushArray(a,a16);end if toString(a17)=="null"&&a17!="null" then return a;else pushArray(a,a17);end if toString(a18)=="null"&&a18!="null" then return a;else pushArray(a,a18);end if toString(a19)=="null"&&a19!="null" then return a;else pushArray(a,a19);end if toString(a20)=="null"&&a20!="null" then return a;else pushArray(a,a20);end if toString(a21)=="null"&&a21!="null" then return a;else pushArray(a,a21);end if toString(a22)=="null"&&a22!="null" then return a;else pushArray(a,a22);end if toString(a23)=="null"&&a23!="null" then return a;else pushArray(a,a23);end if toString(a24)=="null"&&a24!="null" then return a;else pushArray(a,a24);end if toString(a25)=="null"&&a25!="null" then return a;else pushArray(a,a25);end if toString(a26)=="null"&&a26!="null" then return a;else pushArray(a,a26);end if toString(a27)=="null"&&a27!="null" then return a;else pushArray(a,a27);end if toString(a28)=="null"&&a28!="null" then return a;else pushArray(a,a28);end if toString(a29)=="null"&&a29!="null" then return a;else pushArray(a,a29);end if toString(a30)=="null"&&a30!="null" then return a;else pushArray(a,a30);end if toString(a31)=="null"&&a31!="null" then return a;else pushArray(a,a31);end if toString(a32)=="null"&&a32!="null" then return a;else pushArray(a,a32);end if toString(a33)=="null"&&a33!="null" then return a;else pushArray(a,a33);end if toString(a34)=="null"&&a34!="null" then return a;else pushArray(a,a34);end if toString(a35)=="null"&&a35!="null" then return a;else pushArray(a,a35);end if toString(a36)=="null"&&a36!="null" then return a;else pushArray(a,a36);end if toString(a37)=="null"&&a37!="null" then return a;else pushArray(a,a37);end if toString(a38)=="null"&&a38!="null" then return a;else pushArray(a,a38);end if toString(a39)=="null"&&a39!="null" then return a;else pushArray(a,a39);end return a end ## 簡単ウィンドウ関数ここから ## ## SimpleWindow ## def SWin(WinSpr, FL_Size, XPos, YPos, XSize, YSize) ## 元になる画像のID ## WinSpr = 203458 ## 元になる画像の大きさ ## FL_Size = 18 ## 画像スプライト生成 MyWinNW = createSprite(WinSpr) MyWinNE = createSprite(WinSpr) MyWinSW = createSprite(WinSpr) MyWinSE = createSprite(WinSpr) MyWinN2 = createSprite(WinSpr) MyWinW2 = createSprite(WinSpr) MyWinE2 = createSprite(WinSpr) MyWinS2 = createSprite(WinSpr) MyWinCNT = createSprite(WinSpr) ## 分割利用時のサイズ CutSize = FL_Size / 3 ## 集合画像の設定 setSpriteRect(MyWinNW, 0, 0, CutSize, CutSize, 0, 0, CutSize, CutSize) setSpriteRect(MyWinNE, CutSize * 2, 0, CutSize, CutSize, XSize - CutSize, 0, CutSize, CutSize) setSpriteRect(MyWinSW, 0, CutSize * 2, CutSize, CutSize, 0, YSize - CutSize, CutSize, CutSize) setSpriteRect(MyWinSE, CutSize * 2, CutSize * 2, CutSize, CutSize, XSize - CutSize, YSize - CutSize, CutSize, CutSize) setSpriteRect(MyWinN2, CutSize, 0, CutSize, CutSize, CutSize, 0, XSize - CutSize * 2, CutSize) setSpriteRect(MyWinW2, 0, CutSize, CutSize, CutSize, 0, CutSize, CutSize, YSize - CutSize * 2) setSpriteRect(MyWinE2, CutSize * 2, CutSize, CutSize, CutSize, XSize - CutSize, CutSize, CutSize, YSize - CutSize * 2) setSpriteRect(MyWinS2, CutSize, CutSize * 2, CutSize, CutSize, CutSize, YSize - CutSize, XSize - CutSize * 2, CutSize) setSpriteRect(MyWinCNT, CutSize, CutSize, CutSize, CutSize, CutSize, CutSize, XSize - CutSize * 2, YSize - CutSize * 2) ## 表示位置の設定 setSpritePosition(MyWinNW, XPos, YPos) setSpritePosition(MyWinNE, XPos, YPos) setSpritePosition(MyWinSW, XPos, YPos) setSpritePosition(MyWinSE, XPos, YPos) setSpritePosition(MyWinN2, XPos, YPos) setSpritePosition(MyWinW2, XPos, YPos) setSpritePosition(MyWinE2, XPos, YPos) setSpritePosition(MyWinS2, XPos, YPos) setSpritePosition(MyWinCNT, XPos, YPos) arrWin = createArray() arrWin[0] = MyWinNW arrWin[1] = MyWinNE arrWin[2] = MyWinSW arrWin[3] = MyWinSE arrWin[4] = MyWinN2 arrWin[5] = MyWinW2 arrWin[6] = MyWinE2 arrWin[7] = MyWinS2 arrWin[8] = MyWinCNT return arrWin end ## SimpleWindow ## ## SimpleWord ## def SWor(Words, XPos, YPos, XSize, YSize) ## 表示する文字列 ## Words = "trick" textID = createText(XPos, YPos, XSize, YSize) setText(textID, Words) return textID end ## SimpleWord ## ## DeleteWord ## def DWor(arrWor) deleteText(arrWor) end ## DeleteWord ## ## DeleteWindow ## def DWin(arrWin) i = 0 while i < 9 deleteSprite(arrWin[i]) i = i + 1 end end ## DeleteWindow ## ## DeleteWindowPrint ## def DWP(arrWP) DWin(arrWP) DWor(arrWP[9]) end ## DeleteWindowPrint ## ## WindowsPrint ## def WPri(Words, WinSpr, FL_Size, XPos, YPos, XSize, YSize) ## 表示する文字列 ## Words = "trick" SetPX = 13 SetPY = 4 s1 = createArray() s1 = SWin(WinSpr, FL_Size, XPos, YPos, XSize, YSize) t1 = SWor(Words, XPos + SetPX, YPos + SetPY, XSize - (SetPX * 2), YSize - (SetPY * 2)) #DWor(t1) #DWin(s1) pushArray(s1, t1) return s1 end ## WindowsPrint ## ## 簡単ウィンドウ関数ここまで ## # ------↓↓ オリジナル選択肢関数 ↓↓------ # # 設定部分 #ウィンドウの表示領域をRPGエディタ用に設定してあります # ウィンドウの画像のID setVariable("oriSpeakWinSprNo", 203458) setVariable("oriSpeakWinSize", 18) # 3の倍数にしたほうがいい setVariable("oriSpeakWinSprZOrder", 1000) # 選択肢関連の画像のID setVariable("oriSpeakSelectBarSprNo", 228837) # スクロールバー setVariable("oriSpeakSelectMarkSprNo", 220645) # 選択場所を示すマーク # speak関数部分の表示領域の設定 setVariable("speakText_x", 28); setVariable("speakText_y", 256) setVariable("speakText_w", 512-28-28) setVariable("speakText_l", 5)# 行数 # 選択肢部分の表示領域の設定 setVariable("speakSelect_x", 512-160-32); setVariable("speakSelect_y", 96) setVariable("speakSelect_w", 160) # 選択肢の表示部分の最大数 setVariable("speakSelect_maxLen_h", 7) # 縦(3以上) setVariable("speakSelect_maxLen_w", 7) # 横 # 文字のスピードの設定 # もともとメッセージの表示設定が「0(一度に表示)」の場合は関係ない。 setVariable("speakTextMaxSpeed", 30) # 選択肢のスクロールスピードの設定 setVariable("speakSelect_maxSpeed", 7) # オリジナル選択肢関数群 def deleteSpeakText() setVariable("existSpeakText", false) DWP(getVariable("spriteNo_speakText")) end def drawSpeakSelectText() if !getVariable("isDraw_speakSelect") then return 0; end setVariable("isDraw_speakSelect", false) yc = getVariable("speakSelect_yCnt") len_h = getVariable("speakSelect_len_h") len_w = getVariable("speakSelect_len_w") x = getVariable("speakSelect_x"); y = getVariable("speakSelect_y") w = getVariable("speakSelect_w") h1 = getTextFontSize(); h2 = floor(h1 * 1.18) h3 = 6 + (len_h - 1) * h2 + h1 + 6 + 3 if getVariable("speakSelect_isBar_w") then h4 = h3 + 8; else h4 = h3; end if getVariable("speakSelect_isBar_h") then w3 = w - 8; else w3 = w; end w2 = floor((w3 - 18 - 4) / len_w) sID = getVariable("oriSpeakWinSprNo") sSize = getVariable("oriSpeakWinSize") sz = getVariable("oriSpeakWinSprZOrder") ssn = getVariable("speakSelect_selectNo") st = getVariable("speakSelect_selectTop") sal = getVariable("speakSelect_sArrLen") snArr = createArray(); snArr = getVariable("spriteNo_speakSelectBar") pArr = createArray(); pArr = getVariable("speakSelect_isPush") vn = "spriteNo_speakSelectText" if getVariable(vn)[0] == 0 setVariable(vn, SWin(sID, sSize, x, y, w, h4)) n = 0; while n < 9 setSpriteZOrder(getVariable(vn)[n], sz) n = n + 1; end end if getVariable("spriteNo_speakSelected") == 0 sn = createSprite(getVariable("oriSpeakSelectMarkSprNo")) setVariable("spriteNo_speakSelected", sn) setSpriteZOrder(sn, sz + 1) else sn = getVariable("spriteNo_speakSelected") end setSpriteRect(sn, getVariable("speakSelect_markCnt") * 16, 0, 16, 16, 0, 0, 16, 16) if yc != 0 mpy = (ssn % yc) - (st % yc) mpx = floor(ssn / yc) - floor(st / yc) else mpy = ssn - st; mpx = 0 end setSpritePosition(sn, x + 5 + mpx * w2, y + 4 + 4 + floor(h1 / 2) - 8 + mpy * h2) barSpriteID = getVariable("oriSpeakSelectBarSprNo") if getVariable("speakSelect_isBar_h") if yc != 0 pt = (st % yc) / yc; pl = len_h / yc else pt = st / sal; pl = len_h / sal end bty = y + 12 + floor((h3 - 24) * pt) bly = floor((h3 - 24) * pl) if snArr[0][0] == 0 n = 0; while n < 6 snArr[0][n] = createSprite(barSpriteID) setSpriteZOrder(snArr[0][n], sz + 1) n = n + 1;end setSpriteRect(snArr[0][0], 6, 0, 6, 1, x + w - 10, y + 11, 6, 1) setSpriteRect(snArr[0][1], 6, 1, 6, 4, x + w - 10, y + 12, 6, h3 - 24) setSpriteRect(snArr[0][2], 6, 5, 6, 1, x + w - 10, y + h3 - 12, 6, 1) setSpriteRect(snArr[0][3], 1, 1, 4, 4, 0, 0, 4, bly) end if pArr[0] then rx = 0 else rx = 6; end setSpriteRect(snArr[0][4], rx, 0, 6, 6, x + w - 10, y + 4, 6, 6) if pArr[2] then rx = 0 else rx = 6; end setSpriteRect(snArr[0][5], rx, 0, 6, 6, x + w - 10, y + h3 - 10, 6, 6) setSpritePosition(snArr[0][3], x + w - 9, bty) end if getVariable("speakSelect_isBar_w") btx = x + 12 + floor((w3 - 24) * (floor(st / yc) / floor(sal / yc))) blx = floor((w3 - 24) * (len_w / floor(sal / yc))) if snArr[1][0] == 0 n = 0; while n < 6 snArr[1][n] = createSprite(barSpriteID) setSpriteZOrder(snArr[1][n], sz + 1) n = n + 1; end setSpriteRect(snArr[1][0], 6, 0, 1, 6, x + 11, y + h4 - 10, 1, 6) setSpriteRect(snArr[1][1], 7, 0, 4, 6, x + 12, y + h4 - 10, w3 - 24, 6) setSpriteRect(snArr[1][2],11, 0, 1, 6, x + w3 - 12, y + h4 - 10, 1, 6) setSpriteRect(snArr[1][3], 1, 1, 4, 4, 0, 0, blx, 4) end if pArr[3] then rx = 0 else rx = 6; end setSpriteRect(snArr[1][4], rx, 0, 6, 6, x + 4, y + h4 - 10, 6, 6) if pArr[1] then rx = 0 else rx = 6; end setSpriteRect(snArr[1][5], rx, 0, 6, 6, x + w3 - 10, y + h4 - 10, 6, 6) setSpritePosition(snArr[1][3], btx, y + h4 - 9) end end def deleteSpeakSelectText() deleteSpeakText() snArr = createArray(); snArr = getVariable("spriteNo_speakSelectBar") sn2Arr = createArray(); sn2Arr = getVariable("textID_speakSelectText") setVariable("speakSelectText_flg", false) setVariable("existSpeakSelectText", false) DWin(getVariable("spriteNo_speakSelectText")) getVariable("spriteNo_speakSelectText")[0] = 0 deleteSprite(getVariable("spriteNo_speakSelected")) setVariable("spriteNo_speakSelected", 0) len = getVariable("speakSelect_len_w") * getVariable("speakSelect_len_h") n = 0; while n < len DWor(sn2Arr[n]) sn2Arr[n] = 0 n = n + 1; end n = 0; while n < 2 m = 0; while m < 6 if snArr[n][m] != 0 deleteSprite(snArr[n][m]); snArr[n][m] = 0 end m = m + 1; end n = n + 1; end end def oriSpeak_drawProcess() drawSpeakSelectText() drawCanvas() end def setTextSpeakText() if !getVariable("isSetText_speakText") then return 0; end setVariable("isSetText_speakText", false) #ここに単音の効果音を入れると、文字が増えるたびに再生される #playSound(44260) setText(getVariable("textID_speakText"), getVariable("speakText_word")) end def setTextSpeakSelect() if !getVariable("isSetText_speakSelect") then return 0; end setVariable("isSetText_speakSelect", false) len_h = getVariable("speakSelect_len_h") len_w = getVariable("speakSelect_len_w") x = getVariable("speakSelect_x"); y = getVariable("speakSelect_y") w = getVariable("speakSelect_w") h1 = getTextFontSize(); h2 = floor(h1 * 1.18) h3 = 6 + (len_h - 1) * h2 + h1 + 6 + 3 if getVariable("speakSelect_isBar_w") then h4 = h3 + 8; else h4 = h3; end if getVariable("speakSelect_isBar_h") then w3 = w - 8; else w3 = w; end w2 = floor((w3 - 18 - 4) / len_w) yc = getVariable("speakSelect_yCnt") s = getVariable("speakSelect_selectTop") sArr = createArray(); sArr = getVariable("speakSelect_sArr") tIDArr = createArray(); tIDArr = getVariable("textID_speakSelectText") n = 0; while n < len_w m = 0; while m < len_h word = sArr[s + n * yc + m] if tIDArr[n * len_h + m] == 0 tIDArr[n * len_h + m] = SWor(word, x + 18 + n * w2, y + 4 + m * h2, w2, h2 + 2) else setText(tIDArr[n * len_h + m], word) end m = m + 1; end n = n + 1; end end def oriSpeak_setTextProcess() setTextSpeakText() setTextSpeakSelect() end def oriSpeakInit(w) setVariable("oriSpeak_drawFlg", false) setVariable("oriSpeak_setTextFlg", false) setVariable("isDraw_speakSelect", false) setVariable("isSetText_speakText", false) setVariable("isSetText_speakSelect", false) setVariable("speakText_wordArr", createArray()) setVariable("spriteNo_speakText", createArray()) setVariable("speakSelectText_flg", false) setVariable("existSpeakSelectText", false) setVariable("speakSelect_isWaitInput", false) arr = splitString(w, ""); len = getArrayLength(arr) # メッセージ表示設定(0→一度に全部, 1→1文字ずつ) setVariable("speakText_viewMode", getTextViewMode()) setVariable("existSpeakText", true) setVariable("speakText_isWaitInput", false) setVariable("time_speakText", 0) x = getVariable("speakText_x"); y = getVariable("speakText_y") w1 = getVariable("speakText_w") h1 = getTextFontSize(); h2 = floor(h1 * 1.18) h3 = 6 + (getVariable("speakText_l") - 1) * h2 + h1 + 6 + 3 sID = getVariable("oriSpeakWinSprNo") sSize = getVariable("oriSpeakWinSize") setVariable("speakText_len", 0) setVariable("spriteNo_speakText", createArray()) setVariable("spriteNo_speakText", WPri("", sID, sSize, x, y, w1, h3)) n = 0; while n < 9 setSpriteZOrder(getVariable("spriteNo_speakText")[n], getVariable("oriSpeakWinSprZOrder")) n = n + 1; end setVariable("textID_speakText", getVariable("spriteNo_speakText")[9]) setVariable("oriSpeak_drawFlg", true) setVariable("speakText_word", "") setVariable("speakText_wordArr", arr) setVariable("speakText_wordArrLen", len) end def oriSpeakSelectInit(sArr, w, y_count) oriSpeakInit(w) if !y_count if y_count == 1 then yc = 1 else yc = 0; end else yc = y_count; end setVariable("speakSelect_yCnt", yc) setVariable("speakSelectText_flg", true) setVariable("existSpeakSelectText", false) setVariable("speakSelect_isPush", createArray()) n = 0; while n < 4 getVariable("speakSelect_isPush")[n] = false n = n + 1; end setVariable("speakSelect_sArr", createArray()) setVariable("speakSelect_sArr", sArr) sLen = getArrayLength(sArr) if yc != 0 if floor(sLen / yc) != sLen / yc l = (floor(sLen / yc) + 1) * yc n = sLen; while n < l getVariable("speakSelect_sArr")[n] = "" n = n + 1; end sLen = l end end setVariable("speakSelect_sArrLen", sLen) maxLen_h = getVariable("speakSelect_maxLen_h") maxLen_w = getVariable("speakSelect_maxLen_w") isBar_h = true; isBar_w = true if yc != 0 if yc <= maxLen_h len_h = yc; isBar_h = false else len_h = maxLen_h end len_w = sLen / yc if floor(len_w) != len_w then len_w = len_w + 1; end len_w = floor(len_w) if len_w <= maxLen_w isBar_w = false else len_w = maxLen_w end else if sLen <= maxLen_h len_h = sLen; isBar_h = false else len_h = maxLen_h end len_w = 1; isBar_w = false end setVariable("speakSelect_len_h", len_h) setVariable("speakSelect_len_w", len_w) setVariable("speakSelect_isBar_h", isBar_h) setVariable("speakSelect_isBar_w", isBar_w) setVariable("speakSelect_selectNo", 0) setVariable("speakSelect_selectTop", 0) setVariable("spriteNo_speakSelectText", createArray()) getVariable("spriteNo_speakSelectText")[0] = 0 setVariable("textID_speakSelectText", createArray()) len = getVariable("speakSelect_len_w") * getVariable("speakSelect_len_h") n = 0; while n < len getVariable("textID_speakSelectText")[n] = 0; n = n + 1 end setVariable("spriteNo_speakSelected", 0) vn = "spriteNo_speakSelectBar" setVariable(vn, createArray()) n = 0; while n < 2 getVariable(vn)[n] = createArray() m = 0; while m < 6 getVariable(vn)[n][m] = 0 m = m + 1; end n = n + 1; end end def timeProcess_speakText() if !getVariable("existSpeakText") then return 0; end if getVariable("speakText_isWaitInput") then return 0; end if getVariable("existSpeakSelectText") then return 0; end itv = 1000 / getVariable("speakTextMaxSpeed") time = getVariable("getTime"); dif = time - getVariable("time_speakText") if dif < itv then return 0; end if dif > itv * 1.2 then time = time - floor(itv * 0.2) else time = time - floor(dif - itv); end wArr = createArray(); wArr = getVariable("speakText_wordArr") len = getVariable("speakText_len") w2 = "speakText_wordArrLen" if getVariable("speakText_viewMode") == 1 ff = true w3 = "" n = 0; while n < 8 w3 = w3 + wArr[len + n]; n = n + 1 end if w3 == "_F_WAIT_" setVariable("speakText_isWaitInput", true); ff = false m = len + 8 while m < getVariable(w2) wArr[m - n] = wArr[m]; m = m + 1 end setVariable(w2, getVariable(w2) - n) end addWord = wArr[len]; addLen = 1 else addWord = ""; addLen = 0 flg = true; ff = true while flg w3 = "" n = 0; while n < 8 w3 = w3 + wArr[len + addLen + n]; n = n + 1 end if w3 == "_F_WAIT_" setVariable("speakText_isWaitInput", true); ff = false m = len + addLen + 8 while m < getVariable(w2) wArr[m - n] = wArr[m]; m = m + 1 end setVariable(w2, getVariable(w2) - n) flg = false else addWord = addWord + wArr[len + addLen]; addLen = addLen + 1 end if len + addLen == getVariable(w2) then flg = false; end end if addLen == 0 then ff = false; end end if ff setVariable("time_speakText", time) setVariable("speakText_word", getVariable("speakText_word") + addWord) setVariable("speakText_len", len + addLen) setVariable("isSetText_speakText", true) setVariable("oriSpeak_setTextFlg", true) if getVariable("speakText_len") == getVariable(w2) setVariable("speakText_isWaitInput", true) end end end def timeProcess_speakSelect() if !getVariable("existSpeakSelectText") then return 0; end time = getVariable("getTime") itv = 1000 / 8; dif = time - getVariable("speakSelect_markCntTime") if dif > itv if dif > itv * 1.2 then time1 = time - floor(itv * 0.2) else time1 = time - floor(dif - itv); end setVariable("speakSelect_markCntTime", time1) setVariable("speakSelect_markCnt", (getVariable("speakSelect_markCnt") + 1) % 8) setVariable("isDraw_speakSelect", true); setVariable("oriSpeak_drawFlg", true) end len_h = getVariable("speakSelect_len_h") len_w = getVariable("speakSelect_len_w") yc = getVariable("speakSelect_yCnt") pArr = createArray(); pArr = getVariable("speakSelect_isPush") flg = false if pArr[2] then x0 = 0; y0 = 1; flg = true elsif pArr[0] then x0 = 0; y0 = -1; flg = true elsif pArr[1] then x0 = 1; y0 = 0; flg = true elsif pArr[3] then x0 = -1; y0 = 0; flg = true end if flg && getVariable("speakSelect_isWaitInput") itv = 1000 / getVariable("speakSelect_maxSpeed") dif = time - getVariable("speakSelect_selectTime") if dif > itv if dif > itv * 1.2 then time1 = time - floor(itv * 0.2) else time1 = time - floor(dif - itv); end saLen = getVariable("speakSelect_sArrLen") if yc != 0 syLen = yc; sxLen = floor(saLen / syLen) else syLen = saLen; sxLen = 1 end sn = getVariable("speakSelect_selectNo") sn_a = sn % syLen; sn_b = floor(sn / syLen) if y0 == 0 if (((x0 == -1) && (sn_b != 0)) || ((x0 == 1) && (sn_b != sxLen - 1))) setVariable("speakSelect_selectNo", sn + x0 * syLen) setVariable("speakSelect_selectTime", time1) setVariable("speakSelect_markCnt", 0) end else if (((y0 == -1) && (sn_a != 0)) || ((y0 == 1) && (sn_a != syLen - 1))) setVariable("speakSelect_selectNo", sn + y0) setVariable("speakSelect_selectTime", time1) setVariable("speakSelect_markCnt", 0) end end st = getVariable("speakSelect_selectTop"); st0 = st if (x0 == -1) && (sn_b != 0) && (floor(st / syLen) == sn_b) st0 = st - syLen elsif (x0 == 1) && (sn_b != sxLen - 1) && (floor(st / syLen) + len_w - 1 == sn_b) st0 = st + syLen elsif (y0 == -1) && (sn_a != 0) && ((st % syLen) == sn_a) st0 = st - 1 elsif (y0 == 1) && (sn_a != syLen - 1) && ((st % syLen) + len_h - 1 == sn_a) st0 = st + 1 end setVariable("speakSelect_selectTop", st0) setVariable("isSetText_speakSelect", true); setVariable("oriSpeak_setTextFlg", true) setVariable("isDraw_speakSelect", true); setVariable("oriSpeak_drawFlg", true) end end end def oriSpeak_timeProcess() setVariable("getTime", getTime()) timeProcess_speakText() timeProcess_speakSelect() end def oriSpeak_inputFlgInit() setVariable("isMouseDown", false) setVariable("isMouseMove", false) setVariable("isKeyDown", false) setVariable("keyDownName", "NULL") end def oriSpeak_setInput() oriSpeak_inputFlgInit() takeInput() if isMouseDown() setVariable("isMouseDown", true); setVariable("mousePoint", getMousePosition()) setVariable("isMousePressed", true) elsif isMouseMove() setVariable("isMouseMove", true); setVariable("mousePoint", getMousePosition()) elsif isMouseUp() setVariable("isMousePressed", false) else w = createArray() w = splitString("UP,DOWN,LEFT,RIGHT,ENTER", ",") wLen = getArrayLength(w) n = 0 while n < wLen if isKeyDown(w[n]) setVariable("isKeyDown", true); setVariable("keyDownName", w[n]) setVariable("isKeyPressed", true); setVariable("keyPressedName", w[n]) return 0 end if isKeyUp(w[n]) if getVariable("keyPressedName") == w[n] setVariable("isKeyPressed", false); setVariable("keyPressedName", "NULL") end return 0 end n = n + 1 end end end def inputProcess_speak() flg = false if getVariable("isKeyDown") && (getVariable("keyDownName") == "ENTER") flg = true elsif getVariable("isMouseDown") flg = true end if flg if getVariable("existSpeakText") && getVariable("speakText_isWaitInput") setVariable("speakText_isWaitInput", false) setVariable("time_speakText", getVariable("getTime")) if getVariable("speakText_len") == getVariable("speakText_wordArrLen") if getVariable("speakSelectText_flg") setVariable("existSpeakSelectText", true) setVariable("isSetText_speakSelect", true); setVariable("oriSpeak_setTextFlg", true) setVariable("isDraw_speakSelect", true); setVariable("oriSpeak_drawFlg", true) setVariable("speakSelect_isWaitInput", true) setVariable("speakSelect_selectTime", getTime() - 1000) setVariable("speakSelect_markCnt", 0) setVariable("speakSelect_markCntTime", getTime()) oriSpeak_inputFlgInit() else deleteSpeakText(); setVariable("oriSpeak_drawFlg", true) setVariable("oriSpeakLoop", false) end end end end end def inputProcess_speakSelect() if getVariable("existSpeakSelectText") && getVariable("speakSelect_isWaitInput") else return 0; end len_h = getVariable("speakSelect_len_h") len_w = getVariable("speakSelect_len_w") x = getVariable("speakSelect_x"); y = getVariable("speakSelect_y") w = getVariable("speakSelect_w") h1 = getTextFontSize(); h2 = floor(h1 * 1.18) h3 = 6 + (len_h - 1) * h2 + h1 + 6 + 3 if getVariable("speakSelect_isBar_w") then h4 = h3 + 8; else h4 = h3; end if getVariable("speakSelect_isBar_h") then w3 = w - 8; else w3 = w; end w2 = floor((w3 - 18 - 4) / len_w) isBar_w = getVariable("speakSelect_isBar_w") isBar_h = getVariable("speakSelect_isBar_h") yc = getVariable("speakSelect_yCnt") st = getVariable("speakSelect_selectTop") saLen = getVariable("speakSelect_sArrLen") if yc != 0 syLen = yc; sxLen = floor(saLen / syLen) else syLen = saLen; sxLen = 1 end flg1 = false; flg2 = false if getVariable("isKeyDown") && (getVariable("keyDownName") == "ENTER") flg1 = true elsif getVariable("isMouseDown") || getVariable("isMouseMove") mpx = getVariable("mousePoint")[0]; mpy = getVariable("mousePoint")[1] if (mpx >= x + 18) && (mpx < x + 18 + len_w * w2) if (mpy >= y + 4) && (mpy < y + 4 + len_h * h2) snx = floor(st / syLen) + floor((mpx - x - 18) / w2) sny = (st % syLen) + floor((mpy - y - 4) / h2) setVariable("speakSelect_selectNo", snx * syLen + sny) setVariable("speakSelect_selectTime", getTime()) setVariable("speakSelect_markCnt", 0) if getVariable("isMouseDown") flg1 = true elsif getVariable("isMouseMove") flg2 = true end end end end if flg1 dw = getVariable("speakSelect_sArr")[getVariable("speakSelect_selectNo")] if dw == "" else setVariable("speakSelect_isWaitInput", false) deleteSpeakSelectText(); setVariable("oriSpeak_drawFlg", true) setVariable("oriSpeakLoop", false) return 0 end elsif flg2 setVariable("isSetText_speakSelect", true); setVariable("oriSpeak_setTextFlg", true) setVariable("isDraw_speakSelect", true); setVariable("oriSpeak_drawFlg", true) return 0 end pArr = createArray(); pArr = getVariable("speakSelect_isPush") n = 0; while n < 4 pArr[n] = false; n = n + 1 end if getVariable("isKeyPressed") case getVariable("keyPressedName") when "DOWN" pArr[2] = true when "UP" pArr[0] = true when "RIGHT" pArr[1] = true when "LEFT" pArr[3] = true end elsif getVariable("isMousePressed") mpx = getVariable("mousePoint")[0]; mpy = getVariable("mousePoint")[1] if isBar_h if (mpx >= x + w - 11) && (mpx < x + w - 3) if (mpy >= y + 4) && (mpy < y + 12) pArr[0] = true elsif (mpy >= y + h3 - 11) && (mpy < y + h3 - 3) pArr[2] = true end end end if isBar_w if (mpy >= y + h4 - 11) && (mpy < y + h4 - 3) if (mpx >= x + 4) && (mpx < x + 12) pArr[3] = true elsif (mpx >= x + w3 - 11) && (mpx < x + w3 - 3) pArr[1] = true end end end end end def oriSpeak_inputProcess() inputProcess_speak() inputProcess_speakSelect() end def oriSpeakLoop() setBaseTime() inputFlg = false setVariable("isMousePressed", false) setVariable("isKeyPressed", false); setVariable("keyPressedName", "NULL") startInput() setVariable("oriSpeakLoop", true) while getVariable("oriSpeakLoop") if hasInput() oriSpeak_setInput() oriSpeak_inputProcess() inputFlg = false if hasInput() oriSpeak_setInput() while hasInput() oriSpeak_setInput() end inputFlg = true end elsif inputFlg inputFlg = false oriSpeak_inputProcess() end oriSpeak_timeProcess() if getVariable("oriSpeak_drawFlg") setVariable("oriSpeak_drawFlg", false) oriSpeak_drawProcess() waitTime(30) end if getVariable("oriSpeak_setTextFlg") setVariable("oriSpeak_setTextFlg", false) oriSpeak_setTextProcess() end end endInput() end def oriSpeakText(w) oriSpeakInit(w) oriSpeakLoop() end def oriSpeakSelect(arr, w, y_count) oriSpeakSelectInit(arr, w, y_count) oriSpeakLoop() arr = createArray() arr[0] = getVariable("speakSelect_selectNo") arr[1] = getVariable("speakSelect_sArr")[arr[0]] return arr end def oriSpeakSelect_PassNumber(digits) numArr = createArray() n = 0; while n < digits numArr[n] = ""; n = n + 1 end sArr1 = createArray(); sArr1 = splitString("0,1,2,3,4,5,6,7,8,9", ",") sArr2 = createArray(); sArr2 = splitString("0,1,2,3,4,5,6,7,8,9,←", ",") retArr = createArray() vmFlg = false; vm = getTextViewMode() d = 0 while d < digits word = digits + " 桁の番号を入力してください。\n" + joinArray(numArr, ",") if d == 0 then retArr = oriSpeakSelect(sArr1, word) else retArr = oriSpeakSelect(sArr2, word) end if retArr[1] == "←" then numArr[d - 1] = ""; d = d - 1 else numArr[d] = retArr[0]; d = d + 1 end if !vmFlg then setTextViewMode(0); vmFlg = false; end end setTextViewMode(vm) number = 0 n = 0; while n < digits number = number * 10 + numArr[n]; n = n + 1 end return number end def oriSpeakSelect_PassWord(maxCharCnt) wordArr = createArray() n = 0; while n < maxCharCnt wordArr[n] = ""; n = n + 1 end sWord = createArray() sWord[0] = << EOS 平,,あ,い,う,え,お,,は,ひ,ふ,へ,ほ,,が,ぎ,ぐ,げ,ご,,ぁ,ぃ,ぅ,ぇ,ぉ 片,,か,き,く,け,こ,,ま,み,む,め,も,,ざ,じ,ず,ぜ,ぞ,,ゃ,,ゅ,,ょ 数,,さ,し,す,せ,そ,,や,,ゆ,,よ,,だ,ぢ,づ,で,ど,,っ,,,, 英,,た,ち,つ,て,と,,ら,り,る,れ,ろ,,ば,び,ぶ,べ,ぼ,,ー,、,。,, 記,,な,に,ぬ,ね,の,,わ,,を,,ん,,ぱ,ぴ,ぷ,ぺ,ぽ,,,,,, 戻,終,,,,,,,,,,,,,,,,,,,,,,, EOS sWord[1] = << EOS 平,,ア,イ,ウ,エ,オ,,ハ,ヒ,フ,ヘ,ホ,,ガ,ギ,グ,ゲ,ゴ,,ァ,ィ,ゥ,ェ,ォ 片,,カ,キ,ク,ケ,コ,,マ,ミ,ム,メ,モ,,ザ,ジ,ズ,ゼ,ゾ,,ャ,,ュ,,ョ 数,,サ,シ,ス,セ,ソ,,ヤ,,ユ,,ヨ,,ダ,ヂ,ヅ,デ,ド,,ッ,,,, 英,,タ,チ,ツ,テ,ト,,ラ,リ,ル,レ,ロ,,バ,ビ,ブ,ベ,ボ,,ー,,,, 記,,ナ,ニ,ヌ,ネ,ノ,,ワ,,ヲ,,ン,,パ,ピ,プ,ペ,ポ,,,,,, 戻,終,,,,,,,,,,,,,,,,,,,,,,, EOS sWord[2] = << EOS 平,,0,5 片,,1,6 数,,2,7 英,,3,8 記,,4,9 戻,終,, EOS sWord[3] = << EOS 平,,a,b,c,d,e,f,,A,B,C,D,E,F 片,,g,h,i,j,k,l,,G,H,I,J,K,L 数,,m,n,o,p,q,r,,M,N,O,P,Q,R 英,,s,t,u,v,w,x,,S,T,U,V,W,X 記,,y,z,,,,,,Y,Z,,,, 戻,終,,,,,,,,,,,,, EOS sWord[4] = << EOS 平,,(,=,$,<,,~ 片,,),+,%,>,., 数,,!,-,&,{,[,空 英,,?,*,|,},], 記,,_,/,^,@,, 戻,終,,,,,, EOS sArr = createArray() sArr2 = createArray() n = 0; while n < 5 sArr[n] = createArray(); sArr[n] = splitString(sWord[n], "") len = getArrayLength(sArr[n]) # 改行を除く m = 0; while m < len if sArr[n][m] == "\n" if m != len - 1 then sArr[n][m] = ","; else sArr[n][m] = ""; end end m = m + 1; end sWord[n] = joinArray(sArr[n], "") sArr[n] = splitString(sWord[n], ","); len = getArrayLength(sArr[n]) # 縦横の並びを逆にする sArr2[n] = createArray() m = 0; while m < len sArr2[n][m] = sArr[n][(len / 6) * (m % 6) + floor(m / 6)] m = m + 1; end n = n + 1; end sArr2[4][36] = "," sArr2[4][40] = "\\" sArr2[4][43] = "\"" retArr = createArray() vmFlg = false; vm = getTextViewMode() loopFlg = true st = 0 d = 0 while loopFlg word = "入力してください。" + d + " 文字入力中。(最大 " + maxCharCnt + " 文字まで)\n" + joinArray(wordArr, "") retArr = oriSpeakSelect(sArr2[st], word, 6) case retArr[1] when "戻" if d > 0 then wordArr[d - 1] = ""; d = d - 1; end when "終" loopFlg = false when "平" st = 0 when "片" st = 1 when "数" st = 2 when "英" st = 3 when "記" st = 4 when "空" wordArr[d] = " "; d = d + 1 else wordArr[d] = retArr[1]; d = d + 1 end if !vmFlg then setTextViewMode(0); vmFlg = false; end if d == maxCharCnt word = joinArray(wordArr, "") + " でいいですか?" retArr = oriSpeakSelect(splitString("はい,いいえ", ","), word) if retArr[0] == 0 then loopFlg = false else wordArr[d - 1] = ""; d = d - 1 end end end setTextViewMode(vm) retWord = joinArray(wordArr, "") return retWord end # ------↑↑ オリジナル選択肢関数 ↑↑------ # #スピーク文関数 #nameは喋っている人の名前 #a~dはそれぞれ1~4行目のテキスト、""でくくられた文字列 #この関数では名前とメッセージ内容含めて5行までしか書けない #オリジナル選択肢関数内の数値も5行のメッセージを想定して設定した def hanasu(name, a,b,c,d) s=name+"\n「"+a+"」" if b b= "\n "+b s=name+"\n「"+a+b+"」" end if c c= "\n "+c s=name+"\n「"+a+b+c+"」" end if d d= "\n "+d s=name+"\n「"+a+b+c+d+"」" end #↓これを書かないと枠が表示されない setCanvasVisible(true) oriSpeakText(s) end #選択肢関数 #aには選択肢の配列、bには""でくくられた文字列 def choice(a,b) #c =speakWithSelectArray(a, b) #↓これを書かないと枠が表示されない setCanvasVisible(true) no=getArrayLength(a) c=oriSpeakSelect(a, b, no) #c[0]には選択肢の配列のインデックス #c[1]には選んだ選択肢に入っている文字列が入っている #配列で返すとややこしいのでc[0]だけ返すように書いてある d=c[0] return d end
実際のエディタには例えば次のように書く
hanasu("メイド","私はウィンドウベースの変更を","担当しております") #スピーク文に当たる関数 a=array2("はい","いいえ") #選択肢の準備 case choice(a,"メイド\n「ウィンドウベースを変更なさいますか?」") #選択肢をcaseで使う場合 when 0#はいを選択 window_choice=array2(1,2,3,"やめる") w=choice(window_choice,"メイド\n「ウィンドウ番号を選んでください」") #選択肢をifで使う場合 if w==3 #やめるを選択 hanasu("メイド","ウィンドウベースの変更を","中止しました") else #やめる以外を選択 case w when 0 #1を選択 setVariable("oriSpeakWinSprNo", 203458) # ウィンドウの画像のID setVariable("oriSpeakWinSize", 18) # ウィンドウの画像のサイズ 3の倍数にしたほうがいい when 1 #2を選択 setVariable("oriSpeakWinSprNo", 310480) # ウィンドウの画像のID setVariable("oriSpeakWinSize", 90) # ウィンドウの画像のサイズ # 3の倍数にしたほうがいい when 2 #3を選択 setVariable("oriSpeakWinSprNo", 310487) # ウィンドウの画像のID setVariable("oriSpeakWinSize", 60) # ウィンドウの画像のサイズ # 3の倍数にしたほうがいい else end #case hanasu("メイド","ウィンドウベースを","変更しました") end #if when 1 #いいえを選択 end # case
注意点1
選択肢の配列の一番最初(配列[0])の中身に半角数字の0を設定すると
その選択肢を選ぶことができない(条件はちゃんと突き止めていない)
(カーソルオンでマークが移動するがクリックしても決定扱いにならない)
この場合、英字のオーか全角数字の0で代用するなどの工夫が必要
配列の中に何も入っていない時に選択肢を選べないようにする仕様が関係している?
注意点2.1
キャンパスがビジブルになっていないと文字だけ表示されて枠が表示されない
RPGエディタでは頻繁にキャンパスがリセットされるため、
確実に簡単に枠を表示したい場合、スピーク文を表示するだけの関数を自分で作って
その中にキャンパスをビジブルにする処理を入れたほうがいい
注意点2.2
選択肢も同様の理由で自分で選択肢関数を作ったほうがいい
選択肢に使う配列を用意する際には
cfm_さんの引数から配列を得る関数が便利なので使ったほうがいい
注意点2.3
メッセージを複数立ち上げる時は簡単ウィンドウ関数を使うが、頻繁に使用する場合、
これも同様に、自分で関数を作って中にキャンパスビジブル処理を書いたほうが手間が少ない
注意点3
画面テキストはデフォルトのフェードアウトよりも下のレイヤーにあるので、
デフォルト機能で画面を黒くフェードアウトさせてその上にこの関数で作ったメッセージを表示させることができない
一色フェードアウトをしてその上からメッセージウィンドウ・テキストを表示させるには
cfm_さんのフルカラー画像を使う必要がある
アイデア
オリジナル選択肢関数は見ての通り長い関数です
開始スクリプトに書く場合、他の処理を書いたり編集するのに煩わしくなる場合があるほか
変数や関数をたくさん設定しているゲームの場合はそもそも関数が入りきらない可能性もあります
そこで、大方のゲームに必要な機能を作り終わるまでは
hanasu()関数やchoice()関数の中に普通のspeak(s)やspeakWithSelectArray(a, b)を書いておき
後から関数をコピペ、あるいはコピペできるか検討し可能なら、
oriSpeakText(s)やoriSpeakSelect(a,b,no)に書き換えるという方法がいいかもしれません
コメントする
コメントするには、ログインする必要があります。
プレイヤーが好きなウィンドウを選べたら
楽しんでもらえるのではないかと思って
使ってみたかったんです(^ω^)