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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0517
teruchiクリックで選択&移動5解決


teruchi

リンク

2015/5/17(Sun) 19:51:03|NO.69248

1年未満の初心者です。以下は左クリックで選択と解除を行い、選択した状態で右クリック
するとその部分のマスに移動するというスクリプトです。その課題はクリアしていますが
同じマスに重複しないようにすることがどうしてもできません。マスの位置の指定方法が
問題だと思うのですが解決方法を教えてください。よろしくお願いします。

size = 50 pitch = 70 linx = 200 liny = 100 buffer 1, size*2, size color 0, 0, 255 : boxf 0, 0, size, size color 255, 0, 0 : boxf size, 0, size*2, size screen 0, 640, 480 : boxf repeat 4 ax(cnt) = 0 + pitch*cnt pos 0 + pitch*cnt, 0 gcopy 1, 0, 0, size, size flag(cnt) = 0 loop repeat 3 color 255, 255, 255 line linx, liny + pitch*cnt, linx + pitch*2, liny + pitch*cnt line linx + pitch*cnt, liny, linx + pitch*cnt, liny + pitch*2 loop *main stick key repeat 4 if key = 256 { if ax(cnt) <= mousex & mousex <= ax(cnt) + size & 0 <= mousey & mousey <= size & flag(cnt) = 0 { pos ax(cnt), 0 gcopy 1, size, 0, size, size flag(cnt) = 1 } else : if flag(cnt) = 1 { pos ax(cnt), 0 gcopy 1, 0, 0, size, size flag(cnt) = 0 } } if key = 512 { repeat 2 if linx + pitch*cnt <= mousex & mousex <= linx + pitch*(cnt + 1) : bx = linx + pitch*cnt + 10 if liny + pitch*cnt <= mousey & mousey <= liny + pitch*(cnt + 1) : by = liny + pitch*cnt + 10 if linx > mousex | mousex > linx + pitch*2 | liny > mousey | mousey > liny + pitch*2 { goto *main } loop if flag(cnt) = 1 { pos bx, by gcopy 1, 0, 0, size, size color 0, 0, 0 boxf ax(cnt), 0, ax(cnt) + size, size flag(cnt) = 2 } } loop await 1 goto *main



この記事に返信する


スペース(HSP歴3年)

リンク

2015/5/17(Sun) 20:10:45|NO.69249

右クリックして移動するときに、そのマスに既にあるかどうかをifで判定すればいいのではないでしょうか?



teruchi

リンク

2015/5/17(Sun) 20:14:55|NO.69250

その「既にあるかどうか」の判断方法が分かりません。
すみません、スペースさん。



FunnyMaker

リンク

2015/5/17(Sun) 20:18:48|NO.69251

横から失礼します。
非常に簡単です。


size = 50 pitch = 70 linx = 200 liny = 100 buffer 1, size*2, size color 0, 0, 255 : boxf 0, 0, size, size color 255, 0, 0 : boxf size, 0, size*2, size screen 0, 640, 480 : boxf repeat 4 ax(cnt) = 0 + pitch*cnt pos 0 + pitch*cnt, 0 gcopy 1, 0, 0, size, size flag(cnt) = 0 flag2(cnt) = 0 // 0,1 // 2,3 //マスの状態を記憶する変数。(0,1) = (free, dominated) loop repeat 3 color 255, 255, 255 line linx, liny + pitch*cnt, linx + pitch*2, liny + pitch*cnt line linx + pitch*cnt, liny, linx + pitch*cnt, liny + pitch*2 loop *main stick key repeat 4 if key = 256 { if ax(cnt) <= mousex & mousex <= ax(cnt) + size & 0 <= mousey & mousey <= size & flag(cnt) = 0 { pos ax(cnt), 0 gcopy 1, size, 0, size, size flag(cnt) = 1 } else : if flag(cnt) = 1 { pos ax(cnt), 0 gcopy 1, 0, 0, size, size flag(cnt) = 0 } } if key = 512 { repeat 2 if linx + pitch*cnt <= mousex & mousex <= linx + pitch*(cnt + 1) : bx = linx + pitch*cnt + 10 if liny + pitch*cnt <= mousey & mousey <= liny + pitch*(cnt + 1) : by = liny + pitch*cnt + 10 if linx > mousex | mousex > linx + pitch*2 | liny > mousey | mousey > liny + pitch*2 { goto *main //ここがまずい。breakした後でmainにgotoするように変えるべき。 } loop ID = (by-liny-10)/pitch*2 + (bx-linx-10)/pitch //右クリックされたマスのID if flag(cnt) = 1 & flag2(ID) = 0 { pos bx, by gcopy 1, 0, 0, size, size color 0, 0, 0 boxf ax(cnt), 0, ax(cnt) + size, size flag(cnt) = 2 flag2(ID) = 1 } } loop await 1 goto *main

とりあえず応急処置した感じです。忙しいので詳しい説明は省きます。コメントみればそこそこわかるかと。

あと、状況の管理方式がマズいので構造を考え直した方がいいでしょう。



スペース(HSP歴3年)

リンク

2015/5/17(Sun) 20:21:24|NO.69252

サンプルを貼りたかったのですが正直プログラムの流れがよくわからず・・・
もう少しコメントなどを詳しく書いていただけると嬉しいです。



teruchi

リンク

2015/5/17(Sun) 20:30:42|NO.69253

FunnyMaker様 ありがとうございます。望みどおりになりました。
なぜそうなるのかはこれからじっくりと検討してみます。
お忙しいところお手数掛けて申し訳ありませんでした。



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