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

2011/02/04 (金)

立ち絵を変更するよ!

| 18:36 | 立ち絵を変更するよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 立ち絵を変更するよ! - 雪乃☆雫のなでしこ日和 立ち絵を変更するよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

【せんせい】

 ではでは、この調子で、立ち絵も変更してみます。

 まず、メッセージ.csvをこんな感じに!

メッセージ,我輩はNAKOである。  
メッセージ,名前はまだない。
改ページ,
メッセージ,ここは百合が原公園。
改行,
メッセージ,死体発見現場ですw
改ページ,
背景,背景2.jpg
メッセージ,背景をへんこうしました。
改ページ,
メッセージ,ここは函館カトリック教会。
改行,
メッセージ,被害者は、殺される前日に、この付近に
メッセージ,立ち寄った形跡があります。
改ページ,
立ち絵,立ち絵2.bmp
メッセージ,立ち絵をへんこうしました。
改ページ,

 だんだん、シナリオが長くなりますね。


 シナリオ解析関数の中に

    違えばもし、コマンドが「立ち絵」ならば
      裏_立ち絵の画像はシナリオ¥番号,1
      ADV画面合成
      番号=番号+1
      シナリオ解析

 を追加

 プログラム自体は、背景の変更と手順は同じなので、何のことはありませんでしたね。

 これで、背景や人物を変えながら、物語を読み進めていくことはできるようになったと思います。

【でし】

 でも、これだけじゃゲームとは言えませんよね?

 選択肢が出て、どれを選ぶかで物語が変わっていく・・みたいなのがないと。

【せんせい】

 そうですね。

 次の、選択肢の表示について考えて見ましょう。

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

2011/01/29 (土)

背景を変更するよ!

| 17:24 | 背景を変更するよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 背景を変更するよ! - 雪乃☆雫のなでしこ日和 背景を変更するよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

【でし】

 復帰そうそう、サボり気味の毎日ですね。

【せんせい】

 仕方ありません;

 例年にない豪雪で、雪はねに追われてぐったりなのです~。

【でし】

 家に引きこもっているのに、弱っているのを言い訳に、ダラダラすごしているそうですw

【せんせい】

 (無視して)

 さて、今日は背景を変更したいと思います!

 ずっと同じ場所で話が進むってゲームはあまりありませんから、場所が移動すればそれに応じて背景が変わっていくのは、当然のことですよね。

 「背景,背景1.jpg」のよーな書式で、指定したファイルを背景に設定することにします。

 まず、メッセージ.csvをこんな感じに!

メッセージ,我輩はNAKOである。  
メッセージ,名前はまだない。
改ページ,
メッセージ,ここは百合が原公園。
改行,
メッセージ,死体発見現場ですw
改ページ,
背景,背景2.jpg
メッセージ,背景をへんこうしました。
改ページ,

 シナリオ解析関数の中に

    違えばもし、コマンドが「背景」ならば
      裏_背景の画像はシナリオ¥番号,1
      ADV画面合成
      番号=番号+1
      シナリオ解析

 を追加し、ADV画面合成という関数を作ります。

 背景を変えた後は、再度全部の画像を重ねあわせなおさないといけないからです。

*ADV画面合成
  裏_背景を表画面の0,0へ画像コピー。
  裏_立ち絵を表画面の0,0へ画像合成改。
  裏_テキストウィンドウの5,5,630,110を表画面のテキストウィンドウX,テキストウィンドウYへ50で画像部分透過コピー。
  表画面を保持用の0,0へ画像コピー

 これで、できたかな~? と思ったら・・・


【でし】

 あれれ~?

 テキストウィンドウが、緑色になっちゃいましたよ~?!

【せんせい】

 ううぅ・・・画像部分コピー関数の問題でした(泣)

●画像部分透過コピー({グループ=?}コピー元のX,Y,W,Hを{数値=$00FF00}透過色で{グループ=?}コピー先のX2,Y2へ{数値=50}透明度で)
  処理用をイメージとして作成。処理用の可視はオフ。
  処理用の幅はW。処理用の高さはH。

  #半透明にしたい部分を処理用に移す
  コピー元のX,Y,W,Hを処理用の0,0へ画像部分コピー

  #コピー元の半透明にしたい部分以外をコピー先へ合成
  塗り色は透過色。線色は透過色。線太さは0。
  コピー元のX,YからX+W,Y+Hへ四角。
  コピー元をX,Yでコピー先のX2,Y2へ画像合成改。
  
  #半透明にしたい部分を透過コピー
  処理用をコピー先のX+X2,Y+Y2へ透明度で画像半透明コピー
  
