HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0514
HBK接触判定について3解決


HBK

リンク

2019/5/14(Tue) 00:24:25|NO.87335

前のレス(http://hsp.tv/play/pforum.php?mode=all&num=87261)において質問させて頂きました者です。
貰ったスクリプトを一部弄って、下の青い四角がカーソルキーで動くようになっています。


#module ////////////////////////////////////// モジュール #deffunc cube_init // キューブ初期設定 max=100 // 表示最大数 cube_SPEED=7 // 落下スピード cube_SIZEX=50 // 横サイズ cube_SIZEY=10 // 縦サイズ score=0 // スコア dim cube_Flg,max // 存在フラグ dim cube_X,max // 横位置 dim cube_Y,max // 縦座標 return #defcfunc cube_new // 新しいキューブの番号取得 ans=-1 repeat max if cube_Flg.cnt==0:ans=cnt:break     // 未使用キューブがあればその番号を返す loop return ans #deffunc cube_set int id, int _retu // キューブセット cube_Flg.id=1 // キューブを作る cube_X.id=_retu*cube_SIZEX // 横座標セット cube_Y.id=0 // 縦座標セット return #deffunc cube_move // キューブ移動と消去 repeat max pos 100,100:mes ""+score+"" if cube_Flg.cnt==0:continue // 未使用キューブは無視 if cube_Y.cnt>=655:cube_Flg.cnt=0:color 255,255,0:boxf cube_X.cnt,0,cube_X.cnt+cube_SIZEX,700 // ↑画面下に来たキューブを消す、ついでに光る if x+1>=cube_X.cnt>=x-1 & cube_Y.cnt>=650 : score=score+100 // ↑キューブと青四角の接触判定 color 255,0,0:boxf cube_X.cnt,cube_Y.cnt,cube_X.cnt+cube_SIZEX,cube_Y.cnt+cube_SIZEY // ↑キューブ描画 cube_Y.cnt+=cube_SPEED // 存在しているキューブの座標を下げる loop return #global ////////////////////////////////////////////// 初期設定 screen 0,300,700 x=0  // 初期座標X y=650 // 初期座標Y p=50 // 移動量 cube_init // キューブモジュール初期設定 dim note,1000 // キューブデータ 0〜63の数字の羅列 note=0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 ////////////////////////////////////////////// メインループ *main repeat redraw 0:color:boxf color 0,0,255 //青い四角描画 boxf x,y,x+50,y+50  stick key if key&4 : x=x+p if key&1 : x=x-p if x<0 : x=0 if x>250 : x=250 gosub *waku gosub *cube_make cube_move redraw 1 await 17-(cnt\3==0) loop ////////////////////////////////////////////// サブ *waku // 枠線表示 color 255,0,0 line 0,650,300,650 repeat 5,1 line cnt*50,0,cnt*50,700 loop return *cube_make // キューブ設置 if cnt\10:return // 実行頻度を10フレームに1回にする noteEX=note.COUNT repeat 6 if (noteEX&&1)==0:noteEX>>1:continue // 1行ごとにどの列にキューブがあるか判定 id=cube_new() if a==-1:break cube_set id,cnt // キューブセット noteEX>>1 // 説明しづらい loop COUNT++ return

質問は一つです。
赤い四角と青い四角が接触した時に上部に表示されるスコアが加算されるようにしたいです。接触判定は32行目です。
STGの当たり判定に似てると思って色々なサイトを調べて矩形と矩形同士の衝突を真似してみたのですが、上手く行きません。
不等式を変えたり、変数x,yの書く位置を変えたりすると多少描写が変わりますが私の理想とする形にはなりませんでした。
初心者なりにやれることはやったので掲示板に書かせて頂きました。宜しくお願いします。



この記事に返信する


沢渡

リンク

2019/5/14(Tue) 00:56:16|NO.87336

まず一つは、「cube_X.cntがx+1以下でかつx-1以上であるかどうか」を表現するのに
「x+1>=cube_X.cnt>=x-1」という書き方ではいけないので、
「x+1>=cube_X.cnt & cube_X.cnt>=x-1」とする。
それから、モジュール内ではモジュール外の変数にはアクセスできないので、
#moduleと#globalを外し、関数・命令定義部分を飛ばすようにする。
以上を踏まえた上で、こんな感じにしてみました。

goto *main0 #deffunc cube_init // キューブ初期設定 max=100 // 表示最大数 cube_SPEED=7 // 落下スピード cube_SIZEX=50 // 横サイズ cube_SIZEY=10 // 縦サイズ score=0 // スコア dim cube_Flg,max // 存在フラグ dim cube_X,max // 横位置 dim cube_Y,max // 縦座標 return #defcfunc cube_new // 新しいキューブの番号取得 ans=-1 repeat max if cube_Flg.cnt==0:ans=cnt:break     // 未使用キューブがあればその番号を返す loop return ans #deffunc cube_set int id, int _retu // キューブセット cube_Flg.id=1 // キューブを作る cube_X.id=_retu*cube_SIZEX // 横座標セット cube_Y.id=0 // 縦座標セット return #deffunc cube_move // キューブ移動と消去 repeat max pos 100,100:mes ""+score+"" if cube_Flg.cnt==0:continue // 未使用キューブは無視 if cube_Y.cnt>=655:cube_Flg.cnt=0:color 255,255,0:boxf cube_X.cnt,0,cube_X.cnt+cube_SIZEX,700 // ↑画面下に来たキューブを消す、ついでに光る if x+1>=cube_X.cnt & cube_X.cnt>=x-1 & cube_Y.cnt>=650 : score=score+100 // ↑キューブと青四角の接触判定 color 255,0,0:boxf cube_X.cnt,cube_Y.cnt,cube_X.cnt+cube_SIZEX,cube_Y.cnt+cube_SIZEY // ↑キューブ描画 cube_Y.cnt+=cube_SPEED // 存在しているキューブの座標を下げる loop return *main0 ////////////////////////////////////////////// 初期設定 screen 0,300,700 x=0  // 初期座標X y=650 // 初期座標Y p=50 // 移動量 cube_init // キューブモジュール初期設定 dim note,1000 // キューブデータ 0〜63の数字の羅列 note=0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27 ////////////////////////////////////////////// メインループ *main repeat redraw 0:color:boxf color 0,0,255 //青い四角描画 boxf x,y,x+50,y+50  stick key if key&4 : x=x+p if key&1 : x=x-p if x<0 : x=0 if x>250 : x=250 gosub *waku gosub *cube_make cube_move redraw 1 await 17-(cnt\3==0) loop ////////////////////////////////////////////// サブ *waku // 枠線表示 color 255,0,0 line 0,650,300,650 repeat 5,1 line cnt*50,0,cnt*50,700 loop return *cube_make // キューブ設置 if cnt\10:return // 実行頻度を10フレームに1回にする noteEX=note.COUNT repeat 6 if (noteEX&&1)==0:noteEX>>1:continue // 1行ごとにどの列にキューブがあるか判定 id=cube_new() if a==-1:break cube_set id,cnt // キューブセット noteEX>>1 // 説明しづらい loop COUNT++ return



沢渡

リンク

2019/5/14(Tue) 01:02:32|NO.87337

追記です。
「モジュール内からはモジュール外の変数にはアクセスできない」と書きましたが、
関数・命令の定義部分にvarやarrayを指定すればアクセスは可能です。



HBK

リンク

2019/5/14(Tue) 23:26:57|NO.87349

不等号は分ける必要があるんですね。理解しました。
沢渡さん、迅速な解答ありがとうございます。



ONION software Copyright 1997-2021(c) All rights reserved.