bgmsetd 128,@mml
BGMPLAY 128
WAIT 300
@mml
data ":0 v100q91o5l8c e q93l4d b g q91l8a g q93l4g f f q91<l8a "
DATA "b q93>l4c a f q91l8g f q93l4e d d q91<l8b >c "
DATA "q93l4d q91l8g a q93l4b q91l8a f q93l4e q91l8a b"
DATA "q93l4b q91l8b a q93l4d >c <b a q63l2.g q94l4.g q91l8g"
DATA "q93l4b g q94l4.a q91l8a q70l2a l4.a q91l8a "
DATA "q93>l4c <a q94l4.b q91l8b q70l2b l4.b q91l8b q93>l4d "
DATA "<b q94>l4.c q91l8c q94l4.c q91<l8b a q54l2^4.d"
と入力したのですが、illegal mml と表示されてしまいます。
古典的な方法としては、
X座標・Y座標・状態・移動ベクトルなど、の4つを登場キャラ数分配列宣言しておいて
for〜next内で処理するのが簡単かと。
例)
for i=0 to 9 ”10キャラ分
if st(i)==1 then gosub @tekimove ”st()=状態用。0=停止・1=移動中
next
:
@tekimove ”v()=移動ベクトル用。移動パターン数分用意。
on v(i) gosub @移動パターン1,@移動パターン2,@移動パターン3・・
return
ACLS:CLEAR:SC=130
SPSET 0,130,0,0,0,1
SPANIM 0,2,8:JF=1
@LOOP
VSYNC 1
B=BUTTON()
IF !!(B AND 16)AND !JF THEN MV=-7:JF=1:BEEP 8
MV=(MV+0.3)*JF
PY=PY+MV
IF B AND 4 THEN PX=PX-4:SC=132
IF B AND 8 THEN PX=PX+4:SC=128
IF PX<-16 THEN PX=256
IF PX>256 THEN PX=-16
IF PY>176 THEN PY=176:JF=0:BEEP 9
SPCHR 0.SC
SPOFS 0,PX,PY
GOTO@LOOP
CLEAR
DIM BGDATA(64*64,4)
LOAD"SCU0U:***"
BGPAGE 0
FOR I=0 TO 64*64-1
BGREAD(0,I%32,I/32),CHR,PAL,H,V
BGDATA(I,0)=CHR
BGDATA(I,1)=PAL
BGDATA(I,2)=H
BGDATA(I,3)=V
NEXT
これでチップデータを受け取ってあとはKEY$とかに書きだしてプログラムに書き込めばおk
例えば、草原=0、土=1、岩=2、壁=3と決め、
壁壁壁壁壁壁壁壁
壁土土土土土土壁
壁土岩岩土岩土壁
壁土土草草土土壁
壁土草草草草土壁
壁草草草草草草壁
壁壁壁壁壁壁壁壁
このようなマップを作るとします。すると、データ文では、先ほど決めたルールにそって入力していきます。
DATA 33333333
DATA 31111113
DATA 31221213
DATA 31100113
DATA 31000013
DATA 30000003
DATA 33333333
こうなります。
次に、READ命令でDATA文の内容を受け取ります。
DIM MAPDATA$(7)
FOR I=0 TO 6
READ MAPDATA$(I)
NEXT
これで変数にマップデータが入りました。
次にX座標、Y座標の指定した所のデータを読み取ってみます。
X座標は文字列の位置(30110103)のX番目の文字=MID$関数で取り出し。
Y座標はお分かりの通り変数MAPDATA$(Y←これです。)
つまり、
D$=MID$(MAPDATA$(Y),X,1)
これでD$に指定座標の情報が入ります。
あとはこれでBG敷いたりします。
実際にはこんな単純ではありませんが・・・
アナログ時計の時針について質問です
アナログ時計を作っているのですが秒針分針はできたのですが
時針は午後1時(13)になると止まってしまいます。
この13時を1時に変換できないでしょうか?
まだ改善点は色々ありますがお願いします
以下時針サンプル
GPAGE 0
CLS
@LOOP
GCLS
A = VAL(MID$(TIME$,0,2))
H = 30*A
H = RAD(H) ここで13を渡してしまってOUT OF RANGE
X = 100*COS(H)
Y = 100*SIN(H)
GLINE 100,100,X+50,Y+50,4
WAIT 1
GOTO @LOOP
>>158
別の板で言ってたキャラの当たり判定ですが、前述したとおりスプライト同士ならできます(SPHIT関数)が、BGにあたったかは自分でプログラムを組むしかないです。
IF X>BLOCKX AND X<=BLOCKX+15 AND Y>BLOCKY AND Y<=BLOCKY+15 THEN
みたいな感じで。
>>234
補足
IF A==・・・
を覚えたら
IF A<=10 THEN PRINT A ELSE BEEP
これは
もし変数Aが10より小さかったら変数Aを表示それ以外だったらBEEP
です。
IF A>=1 THEN PRINT A ELSE BEEP
これは
もし変数Aが1より大きかったら変数Aを表示それ以外だったらBEEP
です。
ほかにも
IF A!=1 THEN BEEP ELSE PRINT"ヘンスウAノカズハ1!”
もし変数Aが1以外だったらBEEP 1だったらPRINT〜です。
!はプチコンでは真偽反転という意味があります。
まぁこれを理解できたら覚えましょう(殴
僕から言えることは以上です。
ACLS:CLEAR:SYSBEEP=0
BGMSTOP:TALKSTOP
@LOOP
VSYNC 1
LOCATE X,Y:?"↑"
B=BUTTON()
IF B AND 1 THEN Y=Y-1
IF B AND 2 THEN Y-Y+1
IF B AND 4 THEN X=X-1
IF B AND 8 THEN X=X+1
IF X<0 THEN X=0
IF X>31 THEN X=31
IF Y<0 THEN Y=0
IF Y>23 THEN Y=23
LOCATE X,Y:?"↑"
GOTO @LOOP
>>331
ご指摘ありがとうございます。
ACLS:CLEAR:SYSBEEP=0
BGMSTOP:TALKSTOP
@LOOP
VSYNC 1
LOCATE X,Y:?" "
B=BUTTON()
IF B AND 1 THEN Y=Y-1
IF B AND 2 THEN Y-Y+1
IF B AND 4 THEN X=X-1
IF B AND 8 THEN X=X+1
IF X<0 THEN X=0
IF X>31 THEN X=31
IF Y<0 THEN Y=0
IF Y>23 THEN Y=23
LOCATE X,Y:?"↑"
GOTO @LOOP
@LOOP
VSYNC 1:GCLS
B=BUTTON()
IF B AND 1 THEN Y=Y-1
IF B AND 2 THEN Y=Y+1
IF B AND 4 THEN X=X-1
IF B AND 8 THEN X=X+1
SPHOME 0,-X,-Y
SPOFS 0,X,Y;16
GOTO @LOOP
>>352
WAIT 1
PB=BUTTON()
IF (PB AND 1) AND ATU!=1 THEN PY=PY-1:PMUKI=30
IF (PB AND 2) AND ATS!=1 THEN PY=PY+1:PMUKI=26
IF (PB AND 4) AND ATH!=1 THEN PX=PX-1:PMUKI=28
IF (PB AND 8) AND ATM!=1 THEN PX=PX+1:PMUKI=24
S=S+1
IF S>10 THEN PMUKI=PMUKI+1
IF S==20 THEN S=0
SPSET 0,PMUKI,2,0,0,2,16,16
SPOFS 0,PX,PY
PMUKI=PMUKI-PMUKI%2
ATU=0:ATS=0:ATH=0:ATM=0:ATAI=0
FOR ATAY=0 TO 2
FOR ATAX=0 TO 2
IF ATAX==0 AND ATAY==0 THEN @ATASK
IF ATAX==2 AND ATAY==2 THEN @ATASK
IF ATAX==2 AND ATAY==0 THEN @ATASK
IF ATAX==0 AND ATAY==2 THEN @ATASK
IF ATAX==1 AND ATAY==1 THEN @ATASK
ATAI=ATAI+1
PATX(ATAI)=FLOOR(PX/8)+ATAX
PATY(ATAI)=FLOOR(PY/8)+ATAY
BGREAD(1,PATX(ATAI),PATY(ATAI)),CHR(ATAI),PAL,H,V
IF CHR(1)!=72 AND CHR(1)!=73 AND CHR(1)!=105 AND CHR(1)!=104 THEN ATU=1
IF CHR(2)!=72 AND CHR(2)!=73 AND CHR(2)!=105 AND CHR(2)!=104 THEN ATH=1
IF CHR(3)!=72 AND CHR(3)!=73 AND CHR(3)!=105 AND CHR(3)!=104 THEN ATM=1
IF CHR(4)!=72 AND CHR(4)!=73 AND CHR(4)!=105 AND CHR(4)!=104 THEN ATS=1
@ATASK
NEXT ATAX
NEXT ATAY
>>381
すいません全部のプログラムリスト
ACLS
PX=110
PY=90
B=64
VISIBLE 1,1,1,1,1,1,
SPSET 1,64,2,0,0,0
SPANM 1,4,20,0
@LOOP
SPOFS 1,PX,PY
A=BUTTON()
IF A==4 THEN PX=PX-1
IF A==8 THEN PX=PX+1
IF A==1 THEN PY=PY-1
IF A==2 THEN PY=PY+1
IF A==9 THEN PY=PY-1:PX=PX-1
IF A==5 THEN PY=PY+1:PX=PX-1
IF A==10 THEN PY=PY-1:PX=PX+1
IF A==6 THEN PY=PY+1:PX=PX+1
IF A==8 THEN B=64
IF A==4 THEN B=72
IF A==1 THEN B=76
IF A==2 THEN B=68
VSYNC 1
GOTO @LOOP
CLEAR:ACLS
L=100
R=0
V=0
P=0.95
TK=0
@LOOP
GPAGE 0,N,2-N:N=2-N
C=128
W=200
GCLS 224
GFILL 0,Y,255,255,10
Z=5
J=J+1
WZ=W:VZ=V
Y=191
FOR I=0 TO L-1 STEP 2
GFILL C+W+VZ,Y,C-W+VZ,Y-Z*2,13
GFILL C+W/1.1+VZ,Y,C+W+VZ,Y-Z*20,1-(J%12<6)*1
GFILL C-W/1.1+VZ,Y,C-W+VZ,Y-Z*20,1-(J%12<6)*1
GFILL C-W/18+VZ,Y,C+W/18+VZ,Y-Z*2,15-(J%12<6)*2
C=C+R:Y=Y-Z:VZ=VZ*P:W=W*P:Z=Z*P:J=J+1:Y=Y-TK
NEXT
'WAIT 1
K=BUTTON()
IF K AND 1 THEN TK=TK+0.1
IF K AND 2 THEN TK=TK-0.1
IF K AND 4 THEN V=V+5
IF K AND 8 THEN V=V-5
IF K AND 16THEN R=R+0.1
IF K AND 32THEN R=R-0.1
GOTO @LOOP
@LOOP
GPAGE 0,N,2-N:N=2-N
(NEW!!!)CLS
C=128
W=200
GCLS 224
GFILL 0,Y,255,255,10
Z=5
(変更!!!)J=0
(NEW!!!)LOCATE 25,0
(NEW!!!)PRINT FLOOR(JJJ*40);"km/h"
(NEW!!!)IF JJJ<0 THEN JJJ=0
(NEW!!!)JJ=JJ+JJJ
(NEW!!!)J=J+JJ
WZ=W:VZ=V
Y=191
FOR I=0 TO L-1 STEP 2
GFILL C+W+VZ,Y,C-W+VZ,Y-Z*2,13
GFILL C+W/1.1+VZ,Y,C+W+VZ,Y-Z*20,1-(J%12<6)*1
GFILL C-W/1.1+VZ,Y,C-W+VZ,Y-Z*20,1-(J%12<6)*1
GFILL C-W/18+VZ,Y,C+W/18+VZ,Y-Z*2,15-(J%12<6)*2
C=C+R:Y=Y-Z:VZ=VZ*P:W=W*P:Z=Z*P:J=J+1:Y=Y-TK
NEXT
'WAIT 1
K=BUTTON()
IF K AND 1 THEN TK=TK+0.1
IF K AND 2 THEN TK=TK-0.1
IF K AND 4 THEN V=V+5
IF K AND 8 THEN V=V-5
(NEW!!!)IF (K AND 16)==16 AND JJJ<3 THEN JJJ=JJJ+0.05
(NEW!!!)IF (K AND 16)==16 AND JJJ>3 AND JJJ<7 THEN JJJ=JJJ+0.005
(NEW!!!)IF (K AND 16)!=16 AND JJJ>0 THEN JJJ=JJJ-0.05
(NEW!!!)IF (K AND 32)==32 AND JJJ>0 THEN JJJ=JJJ-0.1
(変更!!!)IF K AND 512THEN R=R+0.1
(変更!!!)IF K AND 256THEN R=R-0.1
GOTO @LOOP
>>520
とりあえず基本的なものなら
BTN:ボタン、X:x座標、y:Y座標
BTN=BUTTON()
IF BTN AND 1 THEN Y=Y-8:SPCHR 管理番号,キャラ番号(上向きの絵)
IF BTN AND 2 THEN Y=Y+8:SPCHR 番号,下向き
・・・・
BGOFS 0,X,Y,10
こんなかんじですね。当然これだけでは動かないので参考程度に。
下画面に四角いボタンをいくつか表示して
そこをタッチすると何か動作する(音が出るとか色が変わるとか)
というプログラムを作ってるんだけど
@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度毎に点を打つ、というものですが、