SRC質問掲示板Mk2
(現在 過去ログ119 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■21071 / inTopicNo.1)  スタートイベントの動作がおかしい。
  
□投稿者/ harimayado -(2008/07/05(Sat) 21:36:49) [ID:NtDqZ0fh]
    現在作成中のシナリオにて変な動作が起きるため質問しに来ました。
    具体的な症状としては
    ・スタートイベント内で敵キャラクターを「create」コマンドで作成した時の位置が若干(x方向に-1)ずれて表示される。

    ・スタートイベント内の会話等が終わり「exit」で締めくくったにも関わらず、何故かスタートイベントの初めに戻ってしまい「〜〜〜は既に登録されています」と出てしまう。

    の二つに困っています。

    シナリオの構成なのですが
    ラベル無し
    プロローグ
     選択肢だぜ⇒Goto 始まり
     始まり⇒選択肢から⇒Goto 男ルート or 女ルート
     男ルート⇒Goto 名前入力
      名前入力⇒Goto 職業説明
      職業説明⇒Goto スキル説明
      スキル説明⇒Goto "スタート"
     女ルート⇒Goto 名前入力(ヒロイン)
      名前入力(ヒロイン)⇒Goto 職業説明(ヒロイン)
      職業選択(ヒロイン)⇒Goto スキル説明(ヒロイン)
      スキル説明(ヒロイン)⇒Goto "スタート"
    スタート
    エピローグ

    と、なっています。
    プロローグ内に複数のイベントを作ったのが原因なのでしょうか?

    どなたか教えて下さると助かります。
