|
 |
|
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

| |
|
2015/5/17(Sun) 20:10:45|NO.69249
右クリックして移動するときに、そのマスに既にあるかどうかをifで判定すればいいのではないでしょうか?
|
|
2015/5/17(Sun) 20:14:55|NO.69250
その「既にあるかどうか」の判断方法が分かりません。
すみません、スペースさん。
|
|
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
とりあえず応急処置した感じです。忙しいので詳しい説明は省きます。コメントみればそこそこわかるかと。
あと、状況の管理方式がマズいので構造を考え直した方がいいでしょう。

| |
|
2015/5/17(Sun) 20:21:24|NO.69252
サンプルを貼りたかったのですが正直プログラムの流れがよくわからず・・・
もう少しコメントなどを詳しく書いていただけると嬉しいです。
|
|
2015/5/17(Sun) 20:30:42|NO.69253
FunnyMaker様 ありがとうございます。望みどおりになりました。
なぜそうなるのかはこれからじっくりと検討してみます。
お忙しいところお手数掛けて申し訳ありませんでした。
|
|