|
|
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
「;」がついた行を関数でまとめればよさそうですけど、
それだとスパゲッティプログラムになりそうですね。
僕なら外部のテキストファイルに会話文とかをまとめて、
プログラムでそのテキストファイルの指示通りに会話を進めさせる
っていう方法をとりますね。
後者のやり方はいろいろと工夫が必要で大変ですが、
あとから内容を書き足していくのが簡単でいいですよ。
|
|
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
ローカルラベルを使うといいかもしれません。
詳しくはプログラミングマニュアルに書かれています。
|
|
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,<<<スクリプト終了のお知らせ>>>
-----------------
| |
|
2010/4/18(Sun) 11:58:09|NO.32033
気………。
|||orz
|
|
2010/4/18(Sun) 14:11:14|NO.32040
ありがとうございます。できればテキストファイルは使いたくないので、、
色々試してみたいと思います。(*^_^*)
|
|
2010/4/18(Sun) 14:44:07|NO.32042
テキストファイルを使いたくない理由が「テキストファイルだとメモ帳で見えちゃうから」であれば、実行ファイルにするときに #pack で実行ファイルの中に埋め込んでしまい、さらに暗号化もほどこしてあればまず普通には見えません。
他の理由であれば参考にはなりませんが…。
|
|
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
| |
|
2010/4/22(Thu) 19:17:58|NO.32168
え゛、テキストファイルはDPMにできるんでは?
|
|