HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0417
Law-haKこれらの命令を簡単にするやり方を教えてください。9解決


Law-haK

リンク

2010/4/17(Sat) 22:34:42|NO.32027

どうもHSPはじめて3日目の初心者です。一応ノベルゲームを創ろうと苦心しているのですが
創ってみるとこの辺省けるんじゃないかなぁ?と思う部分が出てきたんですけど、
;の部分あたりはできれば簡単にしたいんですけど、他にも簡単にできる部分とかあったら
教えてください。

screen 0,700,500 : title "会話"
celload "face_alexis_sad.jpg",1  : celload "face_aliasse_serious.jpg",2
x=0 : y=350 : z=400 : n=450
button "次へ",*se1      
pos x,y
celput 1
pos x,n
mes"イテテ、"
mes"ここは何処だ?"
wait 100
pos z,y
celput 2
pos z,n
mes"あっ気がついた?"
stop
*se1
cls
button "次へ",*se2          ;このあたり省けますか?
pos x,y                ;
celput 1                ;
pos x,n                 ;
mes"、、君は?、"             
pos z,y                 ;
celput 2                  ;
pos z,n                  ;
wait 100          
mes "私はエリー"
mes"そしてここは白紙の世界"
stop
*se2
cls                    ;このあたり省けますか?
button "次へ",*se3             ;
pos x,y                   ;
celput 1                  ; 
pos x,n                   ; 
mes"はくしのせかい??"           
pos z,y                   ;
celput 2                   ;
pos z,n                     ;
wait 100                  
mes "そう!"
wait 50 : mes"作者の都合によってできた世界"
*se3



この記事に返信する


たこ

リンク

2010/4/17(Sat) 23:09:28|NO.32028

「;」がついた行を関数でまとめればよさそうですけど、
それだとスパゲッティプログラムになりそうですね。

僕なら外部のテキストファイルに会話文とかをまとめて、
プログラムでそのテキストファイルの指示通りに会話を進めさせる
っていう方法をとりますね。

後者のやり方はいろいろと工夫が必要で大変ですが、
あとから内容を書き足していくのが簡単でいいですよ。



Chokoko

リンク

2010/4/17(Sat) 23:33:08|NO.32029


screen 0,700,500 : title "会話" sdim S,100,100 ;文章の内容 dim Sx,100 ;文章を表示する際のx座標 dim Sy,100 ;文章を表示する際のy座標 dim Swait,100 ;文章を表示したあとのウェイト時間 dim Snext,100 ;文章を表示したあとの処理(0,無し:1,次の画面へ) Sx(Sid) = 0 : Sy(Sid) = 450 : Swait(Sid) = 100 : Snext(Sid) = 0 : S(Sid) = "イテテ、\nここは何処だ?" : Sid++ Sx(Sid) = 400 : Sy(Sid) = 450 : Swait(Sid) = 0 : Snext(Sid) = 1 : S(Sid) = "あっ気がついた?" : Sid++ Sx(Sid) = 0 : Sy(Sid) = 450 : Swait(Sid) = 100 : Snext(Sid) = 0 : S(Sid) = "、、君は?、" : Sid++ Sx(Sid) = 400 : Sy(Sid) = 450 : Swait(Sid) = 0 : Snext(Sid) = 1 : S(Sid) = "私はエリー\nそしてここは白紙の世界" : Sid++ Sx(Sid) = 0 : Sy(Sid) = 450 : Swait(Sid) = 100 : Snext(Sid) = 0 : S(Sid) = "はくしのせかい??" : Sid++ Sx(Sid) = 400 : Sy(Sid) = 450 : Swait(Sid) = 50 : Snext(Sid) = 0 : S(Sid) = "そう!" : Sid++ Sx(Sid) = 400 : Sy(Sid) = 470 : Swait(Sid) = 0 : Snext(Sid) = 0 : S(Sid) = "作者の都合によってできた世界" : Sid++ button gosub "次へ",*se repeat Sid pos Sx(cnt),Sy(cnt) mes S(cnt) wait Swait(cnt) if Snext(cnt) = 1{;次の画面に移るかどうかをチェック flg = 0 repeat if flg = 1 : break;ボタンが押されたらループを抜け出して次の処理へ wait 1 loop color 255,255,255 : boxf : color;画面を白く塗りつぶす } loop stop *se flg = 1 return

配列型変数を使うと管理がしやすいですよ。
画像は考えないものとします。

文字の中にある「\n」とは改行という意味です。



いかろ

リンク

2010/4/18(Sun) 11:02:09|NO.32030

ローカルラベルを使うといいかもしれません。
詳しくはプログラミングマニュアルに書かれています。



SYAM

リンク

2010/4/18(Sun) 11:55:39|NO.32032

・データを別のファイルにしてそこから読み込む
・↑のデータ内に表示位置や自動先送りなどの指示を書き込めるようにしてみる

すると、

・読み込んだものから一行を取り出して表示するところはループで回す

…ということができるようになります。
こうすると、シナリオのデータを書き足していけばスクリプトはまったく変えなくてもいくらでも長いお話ができますね。

以下のサンプルは、スクリプトと別にファイルを自分で用意する必要があります。
scenario.txt という名前でテキストファイルを作って、下のほうにある内容を書き込んでおいてから実行してみてください。

■スクリプト本体

