|
|
2007/5/19(Sat) 12:40:45|NO.8342
はじめまして。
↓のスクリプトでは、横に棒が伸びていくようになっています。
これを、速くして、『シャッキーン』みたいにしたいです。
いろいろ調べているのですがまったく分かりません。
教えてください。
*a
pos x,y
mes "■"
x+10
wait 10
goto *a
stop
|
|
2007/5/19(Sat) 13:43:21|NO.8343
棒が1つ分延びるたびに実行している wait を
if 命令を使って何回かに一回だけ実行するようにするか、
repeat 命令で pos,mes を何回かまとめて実行するようにして見て下さい
他にも boxf 命令を使ったやり方もあります(こっちの方が簡単)。
|
|
2007/5/19(Sat) 15:21:00|NO.8349
単純にwaitを10より下の数値に設定すれば良いのでは…?
的外れ回答だったらすみません。
|
|
2007/5/19(Sat) 16:04:57|NO.8351
とりあえず、wait よりも await の方が向いているかと。
あと、無限ループになってしまっているので、終わりを設けたほうがいいと思います。
X=0
while x<640
;xが640未満の間だけ繰り返す。
redraw 0; 画面の更新停止
repeat 3
; 画面更新せず、3回描く
pos x,y:mes "■"
x+10
loop
redraw 1; 画面の更新
await 10
wend
pos 570,20:mes "終わり"
stop
|
|
2007/5/19(Sat) 16:59:07|NO.8352
サンプルは書かないつもりでしたが
出ちゃったのでまだ出て無い boxf の方のやり方を。
speed=25
takasa=50
repeat 640/speed+1
boxf x,y,x+speed,y+takasa
x+speed
await 17
loop
pos 0,takasa
mes "終わり"
とか
speed=25
takasa=50
repeat 640/speed+1
boxf 0,0,x+speed,0+takasa
x+speed
await 17
loop
pos 0,takasa
mes "終わり"
|
|
2007/5/19(Sat) 18:13:51|NO.8353
ありがとうございます。
それから、まず、1本の線を表示した後、
2本目の線を表示したいと考えています。
やってみましたが、repeatしているので、
次の行に飛べない?んです・・・。
repeat実行中に次の行に飛ぶには、
どのような命令を使ってやればよろしいですか?
解答をお待ちしております。
|
|
2007/5/19(Sat) 20:05:21|NO.8354
break命令でrepeatは抜けられます。
ですが、repeatの回数を指定していれば、
次の行に飛べないということはありません
|
|
2007/5/19(Sat) 21:00:59|NO.8356
そのダメだったコードを載せてくれれば
有効なアドバイスが出来るかもしれません。
|
|
2007/5/19(Sat) 21:47:59|NO.8359
ありがとうございます!!出来ました!!
良く分かりました!!
気になっていろいろ試していたのですが・・・
今度は縦に表示と考えています。
いろいろ変更しているのですが、
『パラメーター式のエラーです。』
となってしまいます。
初歩的な質問ですいませんが、
またよろしくお願いします。
|
|
2007/5/19(Sat) 21:52:32|NO.8360
>じったさん。ご回答くださった皆さん。
いろいろ試していたら↓のスクリプトで出来ました。
ありがとうございました。
引き続き、縦に表示することについて
回答をお待ちしております。
speed=25 ;スピード
takasa=6 ;高さ
x=0 ;横
y=10 ;縦
repeat 640/speed+1
boxf x,y,x+speed,y+takasa
x+speed
await 17
loop
;///////////////////////////////////////////////////////////
speed=25 ;スピード
takasa=6 ;高さ
x=0 ;横
y=30 ;縦
repeat 640/speed+1
boxf x,y,x+speed,y+takasa
x+speed
await 17
loop
|
|
2007/5/19(Sat) 22:40:45|NO.8362
縦の事は置いておいて、
とりあえずインデントの使い方を間違えてます。
インデントとは、コードの先頭位置をずらして書く事で
本来、ループやIF文の『深さ』を見やすくするためのものです。
例えば、『repeat』と、『それに対応する loop』
つまり『ループの開始』と『終了』を同じ書き出し位置に合わせ、
その間に挟まれている命令群は、さらに書き出し位置を右にずらします。
それにより、ループの開始位置と終了位置を照らし合わせるようになります。
あとモンスターさんの方法では、2本ならまだしも、10本・20本となったら
えらい事になってしまいます。
これもループを使うことによって、スッキリさせることが出来ます。
repeat 6 ;←6本線を引くとして・・・
No=cnt
;『何回目のループか?』がシステム変数cntに入る。
;ただ、cntは、別のループにより変化するので、
;他の変数に避難しておく。
speed=25 ;スピード
takasa=6 ;高さ
x=0 ;横
y=10+No*20 ;縦
repeat 640/speed+1;この『repeat』と・・・
boxf x,y,x+speed,y+takasa
x+speed
await 17
loop; ・・・この『loop』が、対になる。
;なので、書き出し位置をそろえる。
loop
|
|
2007/5/19(Sat) 22:46:50|NO.8363
で、縦にする方ですが、これは今までの情報だけで十分に出来るはすですよ。
がんばってください。
|
|
2007/5/20(Sun) 09:36:21|NO.8367
>じったさん
とりあえず↓でできました!!
ありがとうございました!!
いじくり回したので、文法がおかしくなってるかもしれません・・・
この方法で合っていますか?
とりあえず、下に動くんですけど・・・
アドバイスお願いします。
repeat 1 ;線の数
No=cnt
speed=20 ;スピード
takasa=6 ;高さ
x=0 ;横
y=10+No*20 ;縦
repeat 640/speed+1
boxf x,y,x+takasa,y+speed
y+speed
await 17
loop
loop
|
|
2007/5/20(Sun) 09:41:09|NO.8368
8行目訂正
boxf x,x,x+takasa,y+speed
|
|
2007/5/20(Sun) 13:05:05|NO.8372
いい感じですが、もうちょいですね。
speed=20 と takasa=6 はループから出してしまってもいいです。
この場合は一番上に置いときましょう。
それと縦に伸びるようにしたなら、takasa ではおかしいので、
変数名を haba など分かりやすい物にしておきます。
repeat 640/speed+1 というのはウィンドウの横幅をスピードで割って
何回繰り返せば良いかを計算しているので、棒を縦にしたならこの部分も
ウィンドウの高さに変える必要があります。
あと、No変数を同じループ中でしか使って無いので、
No を使う意味が無いです。Noを使う場合は、
boxf No*(haba*2),cnt*speed,No*(haba*2)+haba,cnt*speed+speed //カッコはこの場合なくても良いです
の様にすれば x変数と y変数は使わなくても良いです。
逆に x と y を使うなら、No はなくてもいいです。
最後にインデントについて言うとスペースとタブを混ぜて使わないで
どっちかに統一した方が良いと思います。
|
|
2007/5/20(Sun) 17:45:17|NO.8389
アドバイスありがとうございます。
>speed=20 と takasa=6 はループから出してしまってもいいです。
後から見て分かりやすいように、わざと入れています。
ややこしくてすいません・・・。
>インデントについて言うとスペースとタブを混ぜて使わないで
コピーして貼り付けてから入力したので、このようになってしまいました。
>boxf No*(haba*2),cnt*speed,No*(haba*2)+haba,cnt*speed+speed
もう少し簡単に出来ないでしょうか。
x と y を使いたいです。
詳しく教えてください。
お願いします。
repeat 10 ;線の数
No=cnt
speed=20 ;スピード
haba=6 ;幅
x=0 ;横
y=10+No*20 ;縦
repeat 480/speed+1
boxf x,x,x+haba,y+speed
y+speed
await 17
loop
loop
|
|
2007/5/20(Sun) 18:14:01|NO.8391
>boxf No*(haba*2),cnt*speed,No*(haba*2)+haba,cnt*speed+speed
>もう少し簡単に出来ないでしょうか。
慣れてくると変数が少なくてすむのでこっちのほうが楽だということです。
慣れるといってもこのくらいならすぐですよ。
|
|
2007/5/20(Sun) 18:51:15|NO.8394
> x と y を使いたいです。
> 詳しく教えてください。
そういう事ならば、Noは意味が無いので
No=cnt の部分を消して、No が使われていた所を cnt に直します。
そして棒を1つ表示し終えるごとに棒の位置を右に移動させるので
x=0 の部分を x=cnt*haba*2 などに変えます。(どれだけ移動するかによって変わる)
さらに棒の伸び始める位置は必ず一番上からなので(この場合)
y=10+No*20 を y=0 に書き換えます。
最後に
> boxf x,x,x+haba,y+speed
ではおかしいので、boxf x,y,x+haba,y+speed に直せば出来ると思います
どうでしょう?
|
|
2007/5/20(Sun) 19:54:10|NO.8396
>もう少し簡単に出来ないでしょうか。
簡単かどうかは分かりませんが、リピートルーチンを一つにする方法があります。
repeat y
repeat x
loop
loop
↓
loop A
loop
他の方法と比べ分かり難いなら、バトンタッチします。
>x と y を使いたいです。
x, y を使ってみました。
// ボールの初期座標
x0 = 0
y0 = 0
// ボールの大きさ
bsize = 10
// 線と線の間隔
h = 36
// ボールの大きさ + 間隔
s = bsize + h
// 四角形の面積 ÷ ボールの大きさ ÷ (ボールの大きさ + 間隔)
Dx = (ginfo_winx - x0) * (ginfo_winy - y0) / bsize / s
// はみ出し部分を配慮 ( ボールの大きさと間隔が大きすぎると意味無し )
Dx += Dx/bsize\(ginfo_winx - x0) + Dx/bsize\(ginfo_winy - y0)
repeat Dx
x = cnt*bsize \ (ginfo_winx - x0) + x0
y = cnt*bsize / (ginfo_winx - x0) * s + y0
; title "x = " + x + " : y = " + y + " : cnt = " + cnt
boxf x, y, x+bsize, y+bsize
x = cnt*bsize / (ginfo_winy - y0) * s + x0
y = cnt*bsize \ (ginfo_winy - y0) + y0
; title "x = " + x + " : y = " + y + " : cnt = " + cnt
boxf x, y, x+bsize, y+bsize
await 10
loop
end
|
|
2007/5/21(Mon) 09:13:20|NO.8407
おはようございます。
ハテナさんの
> そういう事ならば、Noは意味が無いので
> No=cnt の部分を消して、No が使われていた所を cnt に直します。
確かに、このプログラムにおいては、No=cntはあまり意味がありません。
ただ、stat や cnt のようなシステム変数は、基本的に保持して計算内に使うような
クセをつけない方が良いかな?・・・と日ごろ思っていたもので。
モンスターさん向けに解説しておきますと、
システム変数って言う物は、特にユーザーが定義しなくても
特定の命令が実行された時に、HSPによって値が代入される変数です。
例えば cnt は、
repeat〜loop の命令時に、ループの回数が入ります・・・が、
repeat 10
命令
repeat 5
命令
loop
loop
の様に、repeat〜loopが二重になったりした場合、
1番目のrepeatの後と2番目のrepeatの後で、cntの値は変わってしまいます。
その辺が理解できたうえで、cntを計算式に使うのは問題ありませんが、
repeatのすぐ後で別の変数に避難しておけば、より安全ではあります。
|
|
2007/5/21(Mon) 13:38:45|NO.8409
今までの流れで、縦線にしたいなら
repeat 10 ;線の数
speed=20 ;スピード
haba=6 ;幅
x=30+cnt*20 ;横
y=0 ;縦
repeat 480/speed+1
boxf x,y,x+haba,y+speed
y+speed
await 17
loop
loop
で、いいですよ。
N08389 のモンスターさんのコードは惜しかったです。
x=0 ;横
y=10+No*20 ;縦
・・・は、横線用の初期設定ですね。
縦線なんですから、
y は初期値=0 にしなくちゃ、上に隙間が空いちゃうし
x は、何本目か?によって位置を変えないと、毎度毎度同じところに線を引いちゃいます。
|
|
2007/5/21(Mon) 17:46:32|NO.8410
モンスターです。
出来ました!!
すごく丁寧に教えてくださり、ありがとうございます!!
良く分かりました!!
それで...2つを合わせると、
↓のような網目が出来上がるんですよね?
いろいろと勉強になりました。
ありがとうございました!!
repeat 40 ;線の数
speed=2000 ;スピード
haba=6 ;幅
x=10+cnt*20 ;横
y=0 ;縦
repeat 480/speed+1 ;画面サイズ
boxf x,y,x+haba,y+speed
y+speed
await 17
loop
loop
repeat 40 ;線の数
speed=2000 ;スピード
takasa=6 ;高さ
x=0 ;横
y=10+cnt*20 ;縦
repeat 640/speed+1 ;画面サイズ
boxf x,y,x+speed,y+takasa
x+speed
await 17
loop
loop
|
|