Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-01-03

アドベンチャーからなこノベルへ

| 20:53

 選択肢とジャンプを完成させたところで、唐突に記事が終了してしまっていたアドベンチャー。

 まあ、アドベンチャーというより、なでしこ遊び(?)自体から離れてしまっていたんだけど、でも実際には、もうちょっと先まで作っていたんだよね。

 簡単なトランジョンを付けたり、立ち絵やテキストウィンドウののオンオフが出来るようににしたり、右クリックでテキストウィンドウを隠したり・・・と言ったような、些細な改変ですけれどね。

 しかも、トランジョンの下りなんかは、ここにUPするつもりで書いたテキストなんかもこっり発見されて、一体どうしてUPせずに放置となったのだろう(汗)

 ちょっと、覚えておらんね。

 それにしても・・・読み返すと、びっくりするくらいテンション高いね(恥)

 ・・・それはともかく、正月休みのヒマヒマに色々遊んでみていたら、色々バグっていることが発覚。

 バグっているのは嫌なので、直してみたり、シナリオの仕様を改めたりして、久々に頭を使っている。

 こんなにずーーーっと離れていても、さくっと思い出せるってのはいいね。

 自分が書いたやつ見たら、ちゃんと分かるもねー。

 やっぱり、なでしこ、素晴らしい!

 ま、何かって言うと命令一覧と首っ引きだけど、ある意味もともとそうだったしw

 ところで、最初から分かってはいたけど、これってアドベンチャーって言うよりノベルゲームだよね。

 アドベンチャーって言ったら、『オ○ーツクに消ゆ』的な、見るとか調べるとかコマンドがあって、話を進めるやつだよね。

 というわけで――

 アドベンチャー→『なこノベル』と改称して、これから少しは人に見せられそうなモノにしてみたいと思う。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160103

2011-04-02

選択肢の完成とジャンプコマンド

| 12:26

 あれよあれよと言うに、もう4月・・・

 毎年この季節はそう思うのですが、しかし、今年は格別でした。

 東日本大震災の被害に遭われた方々には、心よりお見舞い申し上げます。

 んなこんなで、停滞していましたが、これからは日に日に春の日しが強くなり、お庭仕事も頑張らなきゃならないから、おうちでパソパソプログラムを作ってる場合ぢゃないよ~。

 でも、とりあえず、問題の解決はしないとね!



【せんせい】

 というわけで、今日はまた、シナリオの仕様変更からです(汗)

メッセージ,ちょっと話を聞いてみましょう。
改ページ,
選択肢,2
,ちょっと名前を聞いてみる,名前聞く
,ガイシャの写を見せる,写見せる

*名前聞く
メッセージ,このおじょうさーん。
メッセージ,ちょっと名前を教えてください~♪
改ページ
メッセージ,おばさん「・・・ナンパ?」
改ページ
メッセージ,いや・・・あなたぢゃなく(汗)
改ページ
ジャンプ,後半へ続く

*写見せる
メッセージ,この人物に見覚えありませんかねー?
改ページ
メッセージ,おねーさん「さあ・・・見たこと無い顔
メッセージ,ですよ」
改ページ
メッセージ,そうですよね・・・
改ページ
ジャンプ,後半へ続く

*後半へ続く
メッセージ,さて、気を取り直して・・・・

【でし】

 なぜかまた、無意味に長くなりましたね~。

【せんせい】

 気にしないで!

 さて、ラベルはやはり、コマンドなどしか入らないことになっている0列目にしたほうがよいだろうということになりました~。

 ちょっとなでしこっぽく、「*」が目印です(笑)

 処理はほとんど同じなので、新たに追加したジャンプコマンドについてだけ書きますね。

 これは、前課題として残した、選択肢を経ずに目的のラベルへジャンプさせられるコマンドです。


 例によって、コマンド解析の中に追加です。

    違えばもし、コマンドが「ジャンプ」ならば
      ラベルは「*」
      ラベルにシナリオ¥番号,1を追加。
      シナリオの0でラベルを0から表検索。
      ジャンプ先はそれ。
      もし、ジャンプ先=-1ならば
        「ラベルがありません」と言う。
        終了。
      違えば
        番号=ジャンプ先+1
        テキストウィンドウクリア。
        シナリオ解析。

 ラベル文字列。ジャンプ先は整数。別のところで宣言してあります

 特に文字列は、ちゃんと宣言しとかないと、エラーになることが多いみたいですね。