cls 4 color 255,255,255 boxf 0,200,ginfo_winx,218 scenario="" buf="" sdim lbuf, 512 notesel scenario noteload "scenario.txt" index = 0 *MAIN_LOOP // 一行表示 gosub *PUT_1_LINE index++ if(f_end) : stop w = 0 *@ // キー待ち stick k if( k ):goto *MAIN_LOOP if( f_auto ) { // もし自動先送り ON であれば、時間カウントして // 1秒経ってたら次にすすむ. w++ if( w >= 100 ):goto *MAIN_LOOP } wait 1 goto *@b *PUT_1_LINE // // コマンドで設定する内容を初期化. // f_auto = 0 f_end = 0 px = 16 colr = 0 : colg = 0 : colb = 0 // // 読み出したシナリオデータからとりあえず1行読み出す. // noteget lbuf,index if(peek(lbuf,0)=='#') { // もし先頭が "#" だったら無視してもう一行取り出す. index++ goto *PUT_1_LINE } lindex = 0 repeat // // 一行のデータからコマンドまたは本文を // ひとつ取り出す. // (カンマ区切りでひとつ取り出して、行の終わりまできたら // その時取り出したものが本文) // getstr buf, lbuf, lindex, ',' , 512 lindex += strsize if(lindex >= strlen(lbuf)):break // // 行頭に書かれたコマンドを解釈して // それに従った処理をする. // if(buf == "right") { px = 316 } if(buf == "red") { colr = 255 } if(buf == "green") { colg = 255 } if(buf == "blue") { colb = 255 } if(buf == "clear") { color 255,255,255 boxf 0,200,ginfo_winx,218 } if(buf == "auto") { f_auto = 1 } if(buf == "end") { f_end = 1 buf="" } loop // // 一行表示 // color 255,255,255 boxf px,200,px+300,218 pos px,200 color colr, colg, colb mes buf return

■シナリオデータ(scenario.txt)
-----------------
#
# ←で始まる行は無視される.
# 1行ごとにカンマ区切りでコマンドを並べた後に本文を書く.
# right : その行の内容は右に表示される
# auto : その行を表示したあと、操作しなくても1秒で自動的に次の行に進む
# red : 赤成分を255にする
# green : 緑成分を以下略
# blue : 青以下略
# clear : 表示前に左右とも消してから表示する
# end : シナリオを終了する
#
与作が気を切る
auto,red,ヘイヘイホー
right,green,ヘイヘイホー
auto,ヘイヘイホー
right,blue,ヘイヘイホー
end,clear,<<<スクリプト終了のお知らせ>>>
-----------------



SYAM

リンク

2010/4/18(Sun) 11:58:09|NO.32033

気………。
|||orz



Law-haK

リンク

2010/4/18(Sun) 14:11:14|NO.32040

ありがとうございます。できればテキストファイルは使いたくないので、、
色々試してみたいと思います。(*^_^*)



SYAM

リンク

2010/4/18(Sun) 14:44:07|NO.32042

テキストファイルを使いたくない理由が「テキストファイルだとメモ帳で見えちゃうから」であれば、実行ファイルにするときに #pack で実行ファイルの中に埋め込んでしまい、さらに暗号化もほどこしてあればまず普通には見えません。
他の理由であれば参考にはなりませんが…。



maa

リンク

2010/4/19(Mon) 19:43:17|NO.32107

もう解決したみたいですが、構文解析をせず、ラベルも使わない方法で作ってみました。
画面の移動をラベルのジャンプで行う代わりに命令を無視する感じです。
シナリオの行頭にl:と付けるのは少し面倒ですが、エディタの置換を使うと楽です。


//画像関係はテストしてません。 #module message #const global left 10 #const global right 360 #const top 350 #const portraitHeight 100 #const blockWait 100 #deffunc confirm isConfirmed = 1 return #defcfunc notSkipping return (isConfirmed = 0) #deffunc clearMessage color 255,255,255 boxf color 0,0,0 return #deffunc waitConfirmed repeat if isConfirmed { isConfirmed = 0 break } wait 1 loop return #deffunc speaker int _char, int _x wait blockWait //pos _x, top //celput _char pos _x, top + portraitHeight ;メッセージの場所をセット return #global ;シナリオをまとめて書く。このモジュールが長くなる場合、別ファイルにするといいかも #module scenario ;シナリオを書き易いように適当に命令を短くする #define l if notSkipping() ;スキップ時に無視するように #define w waitConfirmed #define c clearMessage #define red color 255,0,0 #define black color 0,0,0 #deffunc scene01 c l: speaker bob, left l: mes "イテテ、" l: mes "ここは何処だ?" l: speaker billy, right l: mes "あっ気がついた?" w:c l: speaker bob, left l: mes "、、君は?、" l: speaker billy, right l: mes "私はエリー" l: mes "そしてここは白紙の世界" w:c l: speaker bob, left l: mes "はくしのせかい??" l: speaker billy, right l{ red : mes "そう!" : black } l: wait 50 l{ red : mes "作者の都合によってできた世界" : black } w:c return #global ;登場人物リスト #enum global bob = 1 #enum global billy screen 0, 700, 500 title "会話" //celload "face_alexis_sad.jpg",bob //celload "face_aliasse_serious.jpg",billy button gosub "次へ", *onNext scene01 stop *onNext confirm return



774

リンク

2010/4/22(Thu) 19:17:58|NO.32168

え゛、テキストファイルはDPMにできるんでは?



ONION software Copyright 1997-2023(c) All rights reserved.