知られざるRmakeの記述法(雑談掲示板

投稿: User icon mini 退会したユーザー 投稿:2011/12/25 15:39:25(最新:2016/08/07 20:56:07)
スクリプト言語のマニュアルでは語られない
様々なスクリプトの裏技を紹介していくスレッドです。




case文にelseが使える
a = rand(6) + 1
case a
  when 1
    speak("おめでとう。\n1等が当たった。")
  when 2
    speak("おめでとう。\n2等が当たった。")
  when 3
    speak("おめでとう。\n3等が当たった。")
  else #この場合、ここに来るのは4,5,6
    speak("残念。ハズレだ。")
end

コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2016/08/07 20:56, 履歴)
speak(getDownDirection()) #0
speak(getLeftDirection()) #1
speak(getRightDirection()) #2
speak(getUpDirection()) #3

RPGエディタで使うsetEventDirection関数の第二引数で
getDownDirection()、getLeftDirection()、getRightDirection()、getUpDirection()のかわりに
0、1、2、3と書くことができる
#例
setEventDirection("event01",3)
#setEventDirection("event01",getUpDirection())と同じ

RPGの演出ではイベントの向きを頻繁に変えるので
製作の時短に使えるほか、条件付けなどを簡単に書ける場合があると思います
「知られざる」というわけではなく関数リファレンスには
こうなりますよ、とはっきり書いてあるのですが
http://rmake.jp/document/function_reference#setEventDirection関数
スクリプト初心者の頃はわからなかったし
入力支援もないので手打ちをがんばってました
数字で書くデメリットとしては書いた本人が向きがよくわからなくなる
ということがあるのかもしれません(他のデメリットもあるかもしれません)

関数の引数として使われる関数にはこのように数字で代用できるものがあり
その一例として、キャラクタやアイテムのパラメータ配列から
値を抜き出す時に使われる関数群について対応する数字を調べて表にしました
http://blog.rmake.jp/mosmoss/7607
キャラクタやアイテムのパラメータ配列の返り値についても書いてあります
Material 185033 3 mini 光楼(114)(投稿日:2015/07/11 15:09, 履歴)
知ってる方もいるかもしれませんが
A = "三"
if A >= 0 || A < 0
  speak("数字")
elsif A >= "㐀" && A<= "龻"
  speak("漢字")
elsif A >= "A" && A <= "Z"
  speak("アルファベット大文字")
elsif A >= "a" && A <= "z"
  speak("アルファベット小文字")
elsif A >= "ぁ" && A <= "ゖ"
  speak("平仮名")
elsif A >= "ァ" && A <= "ヺ"
  speak("カタカナ")
elsif A >= "Α" && A <= "Ω"
  speak("ギリシャ文字大文字")
elsif A >= "α" && A <= "ω"
  speak("ギリシャ文字小文字")
else
  speak("それ以外")
end

こうやって文字の判定も出来る。
       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2015/07/11 19:45, 履歴)
初めて知った・・・。
       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2012/11/22 08:07, 履歴)
warpEvent関数は小数点も入れられる
例)
warpEvent("event21", 5.5, 5.5)

・・・これってただ僕が気づいていなかっただけ?
              mini 学習ソフトウェア(投稿日:2012/11/22 17:00, 履歴)
僕も知らない
Material 154390 2 mini  創 (投稿日:2012/12/16 19:56, 履歴)
まじで!知らんかった!
       256 mini 池ちゃん(翡翠ヶ池)(投稿日:2013/03/20 11:31, 履歴)
確認したところ
setEventTarget関数でも可能ということと
デメリットがあることも分かった

当たり判定が大きくなる。

例えば[x1.5 y11.5]のところにイベントがあったとする。
そうした場合当たり判定は下のようになる。
User icon mini 退会したユーザー(投稿日:2014/02/12 18:09, 履歴)
これ上手く使えば、setEventTargetとか使わずとも
キャラの移動出来るのでは?
Cdv30200 aoi icon mini aoihikawa(投稿日:2014/01/26 22:39, 履歴)
セーブで保存される変数内に
半角「%」「&」「+」は
使用することができない

(使用したい場合は全角で)