【でし】

 ってか、全部ちゃんと宣言しとけばいいんじゃないですか。

【せんせい】

 それのとおりです;;;

 選択肢のほうは、マウス押したとき~のイベントの中に、同様の処理がありますから、同じように書き換えます。

 選択肢のコマンドの書式が、ワタシの趣味により若干変わりましたが、単にちょっと入れる列を変えただけなんで、気にしないでw

 これで、だいぶゲームらしくなったんじゃないでしょうか♪

【でし】

 あと、あれじゃないですか?

 良いことを言ったら、好感度があがるとか。

【せんせい】

 えーっ、それってどうやんの?

 とりあえずフラグを立てて、数値を変化させるのはいいとして、ジャンプするときに、それにしたがってジャンプ先が変わったり、出てくる選択肢が変わったりするって話でしょ?(>_<)

【でし】

 だって、いう要素がないと、ゲームなんてつまらないじゃないですか~。

【せんせい】

 んなことない~。

 名作「か○い○ちの夜」だって、フラグでストーリーが分化するのはたった一箇所だけなんですよ~っ。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20110402

2011-03-06

分岐先へジャンプするよ!

| 20:35

【でし】

 今日言う今日は、選んだ選択肢のストーリーに飛んでいくことができるんでしょうね?

【せんせい】

 はいぃ。タイトルにうったているとおりです。

 までは、上から順に一行づつ読んでるだけでしたが、そうも行かないので困ったな、というお話しです;

 クリックした選択肢に応じて、条件分岐を使って処理を振り分けるのはクイズでもやりましたが、クイズのように、単に当たりか外れを判定していた場合と違い、選んだ選択肢に応じてストーリーが変化する。つまり、シナリオファイルの任意の行へ処理を移すということは、どこへジャンプするかを示す、ラベルのようなものが必要になります。

 して、ラベルを検索しての行(正確にはの次の行)から再びシナリオ解析を始める、ということでよいでしょう。


 まず、シナリオの選択肢のコマンドをこんな感じに変えてみます。

メッセージ,ちょっと話を聞いてみましょう。
改ページ,
選択肢,2
名前聞く,ちょっと名前を聞いてみる
写見せる,ガイシャの写を見せる

ラベル,名前聞く
メッセージ,このおじょうさーん。
メッセージ,ちょっと名前を教えてください~♪


ラベル,写見せる
メッセージ,この人物に見覚えありませんかねー?

 選択肢の後ろの「2」は、選択肢の数を表します。

 前まで、選択肢数はプログラムの中で2で決め打ちしていましたが、三択にしたい場合もあるだろうからです。

 して、の次の行から実際の選択肢で「ラベル,選択肢として表示するメッセージ」という書式になっています。

 書式変更に伴って、シナリオ解析はこうなりました。

    違えばもし、コマンドが「選択肢」ならば
    	行数=0
    	選択肢数=シナリオ¥番号,1
    	(選択肢数)
    	  番号=番号+1
    	  ラベル一覧¥(回数-1)=シナリオ¥番号,0
        シナリオ¥番号,1を「選択肢」の文字高さ取得行数へ選択肢表示。
        行数行数+1

      選択肢をボタン化。
      選択待機オン

 ラベル一覧と言う配列に、ラベル部分を格納しており、クリックすると「ラベル一覧¥(前選択ボタン-1)」で得られます。


