2011/04/02 (土)
選択肢の完成とジャンプコマンド
東日本大震災の被害に遭われた方々には、心よりお見舞い申し上げます。
そんなこんなで、停滞していましたが、これからは日に日に春の日差しが強くなり、お庭仕事も頑張らなきゃならないから、おうちでパソパソプログラムを作ってる場合ぢゃないよ~。
でも、とりあえず、問題の解決はしないとね!
【せんせい】
メッセージ,ちょっと話を聞いてみましょう。 改ページ, 選択肢,2 ,ちょっと名前を聞いてみる,名前聞く ,ガイシャの写真を見せる,写真見せる *名前聞く メッセージ,そこのおじょうさーん。 メッセージ,ちょっと名前を教えてください~♪ 改ページ メッセージ,おばさん「・・・ナンパ?」 改ページ メッセージ,いや・・・あなたぢゃなく(汗) 改ページ ジャンプ,後半へ続く *写真見せる メッセージ,この人物に見覚えありませんかねー? 改ページ メッセージ,おねーさん「さあ・・・見たこと無い顔 メッセージ,ですよ」 改ページ メッセージ,そ、そうですよね・・・ 改ページ ジャンプ,後半へ続く *後半へ続く メッセージ,さて、気を取り直して・・・・
【でし】
なぜかまた、無意味に長くなりましたね~。
【せんせい】
気にしないで!
さて、ラベルはやはり、コマンドなどしか入らないことになっている0列目にしたほうがよいだろうということになりました~。
ちょっとなでしこっぽく、「*」が目印です(笑)
処理はほとんど同じなので、新たに追加したジャンプコマンドについてだけ書きますね。
これは、前回課題として残した、選択肢を経ずに目的のラベルへジャンプさせられるコマンドです。
例によって、コマンド解析の中に追加です。
違えば、もし、コマンドが「ジャンプ」ならば ラベルは「*」 ラベルにシナリオ¥番号,1を追加。 シナリオの0でラベルを0から表検索。 ジャンプ先はそれ。 もし、ジャンプ先=-1ならば 「ラベルがありません」と言う。 終了。 違えば 番号=ジャンプ先+1 テキストウィンドウクリア。 シナリオ解析。
ラベルは文字列。ジャンプ先は整数。別のところで宣言してあります。
特に文字列は、ちゃんと宣言しとかないと、エラーになることが多いみたいですね。
【でし】
ってか、全部ちゃんと宣言しとけばいいんじゃないですか。
【せんせい】
選択肢のほうは、マウス押したとき~のイベントの中に、同様の処理がありますから、同じように書き換えます。
選択肢のコマンドの書式が、ワタシの趣味により若干変わりましたが、単にちょっと入れる列を変えただけなんで、気にしないでw
【でし】
あと、あれじゃないですか?
良いことを言ったら、好感度があがるとか。
【せんせい】
えーっ、それってどうやんの?
とりあえずフラグを立てて、数値を変化させるのはいいとして、ジャンプするときに、それにしたがってジャンプ先が変わったり、出てくる選択肢が変わったりするって話でしょ?(>_<)
【でし】
だって、そーいう要素がないと、ゲームなんてつまらないじゃないですか~。
【せんせい】
名作「か○い○ちの夜」だって、フラグでストーリーが分化するのはたった一箇所だけなんですよ~っ。
2011/03/06 (日)
分岐先へジャンプするよ!
【でし】
今日と言う今日は、選んだ選択肢のストーリーに飛んでいくことができるんでしょうね?
【せんせい】
はいぃ。タイトルにうったているとおりです。
今までは、上から順に一行づつ読んでるだけでしたが、そうも行かないので困ったな、というお話しです;
クリックした選択肢に応じて、条件分岐を使って処理を振り分けるのはクイズでもやりましたが、クイズのように、単に当たりか外れを判定していた場合と違い、選んだ選択肢に応じてストーリーが変化する。つまり、シナリオファイルの任意の行へ処理を移すということは、どこへジャンプするかを示す、ラベルのようなものが必要になります。
そして、そのラベルを検索してその行(正確にはその次の行)から再びシナリオ解析を始める、ということでよいでしょう。
まず、シナリオの選択肢のコマンドをこんな感じに変えてみます。
メッセージ,ちょっと話を聞いてみましょう。 改ページ, 選択肢,2 名前聞く,ちょっと名前を聞いてみる 写真見せる,ガイシャの写真を見せる ラベル,名前聞く メッセージ,そこのおじょうさーん。 メッセージ,ちょっと名前を教えてください~♪ ラベル,写真見せる メッセージ,この人物に見覚えありませんかねー?
選択肢の後ろの「2」は、選択肢の数を表します。
前回まで、選択肢数はプログラムの中で2で決め打ちしていましたが、三択にしたい場合もあるだろうからです。
そして、その次の行から実際の選択肢で「ラベル,選択肢として表示するメッセージ」という書式になっています。
書式変更に伴って、シナリオ解析はこうなりました。
違えば、もし、コマンドが「選択肢」ならば 行数=0 選択肢数=シナリオ¥番号,1 (選択肢数)回 番号=番号+1 ラベル一覧¥(回数-1)=シナリオ¥番号,0 シナリオ¥番号,1を「選択肢」の文字高さ取得*行数へ選択肢表示。 行数=行数+1 選択肢をボタン化。 選択待機=オン
ラベル一覧と言う配列に、ラベル部分を格納しており、クリックすると「ラベル一覧¥(前選択ボタン-1)」で得られます。
表画面のマウス押した時は~ 選択待機ONの時のイベントを以下のようにします。
違えば、もし、選択待機=オンならば もし、前選択ボタン=0でなければ シナリオの1でラベル一覧¥(前選択ボタン-1)を0から表検索。 ジャンプ先はそれ。 もし、ジャンプ先=-1ならば 「ラベルがありません」と言う。 終了。 違えば 番号=ジャンプ先+1 テキストウィンドウクリア。 シナリオ解析。
表検索で得られた行がラベルなので、その下からシナリオ解析を再スタートさせるだけです。
一応、ラベルがなかった場合の処理も加えます。
また、次のラベルに到達したら、その先は読んではいけないので、とりあえずシナリオの最後まで読み込んだ場合と同様に、終了させることにします。
違えば、もし、コマンドが「ラベル」ならば 「おわり」と言う。 終了。
【でし】
ぱちぱちぱち~。
ちゃんと、ジャンプしましたね!
【せんせい】
分岐して、このままそれぞれのエンディングを迎えることもあるでしょうが、会話やイベントのバリエーションを経て、元のルートに戻ってくるということも少なくありません。
選択肢を経ずに、ラベルへジャンプさせられるコマンドも必要です。
あと・・・最大の問題としては、現在は検索するラベルの文字列が、シナリオの配列上、1の列に入っていますが、ここってメッセージでは、実際に表示する色々なメッセージが入る列なんで、何かの弾みでラベルとかぶってしまうことも普通にありえます。
やっぱり、この仕様はよろしくありません。
2011/02/27 (日)
選択肢を選択するよ!
【せんせい】
と言うわけで、今日は選択肢をじっさいに選択できるようにします。
選択肢のマウスオーバー処理は、スマートじゃないかもしれませんが、クイズやちょぼいちのときに作った、マウスオーバーボタン関数を使っちゃおうと思います。
まず、シナリオ解析の選択肢の項目にちょこっと追加。関数を呼び出します。
違えば、もし、コマンドが「選択肢」ならば 行数=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
描画処理反映 【でし】
お~、選択肢にマウスカーソルを合わせると、反転しますね!
とっても、ゲームっぽいです♪
【せんせい】
そして、選択肢をクリックすると、何番目の選択肢をクリックしたかが分かります。
【でい】
っていうか・・・本当に、ただ選択しただけでしたね(汗)
2011/02/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をそのまま表示するってだけのことです。
あ、あと今回、どうも時々あらぬところで点滅カーソルがチラッと現れるなーと思っていたら、改行の際には「ブリンク」つまり点滅カーソルのアニメーションを停止していなかったことが判明(テキストウィンドウクリアの中で停止していたため)
「表画面のマウス押した時は~」の判定内で停止するように直しました。
【でし】
・・・マヂで、単に選択肢を表示しただけでしたね(汗)
【せんせい】
はいぃ~;
2011/02/04 (金)
立ち絵を変更するよ!
【せんせい】
ではでは、この調子で、立ち絵も変更してみます。
まず、メッセージ.csvをこんな感じに!
メッセージ,我輩はNAKOである。 メッセージ,名前はまだない。 改ページ, メッセージ,ここは百合が原公園。 改行, メッセージ,死体発見現場ですw 改ページ, 背景,背景2.jpg メッセージ,背景をへんこうしました。 改ページ, メッセージ,ここは函館カトリック教会。 改行, メッセージ,被害者は、殺される前日に、この付近に メッセージ,立ち寄った形跡があります。 改ページ, 立ち絵,立ち絵2.bmp メッセージ,立ち絵をへんこうしました。 改ページ,
だんだん、シナリオが長くなりますね。
シナリオ解析関数の中に
違えば、もし、コマンドが「立ち絵」ならば 裏_立ち絵の画像はシナリオ¥番号,1 ADV画面合成 番号=番号+1 シナリオ解析
を追加。
プログラム自体は、背景の変更と手順は同じなので、何のことはありませんでしたね。
これで、背景や人物を変えながら、物語を読み進めていくことはできるようになったと思います。
【でし】
でも、これだけじゃゲームとは言えませんよね?
選択肢が出て、どれを選ぶかで物語が変わっていく・・みたいなのがないと。
【せんせい】
そうですね。
2011/01/29 (土)
背景を変更するよ!
【でし】
【せんせい】
仕方ありません;
例年にない豪雪で、雪はねに追われてぐったりなのです~。
【でし】
家に引きこもっているのに、弱っているのを言い訳に、ダラダラすごしているそうですw
【せんせい】
(無視して)
さて、今日は背景を変更したいと思います!
ずっと同じ場所で話が進むってゲームはあまりありませんから、場所が移動すればそれに応じて背景が変わっていくのは、当然のことですよね。
「背景,背景1.jpg」のよーな書式で、指定したファイルを背景に設定することにします。
まず、メッセージ.csvをこんな感じに!
メッセージ,我輩はNAKOである。 メッセージ,名前はまだない。 改ページ, メッセージ,ここは百合が原公園。 改行, メッセージ,死体発見現場ですw 改ページ, 背景,背景2.jpg メッセージ,背景をへんこうしました。 改ページ,
シナリオ解析関数の中に
違えば、もし、コマンドが「背景」ならば 裏_背景の画像はシナリオ¥番号,1 ADV画面合成 番号=番号+1 シナリオ解析
背景を変えた後は、再度全部の画像を重ねあわせなおさないといけないからです。
*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へ画像コピー。
この一文を追加で解決!
ちなみに、ナゾの「無効なポインタ操作」対策で、処理用→壊す。は、コメントにしてます。
【でし】
ところで、画面ですけど、ぱって変わっちゃいますけど、これじゃゲームっぽくないですよぅ。
【せんせい】
トランジョン(?)は、後回し!
簡単なのは、わりと簡単に実装できるはずですが・・・
【でし】
先生にとっては、簡単じゃないってことですね?
【せんせい】
しくしくしく・・・
2011/01/13 (木)
15パズルのバグを直すよ!
突然ですけど、以前作った15パズルに、バグを発見したので、直しておきます。
この部分です。
#-----成績リセット--------------------------------------------- *成績リセット ダイアログタイトルは「成績表リセット」 「リセットしてもいい?」と二択。 もし、それがはいならば (表示順位数*2)回 成績¥回数=空 空を「成績表.txt」へ保存。 #-------------------------------------------------------------
> テキストをクリアするだけなら、空を保存すればいいだけだけど、それだと現在の成績表表示は変わらないので、成績配列の中身も空にしないとね。
なんて書いていながら、それが正常に機能してなかったことが判明なのです;
ちゃんとテストもしてたつもりだったのに、なんでだ・・・(涙)
というわけで、↓のように直しました。
#-----成績リセット--------------------------------------------- *成績リセット ダイアログタイトルは「成績表リセット」 「リセットしてもいい?」と二択。 もし、それがはいならば (表示順位数*2)回 成績¥回数=空 #←ここです 空を「{母艦パス}成績表.txt」へ保存。 #-------------------------------------------------------------
繰り返しの「回」の中身がちゃんとインデントされていなかったのが問題でした。
途中で、変にしてしまったのかも・・・
さてさて、問題の15パズルのソースの全文は、こちら。
http://nadesiko.g.hatena.ne.jp/snowdrops89/20090401/1238587801
2011/01/06 (木)
改行改ページをつけるよ!
【せんせい】
今日は、前回のメッセージ表示に、改行と、改ページの機能をつけようと思います!
【でし】
・・・長い長いブランクを感じさせず、実にさらっと、ものすごく自然に復帰しましたね(汗)
【せんせい】
宇宙旅行へも行こうかと言う時代、1年や2年など瞬きする間の出来事ですよ。
【でし】
はやぶさが無事帰還したとはいえ、宇宙旅行はまだ無理でしょう;
って言うかむしろ、竜宮城で遊びほうけていてふと気がついたら浦島太郎状態・・・
【せんせい】
300年も過ぎ去っていなくて、幸いでした(笑)
さて、気を取り直して改行改ページですよ!
ちなみに、改行とは、文字の表示をいったん止めて、画面を変えずにまた続きを表示することです。
今やってるような、ノベルゲーム系では、あんまり必要じゃないかもしれないですが、画面全体に文字を表示するサウンドノベル系では、必須となりますね
改ページは、前回やったように、今まで表示した文字を消して、新しいメッセージを表示することです。
【でし】
改ページは、もともと実装されてたじゃないですか?
【せんせい】
現状のままでは、一行ごとに勝手に改ページが行われてしまいますが、今回は、通常は連続して表示し、指示があった場合だけ、改ページを行うように改造するのが目的です。
単に、改行改ページっていっても、シナリオを解析して、処理を振り分けるという、一番重要かもしれない部分の基本となるところを作っていくわけですから、甘く見てはいけません!
二次配列の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に戻して改ページの処理を自動で行うようにすれば良いんでしょうけれども・・・
2009/10/04 (日)
本当に次のメッセージを表示するよ!
【せんせい】
仕様に凝るとプログラムが完成しないとゆー格言があるそうです;
というわけで、それはよろしくないのでとりあえず簡単に、次のメッセージを表示する部分のみを実装していきたいと思います!
【でし】
おねがいします!
【せんせい】
手順としては、
①マウスクリックを認識
②テキストウィンドウをクリア
③次のメッセージを表示
となると思います。
①と②にかんしては、前回やったとおりです。
しかし、一度クイズでやっていますが、マウス押された時~ のイベントは、別にマウスが押されるまで処理を止めて待っていてくれるという命令ぢゃないので、イベントを待ちながら、次の命令をどんどんこなしていってくれちゃいます。
だから、メッセージ表示命令は、関数にして、マウス押された時~から呼び出すようにしないといけません。
ほんの数行のメッセージなら、なでしこのデモみたいに、それぞれ別関数にして、順番に呼び出す形でもいいかもしれませんが、ゲームのシナリオでそんなことはやってられませんので、クイズの時と同様、別ファイルにメッセージを用意して、それを一行づつ表示する関数を作ればよさそうです。
【でし】
長い説明でしたが、ようするに、クイズの時の問題設定~出題と、同様な流れなんですよね?
【せんせい】
ぶっちゃけそのとーりです。こういうことを学ぶために、クイズとか、作ってたわけですからねー。というわけで、こうなりました。
まず、以下の内容を、「メッセージ.csv」として同じフォルダに保存。
我輩はNAKOである。 名前はまだない。 (え;) みぃ・・・・
コードは、全部載せるとさすがに長いので、変更したトコだけ。
#------------------------------------------------------------ #マウス入力待ち 表画面のマウス押した時は~ もし、改ページ待機=オンならば もし、表画面の押されたボタン=左ならば テキストウィンドウクリア。 メッセージ表示。 違えば 戻る 違えば 戻る #------------------------------------------------------------ #-----シナリオ開く------------------------------------------- 「メッセージ.csv」を開く。 シナリオはそれ シナリオ行数はシナリオの要素数。 メッセージ表示。 #------------------------------------------------------------ #-----メッセージ表示----------------------------------------- *メッセージ表示 改ページ待機=オフ。 メッセージはシナリオ¥番号,0 番号=番号+1 もし、番号>シナリオ行数ならば、 「おわり」と言う。 終了。 違えば、 表画面のテキストウィンドウX+10,テキストウィンドウY+10へメッセージを100でノベルテキスト描画。 #------------------------------------------------------------
【でし】
おぉ~、先に進みました。
ところで、この内容で、なんで、二次元配列なんですか? クイズと同様にってのは、分かりますが・・・
【せんせい】
今後のことを考えて、こうなっています。
今はメッセージだけですけど、背景や立ち絵の切り替えとか、すべてシナリオとして外に出さなきゃならなくなるはずなので。
あと、本当にとりあえずなので、まだ、一行づつしか表示できないです。
もうちょっと、それらしくしたかったのですが、その前に問題が・・・
以前、言っていた、無効なポインタ操作のエラーが出てとまっちゃう現象が再発です。
やっぱり、部品を壊してるところを、全部コメントにしたら直りました。
前回は、一番最初から発生していたのが、今回は、一回目はいいけど、二回目呼び出されたときに発生するようです。
部品、壊し忘れて問題が出るなら分かるけど、どういうことなんでしょ。
とりあえず、当分は部品は壊さないってことにして進めていこうと思います。
chocoはじめまして、chocoと申します。
雫さんの連載?楽しみながら読んでます。
今年は大変そうですね、また再開される日を待ってます。
snowdrops89chocoさまはじめまして。
長らくほったらかしですみません;
今年は、ナデシコも、このページもまったく開かずに終わりそうな気配だったのですが、ふと思いついて開けてみたらコメントがあり、びっくりしました!
せっかくなので、ナデシコをバージョンアップしましたww
来年当たりは、ものすごくさりげなく復帰するかもしれませんので、その際はよろしくですm(_ _)m
2009/09/25 (金)
次のメッセージを表示するよ!
【せんせい】
さてさて、それっぽい画面を表示して音楽まで流れるよーになりました!
【でし】
でも、これだけじゃゲームとは呼べません。
【せんせい】
そうですね。
最低限、先の文章が次々読めるようにならなくては!
うっかりしがちなことですが(ワタシだけでしょうか;)、次の文章を表示するためには、表示する場所をクリアしなければなりません。でないと、今表示されている文章の上に次の文章が表示されてしまい、どんどん重なってひどいことに!( ̄□ ̄;
【でし】
なるほど。
他人の失敗談を聞くのは、ホントためになりますねー(笑)
【せんせい】
キーッ。(ゲシッ)
【でし】
あ~れ~~~(飛んでった;)
【せんせい】
ところで、サイコロの時もテキストウィンドウを表示していましたが、あれは、テキストウィンドウのイメージを母艦にコピーするだけでクリアできました。
しかも、背景、立ち絵、テキストウィンドウの順に重なっています。
テキスト書き換えるたびに、これらの重ね合わせを行いなおすことも考えられますが、場面転換も立ち絵の変更も無い場合の改ページでそれを行うのは、ずいぶん無駄っぽく感じられます。
何か、いい裏技は無いかにゃーと考えた結果、クイズの時のようにテキストを表示する前の表画面の状態を別に保持しておいて、それを表画面にコピーするのが簡単でよさそうかなと思いました。
早速試してみましょう!
#-----母艦設計----------------------------------------------- !母艦設計=「母艦の可視はオフ」 母艦のタイトルは「アドベンチャー」 母艦を$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を文字描画。 #------------------------------------------------------------
【でし】
見事にクリアされましたが・・・
これで終わり?
次の文章はー?
【せんせい】
プログラムには行き詰ってないけど、シナリオの仕様をどうするか悩み中・・・みたいな?
今日初めて気が付きました(笑)
また素敵な物語が続くのかと思うと、とても楽しみです。
これからも頑張って下さい。
私も自分のページ頑張らないと・・・。
そうなんです、いつの間にか・・・w
でも、ぼちぼちですけれどね。
復帰そうそう、こちらは大雪で雪かきに追われてぐったり(>_<)
プログラムどころじゃ、ありません;;;
ともあれ、素敵な物語?!?!と言えるかどうか分かりませんけれども、またゆるゆるとお付き合いくださいませ。