#  処理用→壊す。

 このような、内容でした。

 よくみたら、元画像(コピー元)に変更を加えてしまっています!

 こりゃ、緑色になるわけだ(汗)

 本当なら、元画像はいじらずに、別画面で処理を行うようにしたら良いと思いますが、面倒なので、ちょいと元に戻して終わらせるようにしました。

  #コピー元を元に戻す
  処理用をコピー元のX,Yへ画像コピー

 この一文を追加で解決!

 ちなみに、ナゾの「無効なポインタ操作」対策で、処理用→壊す。は、コメントにしてます。

 のところは、これで正常動作です。むむむ。

【でし】

 ところで、画面ですけど、ぱって変わっちゃいますけど、これじゃゲームっぽくないですよぅ。

 普通、場面が変わるときとか、なんかあるじゃないですか。

【せんせい】

 トランジョン(?)は、後し!

 簡単なのは、わりと簡単に実装できるはずですが・・・

【でし】

 先生にとっては、簡単じゃないってことですね?

【せんせい】

 しくしくしく・・・

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

2011/01/06 (木)

改行改ページをつけるよ!

| 01:13 | 改行改ページをつけるよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 改行改ページをつけるよ! - 雪乃☆雫のなでしこ日和 改行改ページをつけるよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

【せんせい】

 今日は、前のメッセージ表示に、改行と、改ページの機能をつけようと思います!

【でし】

 ・・・長い長いブランクを感じさせず、実にさらっと、ものすごく自然に復帰しましたね(汗)

【せんせい】

 宇宙旅行へも行こうかと言う時代、1年や2年など瞬きするの出来事ですよ。

【でし】

 はやぶさが無事帰還したとはいえ、宇宙旅行はまだ無理でしょう;

 って言うかむしろ、竜宮城で遊びほうけていてふと気がついたら浦島太郎状態・・・

【せんせい】

 300年も過ぎ去っていなくて、幸いでした(笑)

 さて、気を取り直して改行改ページですよ!

 ちなみに、改行とは、文字の表示をいったん止めて、画面を変えずにまた続きを表示することです。

 やってるような、ノベルゲーム系では、あんまり必要じゃないもしないですが、画面全体に文字を表示するサウンドノベル系では、必須となりますね

 改ページは、前やったように、まで表示した文字を消して、新しいメッセージを表示することです。

【でし】

 改ページは、もともと実装されてたじゃないですか?

【せんせい】

 現状のままでは、一行ごとに勝手に改ページが行われてしまいますが、は、通常は連続して表示し、指示があった場合だけ、改ページを行うように改造するのが目的です。

 単に、改行改ページっていっても、シナリオを解析して、処理を振り分けるという、一番重要かもしない部分の基本となるところを作っていくわけですから、甘く見てはいけません!


 まず、メッセージ.csvの中身を、以下のように変更。

 二次配列の0番の要素で、命令を判断していくことにしますよ。

 

メッセージ,我輩はNAKOである。  
メッセージ,名前はまだない改行,
メッセージ,             (え;)
改ページ,
メッセージ,みぃ・・・・

 して、コードです。

表画面のマウス押した時は~
  もし、改ページ待機オンならば
    もし、表画面の押されたボタン=左ならば
      もし、コマンドが「改ページ」ならば
        テキストウィンドウクリア。
      シナリオ解析
    違えば
      戻る
  違えば
    戻る

#-----シナリオ開く-------------------------------------------
「メッセージ.csv」を開く。
シナリオはそれ
シナリオ行数はシナリオの要素数。
シナリオ解析
#------------------------------------------------------------

#------------------------------------------------------------
*シナリオ解析
  改ページ待機オフ。
  
    コマンドはシナリオ¥番号,0
  もし、番号>シナリオ行数ならば
    「おわり」と言う。
    終了。
  違えば、
    もし、コマンドが「メッセージ」ならば   
      シナリオ¥番号,1を「メッセージ」の文字高さ取得行数へメッセージ表示。
      行数行数+1     #行数カウント
      番号=番号+1
      シナリオ解析

    違えばもし、コマンドが「改行ならば
      点滅カーソル
      番号=番号+1

    違えばもし、コマンドが「改ページ」ならば
      点滅カーソル
      行数=0
      番号=番号+1

    違えば
      番号=番号+1
      シナリオ解析
    

