|
|
|
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を指定すればアクセスは可能です。
|
|
2019/5/14(Tue) 23:26:57|NO.87349
不等号は分ける必要があるんですね。理解しました。
沢渡さん、迅速な解答ありがとうございます。
|
|