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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0418
いつき指定の座標で移動量を変化させるカーソル移動16解決


いつき

リンク

2011/4/18(Mon) 21:23:01|NO.38512

こんばんは。
あまり間隔を空けずに質問をして申し訳ないですが、
表題にある通り、指定の座標でカーソル移動量を変化させる動作についてです。
単純にカーソルを十字キーで動かす記述は講座等で勉強してうまくいきましたが、
ある座標で移動量を変化させたい時、条件に現在位置の座標と指定の座標がイコール等とすると、
変化させたい位置の手前から一気に飛んでしまい(条件を2重に達成している?)
どうもうまくいきません。
質問用のサンプルとして下記を用意しました。


screen 0,400,150 cls 4 x=5 ;カーソル初期位置X y=25 ;カーソル初期位置Y mx=33 ;カーソル移動量X my=18 ;カーソル移動量Y mx2=48 ;カーソル移動量X2 repeat redraw 0 color 0,0,0 boxf pos 25,25 color 255,255,255 mes "あ い う え お  は ひ ふ へ ほ" mes "か き く け こ  ま み む め も" mes "さ し す せ そ  や ゆ よ ゛ ゜" mes "た ち つ て と  ら り る れ ろ" mes "な に ぬ ね の  わ を ん おわり" pos x,y mes "→" redraw 1 stick key if key=2&y>25 :y-my ;上 if key=8&y<97 :y+my ;下 if key=1&x>25 :x-mx ;左 if key=4&x<137 :x+mx ;右 if key=4&x=137 :x+mx ;右2(137は「お」にカーソルがある時の座標) wait 1 loop stop
「お」と「は」は1マス分離れているので、「お」の座標にきた時は、
次は移動量を変えて「は」に移動させたいのですが、
「え」からいきなり大移動をしてしまいます。
「右2」の条件は演算子を色々変えて、試してはみたんですが、どうもうまくいきません。
(重複しない様な条件にすればいいのだと解釈してはいるのですが・・・)

どういった記述にすれば良いでしょうか?



この記事に返信する


いつき

リンク

2011/4/18(Mon) 21:57:18|NO.38514

あ、最後の「右2」は

if key=4&x=137 :x+mx2 ;右2(137は「お」にカーソルがある時の座標)
でした。すいません。



hoo

リンク

2011/4/18(Mon) 22:19:13|NO.38515

>「え」からいきなり大移動をしてしまいます。

if key=4&x=137 :x+mx ;右2(137は「お」にカーソルがある時の座標)
この行を実行する前xは幾つ?



いつき

リンク

2011/4/18(Mon) 23:08:03|NO.38516

>hooさん
>if key=4&x=137 :x+mx ;右2(137は「お」にカーソルがある時の座標)
>この行を実行する前xは幾つ?
「え」の位置という事でしょうか?とするならば104です。
実行してデバッグの変数の値を参照して頂ければ。



774

リンク

2011/4/18(Mon) 23:23:00|NO.38517

stick の1行上に

title ""+x
とやれば分かるんじゃねーの?

if の所でカーソルを合わせて F1 を押せば
if 〜 else 〜
の使い方が書かれているから、それを読めば解決できるはず



hoo

リンク

2011/4/19(Tue) 09:20:19|NO.38522

じゃあ
>if key=4&x<137 :x+mx ;右
この行を「真」として実行した後xは?
プログラムは上から順番に忠実に実行するんだぜ。



いつき

リンク

2011/4/19(Tue) 18:01:30|NO.38530

>774
elseの存在は分かっておりましたが、
今回の内容に関して有効利用する記述が思いつかず、
演算子の方で考えておりました。
現在elseで成立する記述を考え中です。

>hooさん
>この行を「真」として実行した後xは?
774さんも書いていますが、xの値はスクリプトを実行すれば調べられます。

>プログラムは上から順番に忠実に実行するんだぜ。
重々承知しています。
だからこそ、現在の記述では「右」「右2」が両方処理されてしまっている(移動量合計も合っているので)
のを回避する為にはどういった記述が良いか、質問させて頂きました。



いつき

リンク

2011/4/19(Tue) 18:02:25|NO.38532

すいません。774さんに「さん」を付け忘れてしまいました・・・。



晩御飯

リンク

2011/4/19(Tue) 18:32:56|NO.38534