#------------------------------------------------------------

#-----メッセージ表示-----------------------------------------
*メッセージ表示(Sを{数値=0}Yへ)
  表画面のテキストウィンドウX+10,テキストウィンドウY+10+YへSを100でノベルテキスト描画。

#------------------------------------------------------------

【でし】

 出来ました!

 「メッセージ」コマンドが連続しているは、処理を止めずに次々に次の行を表示、「改行」コマンドがあると、マウスクリックを待って次の行を表示、「改ページ」コマンドがあると、マウスクリックを待って現在表示されているメッセージが消えて、次のメッセージが1行目から表示されます。

 

【せんせい】

 のとーりです。

 問題のシナリオ解析ですが、単にもし違えばもし、で条件分岐をしていってるだけです。

 この先命令が増えても、ここ追加していくだけです。実に簡単でしたね☆

 あと、ここに載ってない変更点としては、前次のメッセージを表示できるようにしたときに、ノベルテキスト描画関数の中から、カーソル点滅を呼び出させていたのですが、それは外に出しました。

 でないと、一行表示したら、強制的にピカピカしちゃいますからね!

 さて、新たに「行数」という変数が登場しました。

 改行できるようにしたことで、メッセージの表示位置を一行づつ下げていく処理が必要になります。

 これを怠ると、おんなじ場所にどんどん文字が重なってしまうということになります。

 改ページのときには、0に戻すのを忘れず!

【でし】

 せんせい!

 もし、改ページを挟まずにメッセージを続けたら、どうなりますか?!

【せんせい】

 いい質問ですね~。

 試しにやってみるのが、早いでしょう。

メッセージ,我輩はNAKOである。  
メッセージ,名前はまだない。
メッセージ,             (え;)
メッセージ,みぃ・・・・

【でし】

 あっ、4行目がっ・・・

【せんせい】

 は、はみ出しの処理を行っていませんから、改ページをはさまずにどんどんメッセージを表示してしまうと、テキストウィンドウから溢れて変なところに文字が表示されるようになってしまいます。と言うか、すぐに画面外になってしまって、5行目以降は全く表示されないですね。

 たぶん、ウィンドウに収まる範囲内で行数を何行までと指定し、それ以上になったら0に戻して改ページの処理を自動で行うようにすれば良いんでしょうけれども・・・

 のところこれは仕様と言うことにして、シナリオのほうで気をつけて違わないようにしましょうw

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

2009/10/04 (日)

本当に次のメッセージを表示するよ!

| 22:39 | 本当に次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 本当に次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 本当に次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

【せんせい】

 仕様に凝るとプログラムが完成しないとゆー格言があるそうです;

 というわけで、それはよろしくないのでとりあえず簡単に、次のメッセージを表示する部分のみを実装していきたいと思います!

【でし】

 おねがいします!

【せんせい】

 手順としては、

マウスクリックを認識

②テキストウィンドウをクリア

③次のメッセージを表示

 となると思います。

 ①と②にかんしては、前やったとおりです。

 しかし、一度クイズでやっていますが、マウス押された時~ のイベントは、別にマウスが押されるまで処理を止めて待っていてくれるという命令ぢゃないので、イベントを待ちながら、次の命令をどんどんこなしていってくれちゃいます。

 だから、メッセージ表示命令は、関数にして、マウス押された時~から呼び出すようにしないといけません。

 ほんの数行のメッセージなら、なでしこのデモみたいに、それぞれ別関数にして、順番に呼び出す形でもいいかもしれませんが、ゲームのシナリオでんなことはやってられませんので、クイズの時と同様、別ファイルにメッセージを用意して、それを一行づつ表示する関数を作ればよさそうです。

【でし】

 長い説明でしたが、ようするに、クイズの時の問題設定~出題と、同様な流れなんですよね?

【せんせい】

 ぶっちゃけのとーりです。こういうことを学ぶために、クイズとか、作ってたわけですからねー。というわけで、こうなりました。


 まず、以下の内容を、「メッセージ.csv」として同じフォルダに保存

