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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1222
ぜろ移動速度が変わらなくなってしまいました。2解決


ぜろ

リンク

2016/12/22(Thu) 06:33:08|NO.77684

移動速度 という変数を買えると黒い箱の移動速度が速く、または遅くなるはずなのですが、プログラムを書いている間にいつのまにか変わらなくなってしまいました。自分では理由がわからないので、わかるかたいませんか。変数移動速度を6以上にするとプログラムを実行したときに止まってしまいます。

//ボンバーマンのようなステージ
箱のサイズ=20
screen_x = 箱のサイズ*10//掛ける数は必ず偶数にする
screen_y = 箱のサイズ*10
screen 0,screen_x,screen_y
control = 0


blackbox_x_p = 0;黒箱の左上座標、黒箱は動かせる
blackbox_y_p = 0

//一番左上の赤箱の左上座標は

dim redbox_x_p,((screen_x/箱のサイズ)/2)-1
for a,0,((screen_x/箱のサイズ)/2)-1
redbox_x_p(a) = 箱のサイズ+1+(2*a*(箱のサイズ+2));赤箱の左上座標、赤箱は動かさない 一番右の数字が赤箱の間の空間
next
dim redbox_y_p,((screen_y/箱のサイズ)/2)-1
for b,0,((screen_y/箱のサイズ)/2)-1
redbox_y_p(b) = 箱のサイズ+1+(2*b*(箱のサイズ+2));赤箱の左上座標、赤箱は動かさない
next

移動速度 = 1 ;衝突判定を飛び越さないようにする工夫が必要

*main
redraw 0 ;仮想画面
color 255,255,255
boxf 0,0,1000,1000

gosub *black_box
gosub *red_box

color 0,0,0
pos 100,0
mes mousex
pos 150,0
mes mousey


redraw 1 ;実際の画面
await 10

goto *main


*black_box

color 0,0,0;黒を指定
boxf blackbox_x_p,blackbox_y_p,blackbox_x_p+箱のサイズ,blackbox_y_p+箱のサイズ;黒箱を表示

gosub *黒箱の移動 ;入力受付

return

*red_box
for b,0,((screen_x/箱のサイズ)/2)-1
for a,0,((screen_x/箱のサイズ)/2)-1
color 255,0,0;赤を指定
boxf redbox_x_p(a),redbox_y_p(b),redbox_x_p(a)+箱のサイズ,redbox_y_p(b)+箱のサイズ;赤箱を表示
next
next
return

*collision
for a,0,((screen_x/箱のサイズ)/2)-1
for b,0,((screen_x/箱のサイズ)/2)-1
if redbox_x_p(a)-箱のサイズ <= blackbox_x_p & blackbox_x_p <= redbox_x_p(a)+箱のサイズ {
//上から当たる場合
if blackbox_y_p+箱のサイズ == redbox_y_p(b) {
blackbox_y_p--
}
//下から当たる場合
if blackbox_y_p == redbox_y_p(b)+箱のサイズ {
blackbox_y_p++
}
}
if redbox_y_p(b)-箱のサイズ <= blackbox_y_p & blackbox_y_p <= redbox_y_p(b)+箱のサイズ {
//右から当たる場合
if blackbox_x_p == redbox_x_p(a)+箱のサイズ {
blackbox_x_p++
}
//左から当たる場合
if blackbox_x_p+箱のサイズ == redbox_x_p(a){
blackbox_x_p--
}
}
//画面から出ないようにするための衝突判定
if blackbox_x_p < 0 : blackbox_x_p++
if blackbox_x_p + 箱のサイズ > screen_x : blackbox_x_p--
if blackbox_y_p < 0 : blackbox_y_p++
if blackbox_y_p + 箱のサイズ > screen_y : blackbox_y_p--
next
next
return

*黒箱の移動
stick control,15;入力受付 1増やすごとに衝突の判定をしないと飛び越してしまう
if control==1{
for a,0,移動速度;移動速度に入れた数値の回数繰り返す
blackbox_x_p--;left
gosub *collision
next
}
if control==2{
for a,0,移動速度
blackbox_y_p--;up
gosub *collision
next
}
if control==4{
for a,0,移動速度
blackbox_x_p++;right
gosub *collision
next
}
if control==8{
for a,0,移動速度
blackbox_y_p++;down
gosub *collision
next
}
return



この記事に返信する


掘木

リンク

2016/12/22(Thu) 08:23:13|NO.77685

これがパッと分からないからスコープが無い言語は注意するべきことが増えるんや。
これが数百行レベルならなんてこと無いけど十万オーダーでこんなのが起こると何日潰れるか。。

原因:移動用に利用されている繰り返し変数がサブルーチンで書き換えが発生している

モジュール内外問わず、変数を用意すればそれはプログラム上のどこからでも参照、改変できる事を気に留める必要があります。
短い名前の変数は特に重複リスクを高めます。

原則、変数は用途に合わせたユニークなものを割り当てましょう。



ぜろ

リンク

2016/12/22(Thu) 09:16:38|NO.77686

いわれたとおりにしたら解決しました。ありがとうございました。



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