フラグの立て方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おかかぶし

フラグの立て方

#1

投稿記事 by おかかぶし » 13年前

こんばんは。明けましておめでとうございます!
この間はお世話になり、ありがとうございました。
早速ですが、また問題にぶつかりましたので質問させて頂きます。

下記サイトの、softyaさんの講座を元にしています。
http://dixq.net/forum/blog.php?u=114&sd=a&c=2&start=40

フラグの立て方で苦戦しています。

SCN_IF_SKIPを使って、試しているところなのですが、戦闘が終わった後に
{ SCN_IF_SKIP,"win1",*win,IF_EQUAL}を入れているのですが
次の{ SCN_GOTO, "test" }を飛ばさずに、結果としてエンディングではなく、
testのラベルまで飛び、テストという文字が表示されてしまいます。

勝ったら、次に入った時のマップを違うものにしたい、など
フラグという考え方が必要だなと思いました。
このスキップを使う書き方は間違っているのでしょうか。
もし簡単な考え方がありましたら、教えてくださると嬉しいです。
よろしくお願いします。


ダンジョンのシナリオ

コード:

#include <DxLib.h>

#include "main.h"
#include "eventScn.h"
#include "enemy.h"

//----------------------------------------------------------------------
//      システム・シナリオ
//----------------------------------------------------------------------
char *win = "";

//      マップチェンジ時シナリオ
static ScnData_t MapChangeScn[] = {
        //      シナリオ命令,文字列,数値パラメータ1,数値パラメータ2,

        //      町からのマップチェンジ
        //      自キャラの調整
        { SCN_PLY_EPOS, NULL, 0 },      //自キャラの位置をイベント番号の位置にします。
        { SCN_PLY_POS, NULL, 0, -1 },   //自キャラの位置を変えます。
        { SCN_PLY_MUKI, NULL, CHAR_MUKI_UP, 0 },        //自キャラの方向を変えます。

        { SCN_EXIT },   //イベントを抜けます。

        { SCN_END },    //ストッパとしてシナリオ終端に必須です。
};

コード:

//----------------------------------------------------------------------
//      マップイベントのシナリオ
//----------------------------------------------------------------------

static ScnData_t Boss1[] = {
        { SCN_MES, "ボスバトルが始まります", TRUE, SCN_WND_MSGD },

        //      戦闘開始
        { SCN_BOSS_BTL,NULL,ENEMY_BOSS },       //ボスバトル開始。
        { SCN_MES, "メッセージ", TRUE, SCN_WND_MSGD },//セリフ
        { SCN_BATTLE_WIN },
        { SCN_IF_SKIP,"win1",*win,IF_EQUAL},
        { SCN_GOTO, "test" },

        { SCN_ENDING }, //勝利したのでエンディング
        { SCN_EXIT },   //イベントを抜けます。

        { SCN_LABEL, "test" },  //ラベル
        { SCN_MES, "テスト", TRUE, SCN_WND_MSGD },//セリフ
        { SCN_EXIT },   //イベントを抜けます。

        { SCN_END },    //ストッパとしてシナリオ終端に必須です。
};

eventScn.hで宣言しています

コード:

extern char *win;


eventScn.cppで新しいイベントを作りました

コード:

//######################################################################
//      (シナリオ命令)SCN_BATTLE_WIN  バトルに勝ったとき
//######################################################################
static int scn_BattleWin(ScnData_t *scnData)
{
        win = "win1";

        //      シナリオを次に進める。
        event_NextScn();

        //      イベントを継続する。
        return EVENT_RTN_CONTINE;
}

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: フラグの立て方

#2

投稿記事 by へにっくす » 13年前

グローバル変数winを使用したいみたいですが、
*winと指定しても意味ないですよ。
softyaさんのページを見ましたが、そこには
第3パラメータに「シナリオ変数番号」とあります。
これって、どの変数を使用するか識別するためのパラメータってことだと思うので、
たとえば、winを対象にしたいなら0、他の変数を対象にしたいなら0でない任意の値、、
とやって割り振るのです。
例として以下のようにグローバル変数があるとして、

コード:

extern char *win1;
extern char *win2;
extern char *win3;
どの変数を使うか番号で割り振る。

コード:

// シナリオ変数番号
enum {
    SCN_NUMBER_WIN1 = 0, // グローバル変数 win1 を使用する
    SCN_NUMBER_WIN2,     // グローバル変数 win2 を使用する
    SCN_NUMBER_WIN3,     // グローバル変数 win3 を使用する
};

コード:

//省略
{ SCN_IF_SKIP,"win1",SCN_NUMBER_WIN1,IF_EQUAL},
//省略
という形で。
あとはSCN_NUMBER_WIN1~SCN_NUMBER_WIN3での処理をSCN_IF_SKIPの判定関数かな?
そこに書くだけですが、、
・・・ってここまで書いてなんですけど、
Softyaさんの簡単RPG講座と大きくかけ離れてしまいます。
それに変数として

コード:

//  シナリオ変数構造体
char g_scnVar[SCNVAR_MAX][SCNVAR_LENGTH_MAX];
がすでにある。
オフトピック
簡単RPG講座10-6。イベント(シナリオ)システム編6
を見てるならこういう質問の記事自体でない気がする。。
みけさんがどこまでこの講座を見てるか知りませんが、少なくとも最後まで(10-7までありますよ)見ていない印象があります。
ちゃんと最後まで見てますか?
掲示板トップ ‹ 全体の日記 ‹ 講座
で、でる一覧に「簡単RPG講座」で始まるsoftyaさんの記事を全部みてるのでしょうかね?
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: フラグの立て方

#3

投稿記事 by softya(ソフト屋) » 13年前

シナリオの状態は必ずg_scnVarに保存してください。
そうしないとセーブ・ロードを実装する時に面倒な事になります。
必要なシナリオ変数は、シナリオ変数番号であるSCNVAR_に追加をお願いします。

へにっくすさんも書かれている通りSCN_IF_SKIPの"数値パラメータ1"は"シナリオ変数番号"です。
詳しくは、eventScn.hのシナリオ命令表を参照してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

おかかぶし

Re: フラグの立て方

#4

投稿記事 by おかかぶし » 13年前

へにっくすさん、softyaさん
ご丁寧にありがとうございました!
とても分かりやすい説明のおかげで、考え方が理解できました。

また、講座の方にもう一度目を通したところ、SCN_SET_VARという変数に文字列を設定する、
というシナリオ関数が作られてあったので、その中身を自分で作ってみたところ、フラグを立てることができました!
本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る