我輩はNAKOである。  
名前はまだない。
             (え;)
みぃ・・・・

 コードは、全部載せるとさすがに長いので、変更したトコだけ。

#------------------------------------------------------------
#マウス入力待ち
表画面のマウス押した時は~
  もし、改ページ待機オンならば
    もし、表画面の押されたボタン=左ならば
      テキストウィンドウクリア。
      メッセージ表示。
    違えば
      戻る
  違えば
    戻る
#------------------------------------------------------------

#-----シナリオ開く-------------------------------------------
「メッセージ.csv」を開く。
シナリオはそれ
シナリオ行数はシナリオの要素数。
メッセージ表示。
#------------------------------------------------------------

#-----メッセージ表示-----------------------------------------
*メッセージ表示
  改ページ待機オフ。
  
    メッセージはシナリオ¥番号,0
  番号=番号+1
  もし、番号>シナリオ行数ならば、
    「おわり」と言う。
    終了。
  違えば、
    表画面のテキストウィンドウX+10,テキストウィンドウY+10へメッセージを100でノベルテキスト描画。

#------------------------------------------------------------

【でし】

 おぉ~、先に進みました。

 ところで、この内容で、なんで、二次元配列なんですか? クイズと同様にってのは、分かりますが・・・

【せんせい】

 後のことを考えて、こうなっています。

 はメッセージだけですけど、背景や立ち絵の切り替えとか、すべてシナリオとして外に出さなきゃならなくなるはずなので。

 あと、本当にとりあえずなので、まだ、一行づつしか表示できないです。

 もうちょっと、それらしくしたかったのですが、の前に問題が・・・


 以前、言っていた、無効なポインタ操作のエラーが出てとまっちゃう現象が再発です。

 やっぱり、部品を壊してるところを、全部コメントにしたら直りました。

 前は、一番最初から発生していたのが、は、一はいいけど、二目呼び出されたときに発生するようです。

 部品、壊し忘れて問題が出るなら分かるけど、どういうことなんでしょ。

 とりあえず、当分は部品は壊さないってことにして進めていこうと思います。

chocochoco2010/03/30 08:33はじめまして、chocoと申します。

雫さんの連載?楽しみながら読んでます。
今年は大変そうですね、また再開される日を待ってます。

snowdrops89snowdrops892010/12/27 17:35chocoさまはじめまして。
長らくほったらかしですみません;
今年は、ナデシコも、このページもまったく開かずに終わりそうな気配だったのですが、ふと思いついて開けてみたらコメントがあり、びっくりしました!
せっかくなので、ナデシコをバージョンアップしましたww
来年当たりは、ものすごくさりげなく復帰するかもしれませんので、その際はよろしくですm(_ _)m

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

2009/09/25 (金)

次のメッセージを表示するよ!

| 19:58 | 次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 次のメッセージを表示するよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

【せんせい】

 さてさて、それっぽい画面を表示して音楽まで流れるよーになりました!

【でし】

 でも、これだけじゃゲームとは呼べません。

