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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0519
モンスター『シャッキーン』21解決


モンスター

リンク

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 命令を使ったやり方もあります(こっちの方が簡単)。



Ura

リンク

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実行中に次の行に飛ぶには、
どのような命令を使ってやればよろしいですか?
解答をお待ちしております。



jet-ball

リンク

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



jet-ball

リンク

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 に直せば出来ると思います
どうでしょう?



Shinya

リンク

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



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