下画面に四角いボタンをいくつか表示して
そこをタッチすると何か動作する(音が出るとか色が変わるとか)
というプログラムを作ってるんだけど
@MAIN
TOUCH OUT T,X,Y
IF X<50 AND X>90 AND Y<50 AND Y>90 THEN @SUB1
GOTO @MAIN
@SUB1
(他の命令)
GOTO @MAIN
というわけで質問を少し変更させてもらいます。
どこをタッチしたか判定する際に、ボタンをシンプルな四角とかにして
IF X>50 AND X<90 AND Y>50 AND Y<90 THEN @SUB1
とやるくらいしか自分には思いつかないのですが
もっと複雑な形のボタンとか、移動するスプライトをボタンがわりにするとかのときには
この方法では限界がありそうです。
これに関連する命令とかってないでしょうか。
連投すみません。
20面ダイスをふるプログラムを書こうとしたのですが、
一度走らせると大量の結果が吐き出されます。
FOR〜NEXTを入れてもまるでダメ。
このままだとパラノイアをプレイするのに幸福ではありません!
何卒お力添えをお願いします。
以下プログラムです。
@DICE
B=BUTTON(2)
IF B=16 THEN GOTO @RAMDOM
IF B!=16 THEN GOTO @DICE
@RAMDOM
D=RND(21)
IF D=0 THEN GOTO @RAMDOM
PRINT D
GOTO @DICE
ACLS
SPSET 0,127+2048
SPOFS 0,200,120
FOR I=1 TO 2
SPSET I,1194
SPSCALE I,0.25,100
SPROT I,(I AND 1)*90
SPLINK I,0
NEXT
@LOOP
VSYNC
IF BUTTON(2)==16 THEN
SPROT 0 OUT R
FOR I=0 TO 2
SPANIM I,"R",-60,R+360+(I AND 1)*90,0
NEXT
SPSTART
ENDIF
IF BUTTON(0)==0 THEN SPSTOP
GOTO @LOOP
@LOOP
VSYNC
OTX=TX:OTY=TY 'タッチ移動量を知るための比較用に、前にタッチした位置を覚えておく。OldTouchX/Y
TOUCH OUT STTM,TX,TY '現在のタッチ位置を知る
IF STTM==0 THEN GOTO @LOOP 'タッチしてない時は何もしない
IF STTM==1 THEN OTX=TX:OTY=TY 'タッチした瞬間だけは移動させない処理
SPOFS 0 OUT X,Y 'マウスカーソルの現在位置を知る
X=X+TX-OTX 'タッチ移動量分だけ変数X/Yを変化ざる
Y=Y+TY-OTY
IF X<0 THEN X=0 'マウスカーソルが画面外に行きそうなのを矯正する処理ここから
IF X>399 THEN X=399
IF Y<0 THEN Y=0
IF Y>239 THEN Y=239 'ここまで
SPOFS 0,X,Y '結果を元にマウスカーソルの位置を設定する
GOTO @LOOP
使用したコード
--------------------
@START
RTIME=MAINCNT
TIME=0
TEXT$=""
WHILE TIME<1000000
INC TIME
処理
WEND
PRINT MAINCNT-RTIME
---------------------
処理内容(ON〜GOTOの場合)
I=RND(4,4)
ON I GOTO @0,@1,@2,@3
@0:INC TEXT$+"X":GOTO @END
@1:INC TEXT$+"Y":GOTO @END
@2:INC TEXT$+"A":GOTO @END
@3:INC TEXT$+"B":GOTO @END
@END
----------------------
ON+DEFに使用した外部関数CHKNUM
DEF CHKNUM(NUM)
IF NUM==150 THEN RETURN 0
IF NUM==151 THEN RETURN 1
IF NUM==152 THEN RETURN 2
IF NUM==153 THEN RETURN 3
END
INPUT "ファイルメイ:",FILENAME$
UNKNOWN_STR=0
FOR I=0 TO LEN(FILENAME$)-1
CHKSTR$=MID$(FILENAME$,I,1) '1文字だけ取り出して
SCODE = ASC(CHKSTR$) 'アスキーコードに変換して
IF( (SCODE==45) OR
(SCODE==46) OR
(SCODE>=48 AND SCODE<=57 ) OR
(SCODE>=64 AND SCODE<=90 ) OR
(SCODE==95) OR
(SCODE>=97 AND SCODE<=122) )THEN
'OKの場合の処理(必要なし?)
ELSE
'NGの場合の処理
PRINT "NG →" + CHKSTR$
UNKNOWN_STR=1
ENDIF
NEXT
IF(LEN(FILENAME$)==0 OR LEN(FILENAME$)>14 OR UNKNOWN_STR==1)THEN
'ファイル名が不正な場合の処理
ELSE
SAVE "TXT:"+FILENAME$, TXTDATA$
ENDIF
この式で決め打ちされている、176と15という数値の意味が気になりますよね。
試しに(プチコン3号で)、
FOR I=0 TO 190:?I MOD 176<15;:NEXT
を実行してみると、最初と最後が1の連続になり、間に0の連続がある並びになりました。
このことから、この式の意味は、
『迷路の最上段または最下段を作る時は、変数Pの値は1』だろうと読み解きました。
敵を5匹、1匹ずつランダムで動かして自機が触ったら消える用にしたいの
ですがうまくいきません、関係ない敵が止まってしまいます。
どうしたらよろしいのでしょうか?
ACLS
SPSET 100,496
SPCOL 100
DIM X[5]
DIM Y[5]
DIM ED[5]
FOR I=0 TO 4
X[I]=192
Y[I]=112
ED[I]=0
SPSET 0+I,1060
SPOFS 0+I,192,112
SPCOL 0+I
NEXT
@LOOP
GOSUB @MY
GOSUB @TEKI
VSYNC 1
GOTO @LOOP
@MY
B=BUTTON( )
IF B AND 1 THEN PY=PY-1
IF B AND 2 THEN PY=PY+1
IF B AND 4 THEN PX=PX-1
IF B AND 8 THEN PX=PX+1
SPOFS 100,PX,PY
RETURN
@TEKI
FOR I=0 TO 4
IF ED[I]==-1 THEN RETURN
R=RND(4)
IF R==0 THEN VX=0:VY=-4
IF R==1 THEN VX=0:VY=4
IF R==2 THEN VX=-4VY=0
IF R==3 THEN VX=4:VY=0
X[I]=X[I]+VX:Y[I]=Y[I]+VY
SPANIM 0+I,"XY",-16,X[I],Y[I]
IF SPHITSP(100,0+I) THEN GOSUB @ED
NEXT
RETURN
@ED
BEEP 12
ED[I]=-1
SPCLR 0+I
RETURN
GOTO @LOOP
三角関数が分からないなりに自分勝手に考えを続けてみています。
FOR I=0 TO 360
X=100+COS(RAD(I))*50
Y=100+SIN(RAD(I))*50
NEXT
↑これは、よくある三角関数を使って円を描くプログラムで、
変数Iの値が、われわれ人間が普段よく使う角度の値として、
ゼロ度から360度まで1度毎に点を打つ、というものですが、