引用返信/返信 削除キー/
■21073 / inTopicNo.2)  Re[1]: スタートイベントの動作がおかしい。
□投稿者/ 中箱 -(2008/07/06(Sun) 02:57:29) [ID:TdSzoAHN]
    2008/07/06(Sun) 03:04:31 編集(投稿者)

    主に
    >・スタートイベント内の会話等が終わり「exit」で締めくくったにも関わらず、何故かスタートイベントの初めに戻ってしまい「〜〜〜は既に登録されています」と出てしまう。
    についてのみですが。



    まず、問題を解決するだけであれば、
    > スキル説明⇒Goto "スタート"
    でGotoをせずに、Exitで終えればスタートイベントの2重起動は避けれると思います。



    スタートイベントの二回実行される理由ですが、

     SRCは、「プロローグ:」行を開始地点として、
     exitが実行されるまで、プロローグイベントを実行しているつもりで処理を行います。
     途中で通常ラベルにGotoされようが、スタートイベントラベルにGotoされようが、
     SRCはプロローグイベントのつもりで処理していきます。

     そして、exitが実行されたら、
     次に「スタート:」行を開始点として、exitが実行されるまでスタートイベントのつもりで処理を行います。

    (これは、スタート・プロローグ以外のイベントラベルについても同様です。
     exitが実行されるまではそのイベントは続いており、途中でイベントが変わることは無い、と考えてよいでしょう)


    ですから例えば
     プロローグ:
     (処理A)
     Goto スタート
     exit //※1
     スタート:
     (処理B)
     exit //※2
    のようなイベント構成の場合、

    SRCは
    ・プロローグ:から、「プロローグイベント」を開始
    ・処理Aを実行
    ・Gotoによってスタートラベルに飛ぶ
    ・処理Bを実行
    ・exit(※2)があったので、「プロローグイベント」を終了
    ・プロローグイベントが終了したので、スタート:から、「スタートイベント」を開始
    ・処理Bを実行(2回目)
    ・exit(※2)でスタートイベントを終了
    のように処理を行ってしまいます。
    (処理2の二重実行と同時に、※1のexitが一度も実行されないということにも注意してください)


    繰り返しになりますが、
    プロローグイベントをexitすれば、SRCが勝手にスタートイベントの実行を始めます。
    ですから、プロローグイベントから直接スタートイベントを呼んではいけません。



    ところで、
    >プロローグ内に複数のイベントを作ったのが原因なのでしょうか?
    この一文を見る限り、イベントラベルについての認識が少し違っているようです。

    下にも例を挙げますが、SRCでは、イベントラベルの「内」と「外」は非常に曖昧です。
    そのような理解は避けた方が良いでしょう。


    ということで、質問の趣旨とは外れますが、ラベルについて。


    …うまい説明が思いつかず、かなり長くなってしまいました。すいません。
    不要であったり読みにくければ流してくださって結構です。



    …さて、説明を読む限り、実際にはこんな感じ↓で記述しているのでしょうか。
    =====
    プロローグ:
    〜〜
    選択肢だぜ:
    〜〜
    Goto 始まり
    始まり:
    〜〜
    if 〜〜 then
     Goto 男ルート
    else
     Goto 女ルート
    endif

    男ルート:
    Goto 名前入力
    名前入力:
    〜〜
    Goto 職業説明
    職業説明:
    〜〜
    Goto スキル説明
    スキル説明:
    〜〜
    Goto "スタート"

    女ルート:
    〜〜
    Goto 名前入力(ヒロイン)
    名前入力(ヒロイン):
    〜〜
    Goto 職業説明(ヒロイン)
    職業説明(ヒロイン):
    〜〜
    Goto スキル説明(ヒロイン)
    スキル説明(ヒロイン):
    〜〜
    Goto "スタート"
    exit

    スタート:
    〜〜
    exit

    エピローグ:
    〜〜
    exit
    =====

    上のようにしているのであれば、通常ラベルは普通はこのように使いません。(人にもよるでしょうが)

    処理ごとにラベルを指定する必要はありません。
    実行操作やイベント制御関係のコマンドによって変更されない限り、ある行の処理が終わったら次の行が実行されます。

    次に行いたい処理が、直前の処理のすぐ下の行に記述してあるならば、通常ラベルもGotoも不要です。



    ■Gotoラベルを用いるのであれば、
    =====
    プロローグ:
    (ルート選択)
    if 〜〜 then
     Goto 男ルート
    else
     Goto 女ルート
    endif
    #exit
    #↑のexitは、無くても大丈夫です。
    #この行より前に、絶対にGotoでどこかのラベルに飛ぶので。

    #ただし、シナリオを配布する時には、バグの元になるといけないので念のためexitは入れておくべきでしょう。


    男ルート:
    (男名前を入力)
    (男職業説明文)
    (男職業を選択)
    (男スキルの説明)
    (男スキルの選択)(?)
    exit
    #上にも書きましたが、男ルート以外の通常ラベル、Gotoによるラベル移動は不要です。
    #名前〜スキルまで全部続けて書いてしまいましょう。

    #女ルートも同様。
    女ルート:
    (略)
    exit

    スタート:
    〜〜
    exit

    エピローグ:
    〜〜
    exit
    =====

    プロローグと男ルートラベルの間にexitが無くても大丈夫ということは、
     プロローグイベントの「内」か「外」かは非常に曖昧
    って事も意味します。
    ですから、
    (あくまでも個人的な意見ですが)イベントの内か外か、という理解はしない方が良いでしょう


    ■別構成、Gotoを使わない場合。
    =====
    プロローグ:
    (ルート選択)
    if 〜〜 then
     (男ルートに相当)
     (名前を入力〜スキルまで、ラベルもGotoも無しで記述)
     exit
    else
     (女ルートに相当)
     (名前を入力〜スキルまで、ラベルもGotoも無しで記述)
     exit
    endif
    #exit
    #ここも本当は↑のexitは入れておいたほうが安全ですが、
    #if分岐内でexitされれば大丈夫な筈です。

    スタート:
    〜〜
    exit

    エピローグ:
    〜〜
    exit
    =====


    ■別構成その2、ラベルを使いたい場合
    名前/職業/スキルだけ再入力する機能とかを作りやすい。
    この場合は、GotoよりもCallとReturnを使うのが良いでしょう。
    =====
    プロローグ:
    〜〜
    (ルートを選ぶ)
    if 〜〜 then
     Call 男ルート
    else
     Call 女ルート
    endif
    〜〜
    exit

    男ルート:
    Call 男名前入力
    Call 男職業選択
    Call 男スキル選択
    return

    女ルート:
    Call 女名前入力
    Call 女職業選択
    Call 女スキル選択
    return

    男名前入力:
    (名前入力)
    return

    男職業選択:
    (職業説明)
    (職業選択)
    return

    男スキル選択:
    (スキル説明)
    (スキル選択)
    return

    女名前入力:
    (名前入力)
    return

    女職業選択:
    (職業説明)
    (職業選択)
    return

    女スキル選択:
    (スキル説明)
    (スキル選択)
    return

    スタート:
    〜〜
    exit

    エピローグ:
    〜〜
    exit
    =====


    あまり説明らしい説明がなく、例示のみで分かりづらいかと思いますし、
    横道の方が多いレスになってしまいましたが
    多少なりとも通常ラベルやGotoコマンド等を理解する助けになれば、と。

    では。
