CoRサンプル集: Rmakeクイズ!
汎用メッセージウィンドウと選択肢ウィンドウが完成したので、そのお披露目としてちょっとしたクイズゲームを作ったぞ!ちょっと難しい問題もあるぞ!ぜひ全問正解を目指してくれたまえ!
関数についての説明:光楼式汎用CoR関数
ソースコードを表示
使いたい方はどうぞ使ってください。
関数についての説明:光楼式汎用CoR関数
ソースコードを表示
使いたい方はどうぞ使ってください。
プレー:46
(人数:36)
クリア:6
評価: 30 (3回)
#■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 光楼式汎用CoR関数 Ver.20210203 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■#
$GameSize = [800, 450] #ゲームの画面サイズ
#■■■■■■■■■■ 塗り潰し関数 ■■■■■■■■■■#
#□□□□□ 素材定義 □□□□□#
#= 塗り潰し用画像 =#
sprite 'color_sprite' do
image 'color_sp'
origin :left_top
end
#□□□□□ 関数定義 □□□□□#
#= 塗り潰し関数用素材設定 =#
def FillingMaterial_Set(id = 325178, ps = 10, cs = 5)
#背景塗り潰し用画像素材
$bgfill_spId = id
$bgfill_parts_size = ps #画像1パーツ当たりのサイズ(px)
$bgfill_clip_size = cs #実際に使うサイズ
# 背景塗り潰し用画像の読込み
image 'color_sp', id: $bgfill_spId
end
#= 塗り潰し =#
#配置座標, サイズ, 色0~, 不透明度0~100, カメラ独立
def filling(x, y, w, h, c, opacity, camera = true)
filsp = put_sprite 'color_sprite' do
src_rect(opacity*$bgfill_parts_size+2, c*$bgfill_parts_size+2, $bgfill_clip_size, $bgfill_clip_size)
position x, y
scale w / $bgfill_clip_size, h / $bgfill_clip_size
if camera
camera_fixed!
end
end
return filsp
end
#■■■■■■■■■■ メッセージウィンドウ関数 ■■■■■■■■■■#
#□□□□□ 初期設定 □□□□□#
#座標xy, ウィンドウサイズwh, テキストサイズ・色・太字・イタリック, 背景不透明度・色, 枠色, 文字行間, 文字表示アニメ間隔
$DefaultValue_message = {:x => 50, :y => $GameSize[1]-150, :w => $GameSize[0]-100, :h => 125, :size => 18, :c => '#FFFFFF', :b => false, :it => false, :bg_opacity => 80, :bg_c => 0, :frame_c => 1, :h_interval => 5, :txt_wait => 10}
#ウィンドウ位置上下左右(-1で自動), テキストサイズ・色・太字・イタリック, 選択肢高さ, 選択マーカー色・不透明度
$DefaultValue_select = {:up => nil, :down => $DefaultValue_message[:y]-10, :left => nil, :right => $GameSize[0]-50, :size => 18, :c => '#FFFFFF', :b => false, :it => false, :slct_h => 18+4, :slct_c => 3, :slct_opacity => 80}
#□□□□□ 素材定義 □□□□□#
#= ▼アイコン =#
sprite 'icon_sprite' do
image 'icon_sp'
origin :left_top
animation 'msg', [0, 1, 2, 3, 4, 3, 2, 1], 5, true
end
#= メッセージテキスト =#
text 'message-text' do
origin :left_top
end
#□□□□□ 関数定義 □□□□□#
#= アイコン用素材設定 =#
def TextWindowIcons_Set(id = 325218)
#各種アイコン素材
$icons_Id = id
# アイコン素材の読込み
image 'icon_sp', id: $icons_Id, frame_size: [32, 32]
end
#= 使用レイヤー設定 =#
def TextWindow_LayerSet(layer)
$TextWindow_layer = layer
end
#= ▼アイコン =#
def msgicon(x, y, w, h)
sp = put_sprite 'icon_sprite' do
position x, y
frame_index 0
scale w / 32, h / 32
camera_fixed!
end
sp.start_animation('msg')
return sp
end
#= ウィンドウ =#
def ms_window(arguments, ofst, fr_w)
#背景の設定
msbg_sprite = filling(arguments[:x], arguments[:y], arguments[:w], arguments[:h], arguments[:bg_c], arguments[:bg_opacity])
#枠の設定
msfr = []
#上
msfr << filling(arguments[:x], arguments[:y], arguments[:w], fr_w, arguments[:frame_c], 100)
#左
msfr << filling(arguments[:x], arguments[:y], fr_w, arguments[:h], arguments[:frame_c], 100)
#右
msfr << filling(arguments[:x] + arguments[:w], arguments[:y], -fr_w, arguments[:h], arguments[:frame_c], 100)
#下
msfr << filling(arguments[:x], arguments[:y] + arguments[:h], arguments[:w], -fr_w, arguments[:frame_c], 100)
return msbg_sprite, msfr
end
#= テキスト表示領域設定 =#
def textarea_set(arguments, ofst, m)
#各行設定
message_sprites = []
text_y = arguments[:y] + ofst #各行のY位置
while text_y+arguments[:size] < arguments[:y]+arguments[:h]-ofst
message_sprite = put_text 'message-text' do
position arguments[:x] + ofst, text_y
font_size arguments[:size]
color arguments[:c]
bold arguments[:b]
italic arguments[:it]
#wordwrap true
#wordwrap_width arguments[:w] - ofst*2
camera_fixed!
end
message_sprites << message_sprite
text_y += arguments[:size] + arguments[:h_interval] #次の行の位置を設定
end
return message_sprites
end
#= 選択肢テキスト表示領域設定 =#
def slcttextarea_set(slct_arguments, ofst, slct)
#各行設定
slct_sprites = []
ofst_h = (slct_arguments[:slct_h] - slct_arguments[:size]) / 2 #テキストY座標オフセット
text_y = slct_arguments[:up] + ofst #各行のY位置
slct.each do |item|
slct_sprite = put_text 'message-text' do
position slct_arguments[:left] + ofst, text_y# + ofst_h
font_size slct_arguments[:size]
color slct_arguments[:c]
bold slct_arguments[:b]
italic slct_arguments[:it]
camera_fixed!
end
slct_sprites << slct_sprite
text_y += slct_arguments[:slct_h] #次の行の位置を設定
end
return slct_sprites
end
#= メッセージウィンドウ表示 =#
def message_print(m, arguments, ofst, fr_w)
#ウィンドウを表示
msbg_sprite, msfr = ms_window(arguments, ofst, fr_w)
#レイヤー設定
$TextWindow_layer.add msbg_sprite #背景
msbg_sprite.layer_index 0
msfr.each do |item| #枠
$TextWindow_layer.add item
item.layer_index 2
end
#テキストの設定 各行設定
message_sprites = textarea_set(arguments, ofst, m)
#レイヤー設定
message_sprites.each do |item| #テキスト
$TextWindow_layer.add item
item.layer_index 3
end
#テキストのアニメーション表示
text_over = false
str_arr = StrSplit(m)
print_text = ''
line = 0
str_arr.each_with_index do |item, i|
if item === "\n"
line += 1
print_text = ''
if line >= message_sprites.size
m = str_arr[i+1..-1].join
text_over = true
break
end
else
print_text += item
message_sprites[line].text print_text
wait_time(arguments[:txt_wait])
end
end
#▼アイコン表示
iconsize = ofst - fr_w - 2
icon_sprite = msgicon(arguments[:x]+arguments[:w]-ofst+1, arguments[:y]+arguments[:h]-ofst+1, iconsize, iconsize)
$TextWindow_layer.add icon_sprite
icon_sprite.layer_index 1
return msbg_sprite, msfr, message_sprites, icon_sprite, text_over, m
end
#= 選択肢ウィンドウ表示 =#
def slct_print(slct, m, arguments, slct_arguments, ofst, fr_w)
#選択肢ウィンドウのサイズを決める
#Y位置・高さ
arguments[:h] = ofst * 2 + slct.length * slct_arguments[:slct_h]
if slct_arguments[:up] == nil
#上側を設定
if slct_arguments[:down] == nil
#下側を自動設定
slct_arguments[:down] = arguments[:y] - 10
end
slct_arguments[:up] = slct_arguments[:down] - arguments[:h]
else
#下側を設定
if slct_arguments[:down] == nil
#自動設定
slct_arguments[:down] = slct_arguments[:up] + arguments[:h]
else
arguments[:h] = slct_arguments[:down] - slct_arguments[:up]
end
end
#X位置・幅
text_maxl = 0
slct.each do |item|
#配列ループで文字の長さ調査
text_l = StrSplit(item.to_s).length
if text_maxl < text_l
text_maxl = text_l
end
end
arguments[:w] = ofst * 2 + text_maxl * slct_arguments[:size]
if slct_arguments[:left] == nil
#左側を設定
if slct_arguments[:right] == nil
#右側を自動設定
slct_arguments[:right] = arguments[:x] + arguments[:w]
end
slct_arguments[:left] = slct_arguments[:right] - arguments[:w]
else
#右側を設定
if slct_arguments[:right] == nil
#自動設定
slct_arguments[:right] = slct_arguments[:left] + arguments[:w]
else
arguments[:w] = slct_arguments[:right] - slct_arguments[:left]
end
end
arguments[:x] = slct_arguments[:left]
arguments[:y] = slct_arguments[:up]
#ウィンドウを表示
msbg_sprite, msfr = ms_window(arguments, ofst, fr_w)
#レイヤー設定
$TextWindow_layer.add msbg_sprite #背景
msbg_sprite.layer_index 4
msfr.each do |item| #枠
$TextWindow_layer.add item
item.layer_index 6
end
#テキストの設定 各行設定
message_sprites = slcttextarea_set(slct_arguments, ofst, slct)
#レイヤー設定
message_sprites.each do |item| #テキスト
$TextWindow_layer.add item
item.layer_index 7
end
#選択肢テキストの表示
slct.each_with_index do |item, i|
message_sprites[i].text item.to_s
end
return msbg_sprite, msfr, message_sprites
end
#選択マーカー作成
#下が機能しないので使わない
def slct_marker(slct_arguments)
mk_sp = filling(999, 999, slct_arguments[:right]-slct_arguments[:left], slct_arguments[:slct_h], slct_arguments[:slct_c], slct_arguments[:slct_opacity])
$TextWindow_layer.add mk_sp
mk_sp.layer_index 5
return mk_sp
end
#選択マーカー表示位置設定
#何故か機能しない
def slct_marker_pos(pos, mk_sp, slct_arguments, ofst)
mk_sp.position slct_arguments[:left], slct_arguments[:up] + ofst + pos * slct_arguments[:slct_h]
return mk_sp
end
#選択マーカー再作成
def slct_marker_re(pos, slct_arguments, ofst, mk_sp = nil)
if mk_sp != nil
mk_sp.destroy
end
mk_sp = filling(slct_arguments[:left], slct_arguments[:up] + ofst + pos * slct_arguments[:slct_h],
slct_arguments[:right]-slct_arguments[:left], slct_arguments[:slct_h],
slct_arguments[:slct_c], slct_arguments[:slct_opacity])
$TextWindow_layer.add mk_sp
mk_sp.layer_index 5
return mk_sp
end
#マウス座標から選択肢を求める
def point_pos(u, d, l, r, h)
Mouse = [pointer.x, pointer.y]
pos_id = -1
if ((l..r) === Mouse[0]) && ((u..d-1) === Mouse[1])
pos_id = ((Mouse[1] - u) / h).floor
end
return pos_id
end
#= メッセージウィンドウ初期値設定と変更 =#
def mswindow_default(args = {})
arguments = $DefaultValue_message.dup
# 引数書換え
args.each do |key, value|
arguments[key] = value
end
return arguments
end
#= 選択肢メッセージウィンドウ初期値設定と変更 =#
def msSlctwindow_default(args = {})
arguments = $DefaultValue_select.dup
# 引数書換え
args.each do |key, value|
arguments[key] = value
end
return arguments
end
#= メッセージウィンドウ制御(本体) =#
def message(m='', args = {}) # 引数はハッシュテーブル
# 初期値設定と変更
arguments = mswindow_default(args)
m = m.to_s
#Zキーが押されているorクリックされていたらtrue
if keyboard.down?('Z') || pointer.down?
waitloop = true
else
waitloop = false
end
#画像用設定
ofst = 12 #枠と文字位置決定用
fr_w = 2 #フレーム幅 2pxに設定
#メッセージウィンドウ表示
msbg_sprite, msfr, message_sprites, icon_sprite, text_over, m = message_print(m, arguments, ofst, fr_w)
#押しっぱなしなら離すのを待つ
while waitloop
if !(keyboard.down?('Z') || pointer.down?)
break
end
wait_time(1)
end
#Zキー押したorクリックされたら終了
while !(keyboard.down?('Z') || pointer.down?)
wait_time(1)
end
#スプライトの削除
msbg_sprite.destroy
icon_sprite.destroy
msfr.each do |item|
item.destroy
end
message_sprites.each do |item|
item.destroy
end
#テキストがメッセージウィンドウに入りきらなかったか
if text_over
message(m, arguments)
end
end
#= 選択肢メッセージウィンドウ制御(本体) =#
def messageWithSelect(slct, m='', args = {}, slct_args = {}) # 引数はハッシュテーブル
# 初期値設定と変更
arguments = mswindow_default(args)
#debug_log "メッセージウィンドウ\n#{arguments}"
slct_arguments = msSlctwindow_default(slct_args)
#debug_log "選択肢ウィンドウ\n#{slct_arguments}"
m = m.to_s
#Zキーが押されているorクリックされていたらtrue
if keyboard.down?('Z') || pointer.down?
waitloop = true
else
waitloop = false
end
#画像用設定
ofst = 12 #枠と文字位置決定用
fr_w = 2 #フレーム幅 2pxに設定
#メッセージウィンドウ表示
msbg_sprite, msfr, message_sprites, icon_sprite, text_over, m = message_print(m, arguments, ofst, fr_w)
slct_pos0 = 0 #選んだ選択肢アドレスを入れる
#選択肢ウィンドウ表示
if !text_over
slctbg_sprite, slctfr, slctmsg_sprites = slct_print(slct, m, arguments, slct_arguments, ofst, fr_w)
#選択マーカーの表示
#mk_sp = slct_marker(slct_arguments)
#slct_marker_pos(3, mk_sp, slct_arguments, ofst)
mk_sp = slct_marker_re(slct_pos0, slct_arguments, ofst)
end
#押しっぱなしなら離すのを待つ
while waitloop
if !(keyboard.down?('Z') || pointer.down?)
break
end
wait_time(1)
end
onepush = false
Mouse = [pointer.x, pointer.y]
slct_pos = slct_pos0
#Zキー押したorクリックされたら終了
while !(keyboard.down?('Z') || (pointer.down? && text_over))
if !text_over
#選択肢の選択
if keyboard.down?('UP')
if !onepush
slct_pos -= 1
if slct_pos < 0
slct_pos = slct.length - 1
end
onepush = true
end
elsif keyboard.down?('DOWN')
if !onepush
slct_pos += 1
if slct_pos >= slct.length
slct_pos = 0
end
onepush = true
end
elsif pointer.down?
#選択中の所でクリックした場合のみ出る
if point_pos(slct_arguments[:up]+ofst, slct_arguments[:down]-ofst, slct_arguments[:left], slct_arguments[:right], slct_arguments[:slct_h]) == slct_pos0
break
end
else
onepush = false
#マウス処理
if Mouse != [pointer.x, pointer.y]
Mouse = [pointer.x, pointer.y]
#マウス座標から選択肢を取得
pos_id = point_pos(slct_arguments[:up]+ofst, slct_arguments[:down]-ofst, slct_arguments[:left], slct_arguments[:right], slct_arguments[:slct_h])
if pos_id != -1
slct_pos = pos_id
end
end
end
#選択変更処理
if slct_pos0 != slct_pos #選択変わってたら処理
slct_pos0 = slct_pos
mk_sp = slct_marker_re(slct_pos0, slct_arguments, ofst, mk_sp)
end
end
wait_time(1)
end
#スプライトの削除
msbg_sprite.destroy
icon_sprite.destroy
msfr.each do |item|
item.destroy
end
message_sprites.each do |item|
item.destroy
end
#テキストがメッセージウィンドウに入りきらなかったか
if text_over
slct_pos0 = messageWithSelect(slct, m, arguments, slct_arguments)
else
#選択肢用スプライト削除
slctbg_sprite.destroy
mk_sp.destroy
slctfr.each do |item|
item.destroy
end
slctmsg_sprites.each do |item|
item.destroy
end
end
#選択肢アドレスを返す
return slct_pos0
end
#■■■■■■■■■■ 文字列操作 ■■■■■■■■■■#
#□□□□□ 関数定義 □□□□□#
#= 文字列分割 =#
def StrSplit(t)
t = t.split('')
new_t = []
counter = 0
t.each_with_index do |item, i|
if counter > 0
counter -= 1
else
if ('a'..'z') === item || ('A'..'Z') === item || ('0'..'9') === item || ('!'..'~') === item || ' ' == item || "\n" == item
new_t << item
else
new_t << t[i..i+2].join
counter = 2
end
end
end
return new_t
end
コード一覧
- start.rb
- 光楼式汎用CoR関数.rb
プレー内容を公開する
プレー履歴
新着レビュー
レビューはまだ投稿されていません。 作品の感想を作者に伝えるためにレビューを投稿してみませんか?
フォロー/シェア