表画面のマウス押した時は~ 選択待機ONの時のイベントを以下のようにします。

  違えばもし、選択待機オンならば
    もし、前選択ボタン=0でなければ
      シナリオの1でラベル一覧¥(前選択ボタン-1)を0から表検索。
      ジャンプ先はそれ。
      もし、ジャンプ先=-1ならば
        「ラベルがありません」と言う。
        終了。
      違えば
        番号=ジャンプ先+1
        テキストウィンドウクリア。
        シナリオ解析。

 表検索で得られた行がラベルなので、の下からシナリオ解析を再スタートさせるだけです。

 一応、ラベルがなかった場合の処理も加えます。


 また、次のラベルに到達したら、の先は読んではいないので、とりあえずシナリオの最後まで読み込んだ場合と同様に、終了させることにします。

 シナリオ解析に以下追加

    違えばもし、コマンドが「ラベルならば
      「おわり」と言う。
      終了

【でし】

 ぱちぱちぱち~。

 ちゃんと、ジャンプしましたね!

【せんせい】

 でも、まだ完全とはいないんですよ。

 分岐して、このままそれぞれのエンディングを迎えることもあるでしょうが、会話やイベントのバリエーションを経て、元のルートに戻ってくるということも少なくありません。

 選択肢を経ずに、ラベルへジャンプさせられるコマンドも必要です。

 あと・・・最大の問題としては、現在は検索するラベル文字列が、シナリオの配列上、1の列に入っていますが、ここってメッセージでは、実際に表示する色々なメッセージが入る列なんで、何かの弾みでラベルとかぶってしまうことも普通にありえます。

 やっぱり、この仕様はよろしくありません。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20110306

2011-02-27

選択肢を選択するよ!

| 12:54

【せんせい】

 と言うわけで、今日は選択肢をじっさいに選択できるようにします。

 は、メッセージ.csvに変更はありません。

 選択肢のマウスオーバー処理は、スマートじゃないもしれませんが、クイズやちょぼいちのときに作った、マウスオーバーボタン関数を使っちゃおうと思います。

 まず、シナリオ解析の選択肢の項目にちょこっと追加関数を呼び出します。

    違えばもし、コマンドが「選択肢」ならば
    	行数=0
    	(選択肢数)
        シナリオ¥番号,回数を「選択肢」の文字高さ取得行数へ選択肢表示。
        行数行数+1

      選択肢をボタン化。
//      選択肢用の0,0を選択肢ボタンで表画面へマウスオーバーボタン表示。
      選択待機オン
      番号=番号+1
//      シナリオ解析

 追加した関数を順に見て行きます。

*選択肢をボタン化
  選択肢用の幅は620*2。選択肢用の高さは「選択肢」の文字高さ取得*選択肢数。

  (選択肢数)
    表画面のテキストウィンドウX+5,テキストウィンドウY+10+*1,620,「選択肢」の文字高さ取得を選択肢用の621,(回数-1)*(「選択肢」の文字高さ取得)へ画像部分コピー。

   選択肢用を画像ネガポジ。
  (選択肢数)
    表画面のテキストウィンドウX+5,テキストウィンドウY+10+*2,620,「選択肢」の文字高さ取得を選択肢用の0,(回数-1)*(「選択肢」の文字高さ取得)へ画像部分コピー

 これは、「選択肢用」という裏画面に、元の選択肢の文章と、それを反転させたものが左右に並ぶようにコピーしたものです。

 通常時は左側の画像が、マウスオーバー時は右側の画像が表示されることになります。


 して、これボタンの設定。

 ボタンのサイズや表示位置などの設定を、二次配列で別途設定するので、なんか面倒なんだけど、管理はしやすい感じ。