参考
セーブに失敗して抜け出せなくなる
セーブされた変数の中身が変化する
User icon mini 退会したユーザー(投稿日:2013/12/08 23:56, 履歴)
rand関数も小数が入る。
#例

rand(6.4)
#この場合、6が0~5の4割の確率で返される
  1 mini 闇さん(投稿日:2013/01/14 15:52, 履歴)
常識?かも知れないですが
cese speakWithSelect(2,"A","B", 
    "AかBか?")
when 0

when 1

end


a= speakWithSelect(2,"A","B", 
    "AかBか?")
speak(a)

とやると
Aを選ぶと0 Bを選ぶと1 になります
128 mini fragile(投稿日:2013/04/04 18:42, 履歴)
この場合、場合分けが簡単にできるという利点が大きいかも。
選択肢処理
Aフラグが立っていればA, 他はB
B常時B
という分岐を例で考えると、従来の書き方だと
case speakWithSelect(2,"A","B", 
    "AかBか?")
when 0
   if getFlag("フラグ")
   #処理A
   else
   #処理B
   end
when 1
   #処理B
end

のように処理Bを重複して書く必要があり、片方書き直した後、もう一方を直し忘れるといったミスも考えられます。

この書き方なら
choice = speakWithSelect(2,"A","B", 
    "AかBか?")
if (choice == 0) && !getFlag("フラグ")
choice = 1
end

case choice
when 0
   #処理A
when 1
   #処理B
end

といったように分岐条件と内容が離れているので、フラグを扱う時には便利、かもです。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/05/06 16:01, 履歴)
下記の変数名を通常変数(setVariable等)の
変数名として使用すると
スクリプトエンジンの内部で使用されているため
正常に動作しない場合があります。

block
add
sub
mul
div
quate
substitution
call
eq
neq 
lt
le
gt
ge
cond
and
or
not
minus
mod 


<参考>
基本変数の配列
      mini きゅうり(投稿日:2013/01/13 14:13, 履歴)
追加です。
print


<参考>
「print」は予約語?
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/12/16 18:52, 履歴)
拡張画像(スプライト)の
同時使用可能最大枚数は512
User icon mini 退会したユーザー(投稿日:2012/10/14 12:56, 履歴)
文字列を1文字ずつ分解する
a = "あいうえお"
a = splitString(a, "")
a[0]#あ
a[1]#い
a[2]#う
a[3]#え
a[4]#お

参考
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/07/01 15:43, 履歴)
数値「0」を条件式に含めた場合の動作

&& || while → false
if ! → true

参考
User icon mini 退会したユーザー(投稿日:2012/04/27 23:21, 履歴)
カスタムメニューは左側に偏ってますが、
実は右側にも表示できるようです。
#例

  setCustomParamName(18, "A")
  setCustomParamValue(18, "今はテスト")

#右上に表示されます


  1 mini 闇さん(投稿日:2012/04/04 19:24, 履歴)
caseは文字も判定可能
a=createArray()
a[0]=createArray()
a[1]=createArray()
a[2]=createArray()
a[3]=createArray()
a[0]="?"
a[1]="?"
a[2]="?"
a[3]="?"
while i<4
case speakWithSelect(4,"○","△","×","◇", 
    a[0]+a[1]+a[2]+a[3])
  when 0
    a[i]="あ"
  when 1
    a[i]="か"
  when 2
    a[i]="さ"
  when 3
    a[i]="た"
end
i=i+1
end
case a
when "あ,か,さ,か"
#パスワード1の操作
when "あ,た,た,か"
#パスワード2の操作
end
Nyan mini rurun9(投稿日:2012/04/05 14:14, 履歴)
コレ凄いわ
文字列でもピッタリならcase whenを通る事はしってたけど、配列をまとめて渡す事ができるとは!
コレはパスワード変換とかで大活躍の予感
a=createArray() #直してみた

n=true
while n
 a[0]="?"
 a[1]="?"
 a[2]="?"
 a[3]="?"
 m=0
 while m<4
  case speakWithSelect(4,"あ","か","さ","た",  a[0]+a[1]+a[2]+a[3])
  when 0 a[m]="あ"
  when 1 a[m]="か"
  when 2 a[m]="さ"
  when 3 a[m]="た"
  end
 m=m+1
 end

 case a
 when "あ,か,さ,か"
  speak("あかさか\n合ってる") #パスワード1の操作
 when "あ,あ,あ,あ"
  speak("ああああ\n終"); n=false #パスワード2の操作
 else
  speak("ちがうよ")
 end #case終