【せんせい】

 そうですね。

 最低限、先の文章が次々読めるようにならなくては!

 うっかりしがちなことですが(ワタシだけでしょうか;)、次の文章を表示するためには、表示する場所をクリアしなければなりません。でないと、表示されている文章の上に次の文章が表示されてしまい、どんどん重なってひどいことに!( ̄□ ̄;

【でし】

 なるほど。

 他人の失敗談を聞くのは、ホントためになりますねー(笑)

【せんせい】

 キーッ。(ゲシッ)

【でし】

 あ~れ~~~(飛んでった;)

【せんせい】

 ところで、サイコロの時もテキストウィンドウを表示していましたが、あれは、テキストウィンドウのイメージ母艦コピーするだけでクリアできました。

 しかし、度はそうは行きません。何しろ半透明です。

 しかも、背景、立ち絵、テキストウィンドウの順に重なっています。

 テキスト書き換えるたびに、これらの重ね合わせを行いなおすことも考えられますが、場面転換も立ち絵の変更も無い場合の改ページでそれを行うのは、ずいぶん無駄っぽく感じられます。

 何か、いい裏技は無いかにゃーと考えた結果、クイズの時のようにテキストを表示する前の表画面の状態を別に保持しておいて、それを表画面にコピーするのが簡単でよさそうかなと思いました。

 早速試してみましょう!

#-----母艦設計-----------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「アドベンチャー」
母艦を$000000で画面クリア母艦のスタイルは「枠固定」
母艦オフに最大化ボタン有効変更。
母艦のクライアント幅は640。母艦のクライアント高さは480。
母艦中央移動
母艦の可視はオン。
#------------------------------------------------------------

#-----宣言---------------------------------------------------
改ページ待機とは整数オフ。

裏_背景とはイメージの可視はオフ。
裏_背景の幅は640。裏_背景の高さは480。

裏_立ち絵とはイメージの可視はオフ。

裏_テキストウィンドウとはイメージの可視はオフ。
テキストウィンドウXとは整数=0
テキストウィンドウYとは整数=360
テキストウィンドウ幅とは整数=640
テキストウィンドウ高さとは整数=120

カーソル画像とはイメージの可視はオフの幅は24*2。の高さは24。

#カーソルを描く
カーソル画像を$000001で画面クリア文字書体は「MS ゴシック|20|太字」。文字色黒色。
カーソル画像の1,1,23,23へ「▼」を中央,中央で枠内文字描画文字色白色。
カーソル画像の0,0,22,22へ「▼」を中央,中央で枠内文字描画。

処理用1とはイメージの可視はオフ
の幅は24。の高さは24。

セル1とはイメージの可視はオフの幅は24。の高さは24。

セル2とはイメージの可視はオフの幅は24。の高さは24。

ブリンクとはアニメ
のX=640-35。のY=480-35。

表画面とはイメージの可視はオン。
表画面の幅は母艦のクライアント幅。表画面の高さは母艦のクライアント高さ。
表画面のXは0。表画面のYは0。
表画面のマウス押した時は~
  もし、改ページ待機オンならば
    もし、表画面の押されたボタン=左ならば
      テキストウィンドウクリア。

    違えば
      戻る
  違えば
    戻る

保持用とはイメージの可視はオフ。
保持用の幅は母艦のクライアント幅。保持用の高さは母艦のクライアント高さ。

#------------------------------------------------------------


#-----BGM再生------------------------------------------------
#「こぎつね.mid」をBGM再生。
#------------------------------------------------------------

#-----背景を表示---------------------------------------------
裏_背景の画像は「背景1.jpg」
裏_背景を表画面の0,0へ画像コピー。
#------------------------------------------------------------

#-----立ち絵を表示-------------------------------------------
裏_立ち絵の画像は「NAKO.bmp」
裏_立ち絵を表画面の0,0へ画像合成改。
#------------------------------------------------------------

#-----テキストウィンドウを表示-------------------------------
裏_テキストウィンドウの画像は「TXTWIN.bmp」
裏_テキストウィンドウの5,5,630,110を表画面のテキストウィンドウX,テキストウィンドウYへ50で画像部分透過コピー。
#------------------------------------------------------------

#------------------------------------------------------------
表画面を保持用の0,0へ画像コピー。

#------------------------------------------------------------

#-----テキストを表示-----------------------------------------
表画面のテキストウィンドウX+10,テキストウィンドウY+10へ「我輩はNAKOである。  {改行}名前はまだない。{改行}             (え;)」を100でノベルテキスト描画。

#表画面のテキストウィンドウX+10,テキストウィンドウY+10へ「みぃ」を100でノベルテキスト描画。

#------------------------------------------------------------


#-----テキストウィンドウクリア-------------------------------
*テキストウィンドウクリア
  保持用を表画面の0,0へ画像コピー。
  ブリンクを停止。
  改ページ待機オフ。

#------------------------------------------------------------

#-----点滅カーソル表示---------------------------------------
*点滅カーソル

    表画面の640-35,480-35,24,24をセル1の0,0へ画像部分コピー。
    カーソル画像の0,0,24,24を処理用1の0,0へ画像部分コピー。
    処理用1をセル1の0,0へ画像合成改。  
    
    表画面の640-35,480-35,24,24をセル2の0,0へ画像部分コピー。
    カーソル画像の24,0,24,24を処理用1の0,0へ画像部分コピー。
    処理用1をセル2の0,0へ画像合成改。 
    
    ブリンクの画像は「セル1
セル2」
    表示隔は500。
    改ページ待機オン。
#------------------------------------------------------------

#-----BGM停止------------------------------------------------
#7秒待つ。
#BGM停止。
#ブリンクを停止。
#------------------------------------------------------------

#------------------------------------------------------------
# 関数
#------------------------------------------------------------
●BGM再生(Mを)
#    「M」を「BGM」でMCI開く
  V=500  #ボリューム初期値
  「open "{M}" alias {BGM} type mpegvideo」をMCI送信。  #ファイル開く
  「setaudio {BGM} volume to {V}」をMCI送信。  #ボリューム設定
    「play BGM repeat」をMCI送信。    #繰り返し再生

●BGM停止
#    「停止」と言う
  「status {BGM} volume」をMCI送信。V=それ。  #現在のボリュームを取得。
  10                    #繰り返しボリュームをマイナス
    V=V-50。                 #していきフェードアウト
    もし、V≦0ならば、V=0  #0以下を指定するとエラーになる
    「setaudio {BGM} volume to {V}」をMCI送信。
    1秒待つ。
    もし、V=0ならば抜ける。
    「BGM」をMCI停止。
    V=500。  #ボリュームを戻す(戻さないとなぜかサクラが鳴らなくなった!)
    「setaudio {BGM} volume to {V}」をMCI送信。
    「BGM」をMCI閉じる。  #必ず閉じる
#------------------------------------------------------------
●ノベルテキスト描画({グループ=?}OBJのX,YへSを{数値=200}Aで)
  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+(それ文字幅取得)
  点滅カーソル
#------------------------------------------------------------
●画像部分透過コピー({グループ=?}コピー元のX,Y,W,Hを{数値=$00FF00}透過色で{グループ=?}コピー先のX2,Y2へ{数値=50}透明度で)
  処理用をイメージとして作成。処理用の可視はオフ。
  処理用の幅はW。処理用の高さはH。

  #半透明にしたい部分を処理用に移す
  コピー元のX,Y,W,Hを処理用の0,0へ画像部分コピー

  #コピー元の半透明にしたい部分以外をコピー先へ合成
  塗り色は透過色。線色は透過色。線太さは0。
  コピー元のX,YからX+W,Y+Hへ四角。
  コピー元をX,Yでコピー先のX2,Y2へ画像合成改。
  
  #半透明にしたい部分を透過コピー
  処理用をコピー先のX+X2,Y+Y2へ透明度で画像半透明コピー
  
  処理用→壊す。
#------------------------------------------------------------
●画像合成改({グループ=?}Sを{数値=0}X,{数値=0}Yで{グループ=?}DのX2,Y2へ)
 Cとは整数
//マスク画像はSの透過色を黒色それ以外を白色にしたもの
 マスク画像をイメージとして作成
 マスク画像→可視はオフ
 マスク画像→画像はS→名前
 マスク画像のX,Yを画像色取得してCに代入
 マスク画像をCで画像マスク作成
//ソース画像はSの透明色を黒色に変換したもの
 ソース画像をイメージとして作成
 ソース画像→可視はオフ
 ソース画像→画像はS→名前
 マスク画像を画像ネガポジ
 マスク画像をソース画像の0,0へ画像ANDコピー
 マスク画像を画像ネガポジ
//合成実行
 マスク画像をDのX2,Y2へ画像ANDコピー
 ソース画像をDのX2,Y2へ画像ORコピー
 マスク画像→壊す
 ソース画像→壊す
#-----------------------------------------------------------------------
●枠内文字描画({グループ=?}OBJのX,Y,W,HへSをA,Vで)
  xxとは整数。yyとは整数。
  もし、A=左ならば
    xx=X
  違えばもし、A=中央ならば
    xx=X+(W-(Sの文字幅取得))/2
  違えばもし、A=右ならば
    xx=(X+W)-(Sの文字幅取得)
  もし、V=上ならば
    yy=Y
  違えばもし、V=中央ならば
    yy=Y+(H-(Sの文字高さ取得))/2
  違えばもし、V=下ならば
    yy=(Y+H)-(Sの文字高さ取得)
  OBJのxx,yyへSを文字描画。
#------------------------------------------------------------

【でし】

 見事にクリアされましたが・・・

 これで終わり?

 次の文章はー?

【せんせい】

 今日ここまでー。

 プログラムには行き詰ってないけど、シナリオの仕様をどうするか悩み中・・・みたいな?

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