選択肢ボタンとは配列。 #0ボタン表示位置X、1ボタン表示位置Y、2ボタン幅、3ボタン高さ
(選択肢数)
  選択肢ボタン回数,0はテキストウィンドウX+5
  選択肢ボタン回数,1はテキストウィンドウY+10+(回数-1)*(「選択肢」の文字高さ取得+7)
  選択肢ボタン回数,2は620
  選択肢ボタン回数,3は「選択肢」の文字高さ取得+7

 通常ですとボタン設定配列Aの内容にしたがって、マウスオーバーボタン用の裏画面を、任意の画面に配置します。

 の場合は逆に、表示されたものをボタン化しているので、不要でした;

 でも、いままで使ってはいても関数を乗せていなかった気がするので、一応掲載。

●マウスオーバーボタン表示({グループ=?}OBJ1のX,YをAで{グループ=?}OBJ2へ)
  A\0,0=X。A\0,1=Y
  (Aの要素数-1)
    OBJ1のX,Y+(回数-1)*(A¥回数,3),(A¥回数,2),(A¥回数,3)をOBJ2の(A¥回数,0),(A¥回数,1)へ画像部分コピー

 実際に、マウスを動かしたりクリックしたりすると、イベントが発生。

表画面のマウス移動した時は~
  もし、選択待機オンならば
    選択肢用の選択肢ボタンを表画面へマウスインアウト反映。
  
表画面のマウス押した時は~
  もし、改ページ待機オンならば
    もし、表画面の押されたボタン=左ならば
      もし、コマンドが「改ページ」ならば
        テキストウィンドウクリア。
      ブリンクを停止。
      シナリオ解析
    違えば
      戻る
  違えばもし、選択待機オンならば
    もし、前選択ボタン=0でなければ
      「選択肢{前選択ボタン}をクリック」と言う
  
  違えば
    戻る

 実際にマウスカーソルの位置を取得して、どのボタン(選択肢)の上に乗っているかいないか判断して、画像を変える肝心の部分。

 かなり、びみょーなコードですが;;;

●マウスインアウト反映({グループ=?}OBJ1のAを{グループ=?}OBJ2へ)
  (Aの要素数-1)
    もし、((OBJ2→マウスX)>(A¥回数,0))かつ
      ((OBJ2→マウスX)<(A¥回数,0)+(A¥回数,2))かつ
      ((OBJ2→マウスY)>(A¥回数,1))かつ
      ((OBJ2→マウスY)<(A¥回数,1)+(A¥回数,3))ならば
        選択ボタン回数。
    違えばもし、(回数=Aの要素数)かつ(選択ボタン=0)ならば
      選択ボタンは0。
    ここまで

  もし、前選択ボタン<>選択ボタンならば
    もし、前選択ボタン>0ならば
      OBJ1の(A\0,0),(A\0,1)+(前選択ボタン-1)*(A¥(前選択ボタン),3),(A¥(前選択ボタン),2),(A¥(前選択ボタン),3)をOBJ2の(A¥(前選択ボタン),0),(A¥(前選択ボタン),1)へ画像部分コピー。
    もし、選択ボタン>0ならば
      OBJ1の(A\0,0)+(A¥(選択ボタン),2),(A\0,1)+(選択ボタン-1)*(A¥(選択ボタン),3),(A¥(選択ボタン),2),(A¥(選択ボタン),3)をOBJ2の(A¥(選択ボタン),0),(A¥(選択ボタン),1)へ画像部分コピー。
  前選択ボタン=選択ボタン
  選択ボタン=0
  描画処理反映

【でし】

 お~、選択肢にマウスカーソルを合わせると、反転しますね!

 とっても、ゲームっぽいです♪

【せんせい】

 して、選択肢をクリックすると、何番目の選択肢をクリックしたかが分かります。

【でい】

 っていうか・・・本当に、ただ選択しただけでしたね(汗)