end #nループ終

goBadEnding()
  1 mini 闇さん(投稿日:2012/04/05 14:53, 履歴)
ゲームで使っていたやつをコピーしたから
case speakWithSelect(4"○","△","×","◇",
直すの忘れてた

User icon mini 退会したユーザー(投稿日:2012/03/22 00:54, 履歴)
waitTime(0)でも、
とりあえず1回のフレームが終わって次のフレームまで(33ms程度)
は少なくともスクリプトが実行されないようです。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/03/01 21:26, 履歴)
タクミ2310号さま>

通常ではありえない動作を
「例外」と呼びます。

このような例外が絶対に発生しないよう
きちんと対策しておくことを
「例外処理」と呼び、
重要なポイントでもあります。
User icon mini 退会したユーザー(投稿日:2012/03/01 20:02, 履歴)
>簸川さん
21億・・・普通は超えませんよね(w
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/28 22:41, 履歴)
変数の最大値は「2147483647」
大体の目安として
「21億」を超えないようにしておきましょう
002 1  mini ugonight(投稿日:2012/01/28 00:20, 履歴)
素材の引数にnullを指定するとエラーにならず、なにも設定させないことができますっ!
(例)
showImage(null)


使えなさそうで使えたりするのでぜひ活用してみてください
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/01/23 16:41, 履歴)
  • if文の短縮2
if (条件) then <処理>; elsif (条件) then <処理>; else <処理>; end


  • case文の短縮(基本形のまま1行で纏められます)
case [変数] when (条件) <処理>; when (条件) <処理>; else <処理>; end


あまり複雑な文は短縮しないことを
オススメしますけれど。
Nyan mini rurun9(投稿日:2012/01/23 12:11, 履歴)
ありがとうございまーす
なるほど、その場合でもend前には ; が必要なのか。
if~then, while~doてのは定型文なんですね
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/01/23 03:35, 履歴)
  • if文の短縮
if (条件) then <処理>; end


  • while文の短縮
while (条件) do <処理>; <カウント処理>; end


とすることで
1行に纏めながら
正常に動かすことができます。
User icon mini 退会したユーザー(投稿日:2011/12/27 15:34, 履歴)
if文を1行で書くことができた気がするんです。
しかし、
if 条件 then #条件がtrueの時の処理

これだと文法エラーがでました。
実際はどうなんでしょうか?もう少し自分でも調査してみます。
Nyan mini rurun9(投稿日:2011/12/27 14:41, 履歴)
>do
スクリプト/所持アイテムをアイテムIDで削除する関数

コレ見た時から気になってたのはオイラだけなのか…


◆getValueFromItemParam関数の
・返り値はインデックスに対応したアイテムパラメーターの値
が「道具なら0、武器なら1が返る」
という発見はナイスでした。リファレンス説明の足りなさは泣けてきますねw

◆getEquipmentIndexWithId関数の
・返り値は指定したIDのアイテムの装備位置のインデックス
0 武器
1 盾
2 鎧
3 頭
4 足
5~8 装飾品
9~15 魔法
という感じになってる模様。
User icon mini 退会したユーザー(投稿日:2011/12/26 16:56, 履歴)
>rurun9さん
doがあるかどうかで何か違いがあるんですか?
while 条件式 do
#繰り返すところ
end

#この上下で違いはあるのか#

while 条件式
#繰り返すところ
end
Material 71926 1 mini なとおとき(投稿日:2011/12/26 15:56, 履歴)
ほー
Nyan mini rurun9(投稿日:2011/12/26 00:46, 履歴)
そんな事ができるなら、何故最初から…

えーと
while 条件式 do
#繰り返すところ
end
てのがよくわからないので詳しい方、お願いしマース
User icon mini 退会したユーザー(投稿日:2011/12/25 19:14, 履歴)
こんな使い方ってありだったのかww↑