1,2タッチをするなら、
IF SPHITRC(SP1,TX,TY,1,1) THEN @HAJIMERU
の部分を、
IF SPHITRC(SP1,TX,TY,1,1) THEN
IF MENUSEL==1 THEN
GOTO @HAJIMERU
ELSE
MENUSEL=1
SPCOLOR SP1,RGB(255,200,200)
SPCOLOR SP2,-1
ENFIF
ENDIF
みたいにするといいかなーと。
1タッチで選択、2タッチ目で起動などを考慮せず、とにかくタッチで起動だけなら、「はじめる」「オプション」のボタンをSPSETした番号をそれぞれSP1,SP2はとすると、
ループ外に
SPCOL SP1
SPCOL SP2
ループ内に、
TOUCH OUT TM,TX,TY
IF TM==1 THEN
IF SPHITRC(SP1,TX,TY,1,1) THEN @HAJIMERU
IF SPHITRC(SP2,TX,TY,1,1) THEN @OPTION
ENDIF
みたいな感じです。
シューティングなんかで言うと、弾や敵が出現しては消えていきますが、それらを全て処理しようとすると、
FOR I=0 TO 511
IF SPUSED(I) THEN ~
IF SHURUI[I]==1 THEN
TAMA_MOVE(I)
ELSEIF ~
~~
NEXT
みたいに毎回多くのループを回して処理する必要があります。
コールバックを使えば、例えば弾を発射した時に、
SPSET 3390 OUT SP
SPFUNC SP,"SPF_TAMA"
のようにして、敵は敵で"SPF_TEKI"などのようにしておけば、あとはループの中で一回だけ
CALL SPRITE
と書けば、勝手にユーザー定義関数(DEF SPF_TAMA)の中身を処理してくれます。
自機 X,Yとして、
メインループ内に、
IF BUTTON(2) AND #A THEN 'Aが押されたら発射
SPSET 3390 OUT SP '弾のグラフィックを空き番号にセット
SPOFS SP,X,Y '初期位置セット
SPFUNC SP,"TAMA_IDOU" '動きのサブルーチン名をセット
ENDIF
CALL SPRITE 'SPFUNCした内容を、設定した全スプライトで実行
メインループの外に、
DEF TAMA_IDOU
DIM TX,TY,SP=CALLIDX 'CALLIDXで、処理するスプライトNoを取得
SPOFS SP OUT TX,TY '今の座標を取得
SPOFS SP,TX,TY-3 '上に移動させて表示
IF TY<-16 THEN SPCLR SP '弾が画面外に出たら消す(SP解放)
END
これをどう短縮するかが、腕の見せ所ですね。
やり方は何種類か考えられますが、例えば、X座標同じものはまずXの値を判定する大きいIF文で囲う、THEN後はユーザー定義関数でまとめる、とか。(DEFは一回だけ書けばよい)
IF X==25 THEN
IF Y==16 THEN KETTEI "ら"
IF Y==18 THEN KETTEI "わ"
ENDIF
DEF KETTEI S$
LOCATE NX,7:?S$
BGMPLAY 255
INC NX
INC NAME$,S$
END