変数について(質問掲示板

投稿: 002 1  mini ugonight 投稿:2011/04/03 17:37:03(最新:2011/04/04 12:04:04)
イベントを調べるたびメッセージが変わるようにしたいのですが。

if getFlag("植物")

if syokubutu==0
speak("観葉植物が置いてある")
end
if syokubutu==1
speak("観葉植物が置いてある")
end
if syokubutu==2
speak("液体肥料が刺さっている")
end
if syokubutu==3
speak("よく見たら接着剤だった")
speak("接着剤を手に入れた!")
setVariable("接着剤", 1)
end
if syokubutu>=4
speak("観葉植物が置いてある")
end
else
setFlag("植物", true)
setVariable("syokubutu", 0)

end

とするとエラーになってしまいますどうしたらよいですか?

コメントする

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

コメント一覧

Nyan mini rurun9(投稿日:2011/04/04 12:04, 履歴)
他のイベントでも同じ変数を使いたい場合は、基本変数じゃないとシステムが覚えてないんですよねぇ

if文を elsif で全部つなげちゃった方が判り易くないスか?

気になるのは
フラグ「植物」が別のイベントで進行具合の確認に使われるからこそのフラグなのに、このイベント内でsyokubutuに0を入れて終了している点かな。
つまり初回は調べても、変数やフラグがセットされるだけでイベントが終了する、という事です。
プレイヤーが「ココは何も無い」と思い込んでしまい、シナリオ進まなくなりませんかねw
002 1  mini ugonight(投稿日:2011/04/04 08:23, 履歴)
わたしのほうもそのままコピペしてしまってきづきませんでしたgetVariableは変数を取得するやつですよね。
最後までこたえていただきありがとうございます。
   mini ___(投稿日:2011/04/04 00:14, 履歴)
…すいません、私のミスです。
"undefined identifier"も同じような意味です。
「GetVariableとか知らないよ」といったところでしょうか。

正確には"GetVariable"ではなく"getVariable"ですかね。
最初が小文字です。

関数は名前で用途がだいたい分かるので、
覚えてしまったほうが楽になりますよ。
しかし、今回のように記述ミスする可能性も高くなります。><
関数リファレンスや、関数入力補助を活用し、
ミスタイプの無いようにしましょう。私を反面教師にw

自作関数はこんな感じで大文字スタートにしてしまうので、
ついつい混合してしまいました。ごめんなさい。
002 1  mini ugonight(投稿日:2011/04/03 23:50, 履歴)
とても詳しく教えていただきありがとうございました。
コードを直したのですが 17, 12 action : line : 3 undefined identifier GetVariable
というエラーが出てイベントを調べられません。原因がわかったらよろしくお願いします。
   mini ___(投稿日:2011/04/03 22:34, 履歴)
Rmake記法を利用すると、インデントが行えて便利ですよーっと。
   Rmake記法
if getFlag("植物") 
  if syokubutu==0 
    speak("観葉植物が置いてある") 
  end 
  if syokubutu==1 
    speak("観葉植物が置いてある") 
  end 
  if syokubutu==2 
    speak("液体肥料が刺さっている") 
  end 
  if syokubutu==3 
    speak("よく見たら接着剤だった") 
    speak("接着剤を手に入れた!") 
    setVariable("接着剤", 1) 
  end 
  if syokubutu>=4 
    speak("観葉植物が置いてある") 
  end 
else 
  setFlag("植物", true) 
  setVariable("syokubutu", 0) 
end 


私が上記コードを新規データに貼りつけてみた所、
一回目は特にエラー無く動作しましたが、2回目以降…
すなわち、if getFlag("植物") 以下でエラーがでました。

エラーメッセージは"not defined variable : syokubutu"ですので、
つまり「変数syokubutuってなんぞ?」と言うことです。

変数には3種類あり、それぞれ
・ローカル変数
  cnt = 0
  syokubutu = 0
  # 気軽に使用できる。
  # シーン、チャプター、イベント後などで消滅。
・基本変数
  setVariable("変数名" , 0)
  # 取得、設定共に少々長くなる。
  # セーブ時に保存、ロード時に読み込みされる。
  # ゲーム内ならどこからでも参照可。
・グローバル変数
  addSaveGlobalVariable("Gold", 1)
  # 一人のゲーム作成者に付き8つまで値を保存可能。
  # 複数ゲームをまたいで値を持ち越せる。
  # Aでお金を稼ぐとBでも、Bで経験値を稼ぐとAでも、みたいな。

という感じになってるみたいです。

今回のエラーは、基本変数とローカル変数が
混合してしまったものではないかと考えられます。
setVariable("syokubutu", 0)
  # このように基本変数で宣言しているのですから、
if syokubutu==0 
  # この部分を
if GetVariable("syokubutu")==0
  # とすれば、エラーは無くなると思いますよ。 



後は蛇足となりますが、今回のように
「変数syokubutuの値によって処理を変更する」場合、
if~endを繰り返すのではなく、case文を使うと楽になる場合があります。
例文として、こんなコードが挙げられています。
a = 2
case a
  when 1     # a == 1なら
    speak("case -> 1")
  when 2     # a == 2なら
    speak("case -> 2")
  when 3     # a == 3なら
    speak("case -> 3")
end

どの場合でも、speakの後 endまで飛んできます。
a >= 4 とかが再現できないっぽいので、
今回のコードの場合は使用すべきかどうか悩みますが…。


エラーが出るなら、エラー番号(例:#1009)ですとか、
エラーメッセージとかが画面下部に出ていると思います。
それをお教え頂けると、よりスムーズに回答できるかと。

問題が解決できなかったら、お手数ですが
より詳しい情報と共に再度質問してください。
長々と失礼しました。