引用返信/返信 削除キー/
■21074 / inTopicNo.3)  Re[2]: スタートイベントの動作がおかしい。
□投稿者/ harimayado -(2008/07/06(Sun) 10:46:11) [ID:NtDqZ0fh]
    2008/07/06(Sun) 13:43:12 編集(投稿者)

    返答ありがとうございます。
    プロローグイベントがexitで終了されるまで続く…というのは初めて知りました。
    また、自分の中ではプロローグとスタートの間にあるラベル=プロローグ内だと考えていましたが、説明を読む限り違うみたいですね…頑張って理解してみます。

    それで、色々と方法を書いて下さってありがたいのですが…
    自分、こんな処理をしていまして…

    スキル説明:

    If スキル説明 Then

    〜〜〜

    Switch AskWindow(分かった,分からなかった)
    Case 1
    TalkWIndow ミルモ 下 お分かり頂けて何よりです。

    Case 2
    TalkWIndow ミルモ 下 それではもう一度説明させて頂きます。
    TalkWindowEnd
    Goto スキル説明

    Endsw

    EndIf


    と、解答によって説明を繰り返すという動作をさせています。
    今までGotoを使って楽ばかりしていたためなのですが…
    GoToを使用しない方法やCallを使用する方法で、この動作をどう行わせるかが今一分からないのです…

    もし良ければ、Gotoを使用しないで上記の処理を行わせる文を教えてもらえないでしょうか?

    -訂正とお詫び-
    敵の位置がずれて表示されるとの質問ですが、どうやらキャラクター登場場所に障害物(大)を設置していたためのようでした。
    障害物(小)なら問題ありませんでした…

引用返信/返信 削除キー/
■21075 / inTopicNo.4)  Re[3]: スタートイベントの動作がおかしい。
□投稿者/ 中箱 -(2008/07/06(Sun) 14:24:50) [ID:TdSzoAHN]
    選択によって説明を繰り返すのであれば
     ・ラベルとGotoを使う方法
    の他に
     ・Do〜Loopを使う方法
    が一般的かなと。

    また、この場合はCallを使う必要はないでしょう。


    ●Do〜Loopの方法

    選択肢で1番目を選ばなかった場合は処理Aを繰り返す、という処理をDoで用いて実現するには
    例えば
     Do
      (処理A)
      Ask
      分かった
      分からなかった
      End
      (処理B)
     Loop While (選択 != 1)
    のようにします。

    (Loop条件は、処理Bの内容によっては変える必要が出てくることがあります)

    ※AskWindowは処理の内容を知らないので、Askを使っています。



    処理Aには説明を、

    処理BでSwitchあたりを用いて、
    繰り返して説明する場合と、説明を終える場合で表示するメッセージを変更するようにすることになるでしょうか。(システム変数「選択」を利用してください)
    (詳細はヘルプのAskコマンド項と変数項を)


    インクルードで追加された中身や動作が分からないコマンドが使われているので、細かい動作で不具合が出るかもしれませんが
    大まかな方針としてはこんな感じかと。

    では
引用返信/返信 削除キー/
■21076 / inTopicNo.5)  Re[4]: スタートイベントの動作がおかしい。
□投稿者/ harimayado -(2008/07/07(Mon) 01:00:28) [ID:NtDqZ0fh]
    返答遅れてすいません。

    中箱さんの教えてくださった方法を試した所、スムーズにシナリオが動くようになりました。

    今回、使用したことのないイベントコマンドが多数出てきて少々混乱しましたが、実際に使用してみると便利で驚きました。

    中箱さん、質問に答えてくれただけでなくアドバイスもしてくださって、ありがとうございました!
解決済み!
引用返信/返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック表示 検索 掲示板新着情報RSS配信新着情報 過去ログ

- Child Tree -
- Antispam Version -