*1回数-1)*(「選択肢」の文字高さ取得

*2回数-1)*(「選択肢」の文字高さ取得

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20110227

2011-02-16

選択肢を表示するよ!

| 17:16

【せんせい】

 選択肢の選択と決定と同様のことは、クイズでやりましたね。

 具体的に、何をやるかといえば、

①選択肢となるメッセージを表示

②選択肢上にマウスカーソルがきたら、メッセージの色を変えたり、反転させたりする。

③選択肢上でマウスが左クリックされたら、選択に応じて分岐先のシナリオへ進む。

 という感じになるかと思います。

 単に物語を進めるための改行、改ページの時とは、マウス入力待ちの処理を分けなければなりません。


【でし】

 改行、改ページの時は、「点滅カーソル」って関数を呼んでピカピカさせつつ、改ページ待機のフラグをオンにして、マウス入力を待ったんですよね。

【せんせい】

 のとーりです。

 も、選択肢表示用の関数を呼び、選択待ちのフラグを立てて、マウスの移動やクリックに応じて処理を行うようにすればいいでしょうかね。

 とりあえず、てきとーにメッセージ.csvに、選択肢のコマンドを加えてみます。

メッセージ,ここは函館カトリック教会。
改行,
メッセージ,被害者は、殺される前日に、この付近に
メッセージ,立ち寄った形跡があります。
改ページ,
立ち絵,立ち絵2.bmp
メッセージ,立ち絵をへんこうしました。
改ページ,
メッセージ,ちょっと話を聞いてみましょう。
改ページ,
選択肢,ちょっと名前を聞いてみる,ガイシャの写を見せる

 シナリオ解析関数の中に

    違えばもし、コマンドが「選択肢」ならば
    	行数=0
    	(選択肢数)
        シナリオ¥番号,回数を「選択肢」の文字高さ取得行数へ選択肢表示。
        行数行数+1
            	
      番号=番号+1
      シナリオ解析

 を、ちょちょいっと加え・・・

*選択肢表示(Sを{数値=0}Yへ)
  表画面のテキストウィンドウX+10,テキストウィンドウY+10+YへSを0でノベルテキスト描画。

 はいっ、選択肢が表示されました~。

 は簡便に、テキストウィンドウに選択肢を表示していますが、表示位置を変更すれば、別に選択肢用のウィンドウを開いて表示するということも可能かと思います。


 選択肢の表示は、遅延表示でなくてもいいかなーと思った結果、ノベルテキスト描画関数にも、ちょっと手を加えました。

 現状では、遅延スピードAが0であっても、遅延表示されてしまう為です。

●ノベルテキスト描画({グループ=?}OBJのX,YへSを{数値=200}Aで)
  もし、A=0ならば
    文字書体は「MS ゴシック|24|太字」。文字色黒色。
    OBJのX+2,Y+2へSを文字描画。
    文字書体は「MS ゴシック|24|太字」。文字色白色。
    OBJのX,YへSを文字描画。
    描画処理反映
     
  違えば、
    XX=X
    (Sの文字数
      Sの回数から1文字抜き出す。
   
      もしそれ=「{CHR(10)}」ならば
        X=XX
        Y=Y+(それ文字高さ取得)
        続ける

      文字書体は「MS ゴシック|24|太字」。文字色黒色。
      OBJのX+2,Y+2へそれ文字描画。
      文字書体は「MS ゴシック|24|太字」。文字色白色。
      OBJのX,Yへそれ文字描画。
      描画処理反映
      (A/1000)秒待つ。
   
      X=X+(それ文字幅取得

 まあ、遅延0ミリ秒が指定されていたら、文字列Sをのまま表示するってだけのことです。


 あ、あと、どうも時々あらぬところで点滅カーソルがチラッと現れるなーと思っていたら、改行の際には「ブリンク」つまり点滅カーソルのアニメーションを停止していなかったことが判明(テキストウィンドウクリアの中で停止していたため)

 「表画面のマウス押した時は~」の判定内で停止するように直しました。


【でし】

 ・・・マヂで、単に選択肢を表示しただけでしたね(汗)

【せんせい】

 はいぃ~;

 どっちかっていうと、シナリオの選択肢のコマンドをどうするか考え中って言うか。

 選択して次のメッセージにジャンプするためには、の状態ではダメなんですよね。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20110216