CoRサンプル集: ハンバーガーセッティング(CoR_重力と当たり判定のテスト)

Gキーで 重力を与える
Bキーで 重力+跳ね返り係数を与える
Vキーで 下方向へ速度を与える
Rキーで ハンバーガーリセット&具のランダムセット
Dキーで デバック表示のオンオフ

当たり判定とか物理シミュレーションとかのテストで作りました
当たり判定のあるお皿に乗らなかったり、
重力で潰れてうまく重ならなかったり、
動き出した後にカーソルを動かすと、
当たり判定がなくなってしまったり、
繰り返しているとフリーズしてしまったり、
いろいろうまくいってません

コード
プレー:167 (人数:40) クリア:0 評価: 16 (2回)
scene 'start' do #カーソルスプライト用 cursor_sprite=nil cursor_layer=nil #お皿のスプライト用 dish_sprite=nil #ハンバーガーのスプライト用 burger_sprite=[nil,nil,nil,nil,nil,nil,nil] #ハンバーガーの具の種類の情報を配列で管理 burger_goods=[3,13,17,19,9,11,14,1] #ハンバーガーのスプライトのレイヤー burger_layer=nil #ボタンスプライト用 button=[nil,nil,nil,nil,nil,nil] #デバッグ用フラグ debug=0 preload do image 'cursor_img', id: 319022 #カーソル image 'goods0', id: 319926 #お皿 image 'goods1', id: 319806 #ここから下はバンズや具やソースの画像 image 'goods2', id: 319807 image 'goods3', id: 319808 image 'goods4', id: 319809 image 'goods5', id: 319810 image 'goods6', id: 319811 image 'goods7', id: 319812 image 'goods8', id: 319813 image 'goods9', id: 319814 image 'goods10', id: 319816 image 'goods11', id: 319817 image 'goods12', id: 319818 image 'goods13', id: 319819 image 'goods14', id: 319820 image 'goods15', id: 319821 image 'goods16', id: 319822 image 'goods17', id: 319823 image 'goods18', id: 319824 image 'goods19', id: 319825 image 'goods20', id: 319826 image 'goods21', id: 319827 image 'goods22', id: 319828 image 'b_g_img', id: 319944 #ここから下はボタン画像 image 'b_b_img', id: 319945 image 'b_v_img', id: 319946 image 'b_r_img', id: 319947 image 'b_on_img', id: 319948 image 'b_off_img', id: 319949 image 'b_ok_img', id: 319916 end create do #皿を配置 dish_sprite = put_sprite 'dish' do position 400, 800 frame_index 0 end # 当たり判定の大きさを設定する dish_sprite.collision_size(400, 90) # 端で跳ね返るようにする dish_sprite.collide_world! dish_sprite.bounce(1.0, 1.0) dish_sprite.movable false #お皿は動かないようにする #バーガーを配置 burger_layer=add_layer #バーガーのレイヤーを作る #ハンバーガーのバンズや具の情報を渡してスプライトを作る i=0 while i < 9 if burger_goods[i] #具がセットされている時スプライトを作る burger_sprite[i]= put_burger(self,400,400-i*60+50,burger_goods[i]) burger_layer.add burger_sprite[i] burger_sprite[i].layer_index i end i=i+1 end #ボタンのスプライトを作る button[0] = put_sprite 'b_g' do position 60, 50 frame_index 0 end button[1] = put_sprite 'b_b' do position 60, 110 frame_index 0 end button[2] = put_sprite 'b_v' do position 60, 170 frame_index 0 end button[3] = put_sprite 'b_r' do position 60, 230 frame_index 0 end button[4] = put_sprite 'b_on' do position 60, 290 frame_index 0 end #カーソルを配置 cursor_sprite = put_sprite 'cursor' do position 50, 0 frame_index 0 end cursor_sprite.start_motion('normal') cursor_sprite.angle 90 cursor_sprite.collide_world! cursor_layer = add_layer cursor_layer.add cursor_sprite end #create do update do # カーソルの速度を(x, y)=(0, 0)にする cursor_sprite.velocity 0, 0 pos = cursor_sprite.position #カーソルの位置情報を取得する # カーソルが移動する処理 if keyboard.down?('LEFT') #左右に動くモーションを設定しているため、スプライトを作り直さないと左右に動けない cursor_sprite.destroy cursor_sprite = put_sprite 'cursor' do position pos[0]-100, pos[1] frame_index 0 end cursor_sprite.start_motion('normal') cursor_sprite.angle 90 cursor_sprite.collide_world! cursor_layer = add_layer cursor_layer.add cursor_sprite wait_time(300) #長押しを防ぐためのwaitTime cursor_sprite.position pos[0]-100, pos[1] end if keyboard.down?('DOWN') wait_time(300) #長押しを防ぐためのwaitTime cursor_sprite.position pos[0], pos[1]+60 end if keyboard.down?('RIGHT') #左右に動くモーションを設定しているため、スプライトを作り直さないと左右に動けない cursor_sprite.destroy cursor_sprite = put_sprite 'cursor' do position pos[0]+100, pos[1] frame_index 0 end cursor_sprite.start_motion('normal') cursor_sprite.angle 90 cursor_sprite.collide_world! cursor_layer = add_layer cursor_layer.add cursor_sprite wait_time(300) #長押しを防ぐためのwaitTime end if keyboard.down?('UP') wait_time(300) #長押しを防ぐためのwaitTime cursor_sprite.position pos[0], pos[1]-60 end #Gを押した時、ハンバーガーに重力を付加する if keyboard.down?('G') || button[0].tap_down? i=0 while i < 8 burger_sprite[i].gravity(nil, 2) i=i+1 end cursor_sprite.position 50, 60 wait_time(300) end #Rキーを押した時、ハンバーガーのスプライトをリセットし具をランダムでセット if keyboard.down?('R') || button[3].tap_down? burger_goods=[3,rand(18)+5,rand(18)+5,rand(18)+5,rand(18)+5,rand(18)+5,rand(18)+5,1] #具番号は22まであり、1~4はバンズのため、上のような書き方をしている i=0 while i < 9 if burger_goods[i] burger_sprite[i].destroy burger_sprite[i]= put_burger(self,400,400-i*60+50,burger_goods[i]) burger_layer.add burger_sprite[i] burger_sprite[i].layer_index i end i=i+1 end cursor_sprite.position 50, 240 wait_time(300) end #Bキーを押した時、重力と跳ね返り係数を付加する if keyboard.down?('B') || button[1].tap_down? i=0 while i < 8 burger_sprite[i].gravity(nil, 2) burger_sprite[i].bounce(1.0, 1.0) i=i+1 end cursor_sprite.position 50, 120 wait_time(300) end #Vキーを押した時、下方向へ速度を与える if keyboard.down?('V') || button[2].tap_down? i=0 while i < 8 burger_sprite[i].velocity(nil, 2) i=i+1 end cursor_sprite.position 50, 180 wait_time(300) end #Dキーを押した時、当たり判定を表示する if keyboard.down?('D') ||button[4].tap_down? if debug < 1 debug=1 else debug=0 end cursor_sprite.position 50, 300 wait_time(300) end #お皿とハンバーガーの各具の当たり判定 #同じレイヤー同士の当たり判定がうまく動かなかったため #7のスプライト同士の全てでの判定を書いている collision dish_sprite, burger_sprite[0] collision burger_sprite[0], burger_sprite[1] collision burger_sprite[0], burger_sprite[2] collision burger_sprite[0], burger_sprite[3] collision burger_sprite[0], burger_sprite[4] collision burger_sprite[0], burger_sprite[5] collision burger_sprite[0], burger_sprite[6] collision burger_sprite[0], burger_sprite[7] collision burger_sprite[1], burger_sprite[2] collision burger_sprite[1], burger_sprite[3] collision burger_sprite[1], burger_sprite[4] collision burger_sprite[1], burger_sprite[5] collision burger_sprite[1], burger_sprite[6] collision burger_sprite[1], burger_sprite[7] collision burger_sprite[2], burger_sprite[3] collision burger_sprite[2], burger_sprite[4] collision burger_sprite[2], burger_sprite[5] collision burger_sprite[2], burger_sprite[6] collision burger_sprite[2], burger_sprite[7] collision burger_sprite[2], burger_sprite[3] collision burger_sprite[2], burger_sprite[4] collision burger_sprite[2], burger_sprite[5] collision burger_sprite[2], burger_sprite[6] collision burger_sprite[2], burger_sprite[7] collision burger_sprite[3], burger_sprite[4] collision burger_sprite[3], burger_sprite[5] collision burger_sprite[3], burger_sprite[6] collision burger_sprite[3], burger_sprite[7] collision burger_sprite[4], burger_sprite[5] collision burger_sprite[4], burger_sprite[6] collision burger_sprite[4], burger_sprite[7] collision burger_sprite[5], burger_sprite[6] collision burger_sprite[5], burger_sprite[7] collision burger_sprite[6], burger_sprite[7] end #update do render do if debug > 0 dish_sprite.show_debug_body i=0 while i < 8 burger_sprite[i].show_debug_body i = i+1 end else end end end start_scene 'start' #カーソルの設定 sprite 'cursor' do image 'cursor_img' origin :center motion 'normal' do #カーソルが左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '-4'}, duration: 300 loop(true) end end #お皿のスプライトの設定 sprite 'dish' do image 'goods0' origin :center end #バーガーの具のスプライトの設定 i=1 while i <23 sprite "goods_sprite_#{i}" do image "goods#{i}" origin :center end i=i+1 end #バーガーを配置するメソッド def put_burger(scene, x, y, i) # バーガーを配置 burger = scene.put_sprite "goods_sprite_#{i}" do #position 400, 600-(i+1*100) position x, y frame_index 0 end # 当たり判定の大きさを設定する burger.collision_size(300, 20) # 元画像が大きいので適当に縮小 #burger.scale 1.0, 1.0 # 重力を与える #burger.gravity(nil, 2) # 跳ね返り係数を与える #burger.bounce(1.0, 1.0) # 端で跳ね返るようにする burger.collide_world! # ランダムに速度を与える #buerger.velocity(0, 0) # 配置したバーガーを返す burger end #ボタンのスプライト sprite 'b_g' do image 'b_g_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_b' do image 'b_b_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_v' do image 'b_v_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_r' do image 'b_r_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_r' do image 'b_r_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_on' do image 'b_on_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_off' do image 'b_off_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end sprite 'b_ok' do image 'b_ok_img' origin :left_top motion 'click' do #左右に動くモーション to params: {x: '+4'}, duration: 300 to params: {x: '0'}, duration: 300 end end
コード一覧
  • start.rb
投稿者:            mini mosmoss 対象Lv1 公開日:2017年05月05日 21:56:37
プレー内容を公開する

違反を通報する

コメントする

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

コメント一覧

コメントはありません。

プレー履歴

プレー履歴はありません。

全てのプレー履歴を見る

新着レビュー

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

全てのレビュー

フォロー/シェア

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

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

リンク

プレイヤー

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

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