ノベルゲーム 制限時間(質問掲示板

投稿: Material 185033 3 mini 光楼(114) 投稿:2013/07/02 19:20:02(最新:2013/07/03 23:34:03)
今、初めてノベルゲームを作っています。
内容は制限時間付きのクイズ(何分間で何問解けるか)ですが、どうしてもカウントダウンが終わってから問題と選択肢(case文)が出てきます。
どうすれば左上にカウントダウンを表示しながら他のスクリプトを実行できますか?

カウントダウンを表示するスクリプトはこんな感じ。(開始スクリプト)
def kau()
setBaseTime()
setVariable( "カウントダウン", createText(10, 1, 200, 200))
loop = true #loopをtrueに設定
while loop #loopがfalseになるまでループ

#0埋め
def addZero(n, b)
    l = 0; c = n; r = ""; b = b - 1
    while c > 9
        c = floor(c / 10); l = l + 1
    end
    while l < b
        r = r + "0"; l = l + 1
    end
    r = r + n
    return r
end






def getStringTime_work( time, time_org, force, next_force, intercept_str, div, dig_max, dig_num )
	text = ""
	if force == 1 || ( force == 0 && div <= time_org )
		if div == 0
			div = 1
		end
		dig = floor( time / div ) % dig_max
		text = addZero( dig, dig_num )
		if 0 <= next_force
			text = text + intercept_str
		end
	end
	return text
end

# time : getTime()とかからのミリ秒単位の値
# force_x = 1:数値が0でも表示
# 		0:数値があれば表示
# 		-1:数値があっても表示しない
def getStringTime( time, force_h, force_m, force_s, force_ms )
	text = ""
	time_org = time
	
	div = 1000*60*60	# hour
	text = text + getStringTime_work( time, time_org, force_h, force_m, ":", div, 24, 2 )
	time = time % div
	
	div = 1000*60	# minute
	text = text + getStringTime_work( time, time_org, force_m, force_s, "'", div, 60, 2 )
	time = time % div
	
	div = 1000	# second
	text = text + getStringTime_work( time, time_org, force_s, force_ms, "\"", div, 60, 2 )
	time = time % div
	
	div = 0	# milli second
	text = text + getStringTime_work( time, time_org, force_ms, 0, ".", div, 1000, 3 )
	time = time % div
	
	return text
end


tt= 3000000 - getTime()

str = getStringTime( tt, -1, 1, 1, 1 )






setText( getVariable("カウントダウン"),"残り時間",str) 
if tt < 0
loop=false
deleteText(getVariable("カウントダウン"))
speak("終了!!")
end #if文終わり


end #def文終わり
end #def文終わり(kau())




これがうまくいかなかったスクリプト
kau()
ここにcose文


教えてください、お願いします。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Material 185033 3 mini 光楼(114)(投稿日:2013/07/02 23:36, 履歴)
ダメでした…

「ぷちくいず」基本スクリプト を色々いじってたんですけど思いどおりにならず…すいません。

で、自分で作ってみようということになったのですがやっぱりカウントダウンが終わらないと次に進めません。cose文使ってないのに…

setVariable( "テキスト1", createText(380, 250, 500, 500) )   #場所を設定
setVariable( "カウントダウン", createText(10, 1, 200, 200)) #カウントダウン表示位置    


#----------
ts=3000000
setBaseTime()
setVariable( "カウントダウン", createText(10, 1, 200, 200))
loopt = true #looptをtrueに設定
while loopt #looptがfalseになるまでループ

#0埋め
def addZero(n, b)
    l = 0; c = n; r = ""; b = b - 1
    while c > 9
        c = floor(c / 10); l = l + 1
    end
    while l < b
        r = r + "0"; l = l + 1
    end
    r = r + n
    return r
end






def getStringTime_work( time, time_org, force, next_force, intercept_str, div, dig_max, dig_num )
	text = ""
	if force == 1 || ( force == 0 && div <= time_org )
		if div == 0
			div = 1
		end
		dig = floor( time / div ) % dig_max
		text = addZero( dig, dig_num )
		if 0 <= next_force
			text = text + intercept_str
		end
	end
	return text
end

# time : getTime()とかからのミリ秒単位の値
# force_x = 1:数値が0でも表示
# 		0:数値があれば表示
# 		-1:数値があっても表示しない
def getStringTime( time, force_h, force_m, force_s, force_ms )
	text = ""
	time_org = time
	
	div = 1000*60*60	# hour
    text = text + getStringTime_work( time, time_org, force_h, force_m, ":", div, 24, 2 )
	time = time % div
	
	div = 1000*60	# minute
	text = text + getStringTime_work( time, time_org, force_m, force_s, "'", div, 60, 2 )
	time = time % div
    
	div = 1000	# second
	text = text + getStringTime_work( time, time_org, force_s, force_ms, "\"", div, 60, 2 )
	time = time % div
	
	div = 0	# milli second
	text = text + getStringTime_work( time, time_org, force_ms, 0, ".", div, 1000, 3 )
	time = time % div
	
	return text
end


tt= ts - getTime()

strr = getStringTime( tt, -1, 1, 1, 1 )





setText( getVariable("カウントダウン"),"残り時間",strr) 

if tt < 0

loopt=false
deleteText(getVariable("カウントダウン"))
speak("終了!!")
end #if文終わり


end #ループ終わり


#----------
 
    #入力の取得を始めます
startInput()

#ループし続けるように変数を設定します。
loop = true

#loop変数がtrueの間はループし続けます。
while loop



  #入力が入っているかどうか調べます。
  while hasInput()
    #内部にたまっている入力を処理対象とします。
    takeInput()


    if isKeyDown("1") #キー1が押された場合
      #メッセージを表示します。
      setText( getVariable("テキスト1"), "1" ) #表示する文字

    elsif isKeyDown("A") #キーAが押された場合
      #メッセージを表示します。
      setText( getVariable("テキスト1"), "A" ) #表示する文字
    elsif isKeyDown("E") #キーEが押された場合
      #ループを終了します。
      loop = false

    end
  end

  #入力がないときに無駄に処理をしないように30ミリ秒waitを入れます。
  waitTime(30)
  ts = ts + 30
end

#入力の取得を終了します。
endInput()

#テキスト表示領域を全部消します。
deleteTextAll()


まだ実験段階のため問題文などは無し。

変更したところ。
  • カウントダウンのスクリプトを開始スクリプトからシーンに移動
  • 選択肢からボタンに回答方法を変更





Cdv30200 aoi icon mini aoihikawa(投稿日:2013/07/03 09:06, 履歴)
動作はするものの
意図したとおりにならない場合は
処理の流れを
フローチャートで纏めてみましょう

この記述では

タイムカウント用初期設定
 ↓
タイムカウントのループ開始
 ↓
タイムカウント
 ↓
タイムカウントループ終了
 ↓
入力待ちループ開始
 ↓
入力の判定
 ↓
入力待ちのループ終了

となっていますね

意図した動作は
カウントダウンをしながら
入力の判定をしたいわけですから

ループを統合する必要があるわけです
Cdv30200 aoi icon mini aoihikawa(投稿日:2013/07/03 09:07, 履歴)
あと、関数の定義は
ループ内に入れると
何度も定義するという
無駄な処理となってしまいますので

ループより前に記述するようにします
Material 185033 3 mini 光楼(114)(投稿日:2013/07/03 23:34, 履歴)
なるほど、出来ました!ありがとうございます。
Cdv30200 aoi icon mini aoihikawa(投稿日:2013/07/02 20:15, 履歴)
選択肢を表示する関数を使用した場合、
選択肢の表示中は
スクリプトの実行が停止する仕様です

そのため、
カウントダウンを表示しながら
選択肢を表示する場合、
選択肢を表示するスクリプトを
自作する必要があります

参考
「ぷちくいず」基本スクリプト
Material 185033 3 mini 光楼(114)(投稿日:2013/07/02 21:17, 履歴)
ありがとうございます、なんとか頑張ってみます。
Material 185033 3 mini 光楼(114)(投稿日:2013/07/02 19:26, 履歴)
下から二行目のendはdef文ではなくループのendです。
下から10行目の
tt= 3000000 - getTime()

の3000000は〝ミリ秒〟で50分です。つまり制限時間です。