(儔修気擦燭ぐ銘屬亮蠢阿ら一気に飛んでしまい(条件を2重に達成している?)

現在の記述では「右」「右2」が両方処理されてしまっている

	if key=4&x<137	:x+mx	;右
if key=4&x=137 :x+mx2 ;右2(137は「お」にカーソルがある時の座標)

if の所でカーソルを合わせて F1 を押せば
if 〜 else 〜
の使い方が書かれているから、それを読めば解決できるはず

この行を「真」として実行した後xは?というのは実際に値を聞いているのではなくて
その出た値に対するあなたの考察を聞いているのではないかと。



たんす

リンク

2011/4/19(Tue) 18:39:46|NO.38535

「右」処理後
・右2条件を満たさない
・右2処理を実行しない
上記どちらかの処理を施せばよろしいかと。



いつき

リンク

2011/4/19(Tue) 19:03:32|NO.38542

>晩御飯さん
なるほど。hooさんの言いたい事をうまく汲めていなかったようです。

>その出た値に対するあなたの考察を聞いているのではないかと。
現在地Xが137より小さければ33移動という事になりますが、
「右2」は104の時点で「右」を処理すると、「右2」の条件も達成してしまいます。
それを回避しようと

if key=4&x<138 :x+mx2 ;右2
こういう事もしていたのですが、やはりダメでした。
結局の所、上から順番に処理されてしまうので、個別に書いた状態で回避するのは
無理なのではという結論に至ってはいますが、elseを使ってこれを回避する記述は
まだ考え付いていません。

>たんすさん
理屈は分かっているのですが、
条件を満たさない記述が思いつかず困っていると言った次第です。
もう少し考えて見ます。



hoo

リンク

2011/4/19(Tue) 19:12:06|NO.38543

>条件を2重に達成している?)
ああ、すまん。

・何故そうなるのかは理解している。
・でもそれを回避する手段が分からない。

ということか。誤解していた。

だったら、たんす氏の言うとおりだがそれが分からないのね。
repeatのヘルプをよく読んでみ。



いつき

リンク

2011/4/20(Wed) 01:11:26|NO.38565

非常に悩みました・・・。何度ギブアップ宣言を出そうと思ったか・・・。
一応解決しました。
以前質問した内容で、stickを再度指示していなかった事により、
挙動がおかしくなった事がありました。
つまり、「stickのkey変数に情報を保持したままだった」事で
ボタンを押していないのに、処理条件を2重に達成していた事に気づきました。

ですので、以下の記述に書き換えてみたら、思ったとおりの動作になりました。
(右下の「おわり」の部分の問題はまだ残っていますが、多分応用でいけると思っています)


screen 0,400,150 cls 4 x=5 ;カーソル初期位置X y=25 ;カーソル初期位置Y mx=33 ;カーソル移動量X my=18 ;カーソル移動量Y mx2=48 ;カーソル移動量X2 repeat redraw 0 color 0,0,0 boxf pos 25,25 color 255,255,255 mes "あ い う え お  は ひ ふ へ ほ" mes "か き く け こ  ま み む め も" mes "さ し す せ そ  や ゆ よ ゛ ゜" mes "た ち つ て と  ら り る れ ろ" mes "な に ぬ ね の  わ を ん おわり" pos x,y mes "→" redraw 1 title ""+x stick key if key=2&y>25 :y-my ;上 if key=8&y<97 :y+my ;下 if key=1&x>25&x!185 { x-mx:stick key };左 if key=4&x<300&x!137 { x+mx:stick key };右 if key=4&x=137 :x+mx2 ;右2 if key=1&x=185 :x-mx2 ;左2 wait 1 loop stop
折角アドバイスとして頂いていたelseやrepeat関連の記述にはなりませんでした。
申し訳ありません。
「処理をさせない」という事をずっと考えていて思い至ったのがこの記述でした。
現時点ではこれで解決としたいと思います。
回答して頂いたみなさん、ありがとうございました。



p、USAGI

リンク

2011/4/20(Wed) 04:11:31|NO.38567

解決されているようですがこうするとどうでしょうか。

if key=4&x<137 { x+mx ;右 } else { if key=4&x=137 : x+mx2 ;右2 }



いつき

リンク

2011/4/20(Wed) 07:23:34|NO.38568

>p、USAGIさん
ああっ!なるほど・・・。
そういうことでしたか。
条件を満たさない場合という事で、
ずっと

if key=4&x<137 :x+mx:else:key=4&x=137:x+mx2 ;右
こんな形で、elseの後に書いていたので、
起動と同時に右に突っ走るという現象が起きてました。
ずっとif命令のヘルプとにらめっこしていたのですが、
elseの後に又ifを入れるという考えに何故か至らなかったようです。
非常に勉強になりました。というか、elseの意味を誤解していた・・・。

ありがとうございました。



たんす

リンク

2011/4/20(Wed) 20:44:11|NO.38582

解決されていますが、

【条件を満たさない例】
上下左右の処理をした後、他の条件を満たさなければよいので、

if key=4&x<137 :x+mx :key=0 ;右 if key=4&x=137 :x+mx2 :key=0 ;右2
移動処理をしたら、変数key(入力状態)を初期化しましょう。


【処理をしない例】
上下左右の処理をした後、他の条件判断をしなければよいので、

if key=4&x<137 :x+mx :wait 1 :continue ;右 if key=4&x=137 :x+mx2 :wait 1 :continue ;右2
Loop以外でRepeat位置に戻りましょう。



いつき

リンク

2011/4/20(Wed) 21:01:17|NO.38583

>たんすさん
ありがとうございます。
今後もじゃんじゃん使っていく命令なので、参考に致します。



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