CoRサンプル集: Rmakeクイズ!

汎用メッセージウィンドウと選択肢ウィンドウが完成したので、そのお披露目としてちょっとしたクイズゲームを作ったぞ!ちょっと難しい問題もあるぞ!ぜひ全問正解を目指してくれたまえ!

関数についての説明:光楼式汎用CoR関数
ソースコードを表示
使いたい方はどうぞ使ってください。
プレー:31 (人数:24) クリア: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
コード一覧
投稿者:    mini 光楼(114) 対象Lv1 公開日:2021年02月04日 22:58:02
プレー内容を公開する

違反を通報する

コメントする

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

コメント一覧

コメントはありません。

プレー履歴
  • Material 303531 2 mini mochi3kan: 6問正解しました。
    (02/07 16:51)
  • Cdv30200 aoi icon mini aoihikawa: 5問正解しました。
    (02/06 11:27)
  • Material 204926 1 mini 井戸乃博士: 4問正解しました。
    (02/05 20:58)
  • Rmakeic1 mini muga: 4問正解しました。
    (02/04 23:33)
  •     mini 光楼(114): 10問正解しました。
    (02/04 23:00)

全てのプレー履歴を見る

新着レビュー

レビューはまだ投稿されていません。 作品の感想を作者に伝えるためにレビューを投稿してみませんか?

全てのレビュー

フォロー/シェア

ブログ/Wiki/掲示板で共有する

Rmake内(ブログ/Wiki/掲示板)に貼り付ける場合は以下のタグを利用してください。

リンク

プレイヤー

外部ホームページに貼り付ける

外部ホームページに貼り付ける場合は以下のタグを利用してください。