Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- '"
- ' SMILEBOOM LIBRARY "
- '"
- '
- ' どこか適当なスロットでEXECしてから利用します
- '
- ' (C)SMILEBOOM
- '
- ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
- ' 2019.01.07:フォントの状態確認
- ' 2019.01.07:複数行対応の文字列入力ウィンドウ
- ' 2019.01.08:BUTVECのタイプ対応
- ' 2019.02.04:複数行入力はすべての行を返す
- '---------------------------------------
- ' 2019.03.31:文字列入力の引数を文字数に変更
- ' 2019.04.11:最初の文字列が受け取れないバグ修正
- '---------------------------------------
- ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
- ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
- ' 2019.04.30:スプライト検索処理追加
- ' 2019.05.07:GRFILL(角丸四角の描画)
- ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
- '
- OPTION STRICT
- VAR VER$="1.1"
- '--- BUTTON(KEYBOARD/STICK)
- ENUM \
- #INP_MIX=0,\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL,\
- #INP_STICKR,\
- #MAX_INP
- ENUM \
- #IMD_NEW=0,\
- #IMD_REPEAT,\
- #IMD_IMPACT,\
- #IMD_RELEASE,\
- #IMD_VX,\
- #IMD_VY,\
- #IMD_REPVX,\
- #IMD_REPVY,\
- #IMD_OLD,\
- #IMD_TIME,\
- #IMD_X,\
- #IMD_Y,\
- #MAX_IMD
- CONST #MAX_IDTBL=3
- DIM IDTBL[#MAX_IDTBL]=[\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL\
- ]
- VAR OLDKEY$="",KEY$=""
- VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
- VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
- VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
- VAR INP[#MAX_INP,#MAX_IMD]
- '--- TOUCH&MOUSE
- VAR TCX=0,TCY=0,TCS=0,TCR=0
- VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
- VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
- VAR OLDMOSW=0,MOSW=0,MOSVW=0
- '--- KEY REPEAT
- VAR KW1,KW2
- SYSPARAM "KEYREPEAT" OUT KW1,KW2
- '--- FONT
- DIM FONTX[128],FONTW[128]
- VAR FONTPROP=0,FONTSIZE=16
- '--- SCREEN
- VAR SCW,SCH
- '--- GPAGE
- CONST #GPAGE_WORK =0
- CONST #GPAGE_DEFSP=4
- '--- WORK
- CONST #EDGE=2,#CAPH=11,#LCW=2
- VAR OLDGP
- VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
- VAR WINCX,WINCY,WINCW,WINCH
- DIM GTMP[2048*2048]
- '--- COLOR
- CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
- CONST #C_CSROFF =RGB(120, 0,120,255)
- CONST #C_WINBASE=#C_NAVY
- CONST #C_WINEDGE=#C_WHITE
- CONST #C_CLOSE =RGB(255,128,128,220)
- '--- MESSAGE
- CONST #MSGOX=2,#MSGOY=4
- CONST #MAX_MSG=2048/16
- CONST #ALP=2
- CONST #DEFSPACE=4
- CONST #DEFENTY=2
- VAR LF$=CHR$(10)
- DIM MSG$[#MAX_MSG]
- VAR MSGLINECNT=0,MSGENTY=FONTSIZE
- VAR MSGW,MSGH,CSRX,CSRY
- VAR MSGGX,MSGGY,MSGGW,MSGGH
- VAR MSGTW,MSGTH
- VAR MSGMARGIN=0
- '--- SPRITE
- CONST #SP_LIBTOP =4090
- CONST #SP_LIBEND =4094
- VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
- VAR SP_WIN,SP_SHADOW,SP_CSR
- VAR SP_HITCHK
- '--- HIT CHECK
- CONST #MAX_CHKLIST=100
- DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
- '--- INITIALIZE
- SB_INITLIB #SP_LIBTOP,#SP_LIBEND
- END
- '--- DEBUG
- ACLS
- 'XSCREEN 640,360,2,0
- 'XSCREEN 1280,720,1,0
- VAR C$="複数行対応 テキストエディター"
- VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
- VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
- PRINT A$
- PRINT "LEN MSG:";SB_MSGLEN(M$)
- END
- '
- ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
- '
- COMMON DEF USER_FUNC
- PRINT "USER"
- END
- '
- ' SMILEBOOM LIBRARY PROGRAM
- '
- '=======================================
- '■存在確認用
- '=======================================
- COMMON DEF SB_LIB()
- 'CHKCALL("SB_LIB")==TRUE
- RETURN VER$
- END
- '=======================================
- '■ライブラリ初期設定
- '=======================================
- COMMON DEF SB_INITLIB ST,SE
- '---
- SPTOP=ST:SPEND=SE
- '---
- XSCREEN OUT SCW,SCH
- '---
- SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
- SPCOLOR SP_HITCHK,#C_CLEAR
- SB_CHKFONT #DEFSPACE
- SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
- END
- '
- ' ### SPRITE HELPER
- '
- '=======================================
- '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
- '=======================================
- COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
- '--- 移動していない?
- IF VX==0 && VY==0 THEN RETURN -1
- '--- X優先(方向限定:斜めには動かさない)
- IF VX && VY THEN VY=0
- '--- 発生元情報取得
- VAR U,V,W,H,OX,OY
- SPOFS SP,1 OUT OX,OY
- SPCHR SP OUT U,V,W,H
- '--- 当たり判定用のスプライト準備
- VAR BX=OX+W/2,BY=OY+H/2
- SPOFS SP_HITCHK,BX,BY,-4000
- SPCHR SP_HITCHK,,,W,H
- SPHOME SP_HITCHK,W/2,H/2
- SPCOL SP_HITCHK,0,MSK
- SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
- SPCOLOR SP_HITCHK,#C_CLEAR
- '--- 進行方向にあるスプライトを探す
- VAR CNT=0
- VAR NX=SPHITSP(SP_HITCHK)
- IF NX!=-1 THEN
- '--- 1個目発見
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- '--- 他にもあるか?(続きの確認)
- LOOP
- NX=SPHITSP()
- IF NX==-1 THEN BREAK
- '---
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- IF CNT>=#MAX_CHKLIST THEN BREAK
- ENDLOOP
- '--- 1個だけなら自分自身
- IF CNT>1 THEN
- '--- 近い順に並べる
- SORT 0,CNT,CHKLIST,CHKSP
- NX=CHKSP[1] '0番目は自分自身なので1番目を使う
- RETURN NX
- ENDIF
- ENDIF
- '--- 正面に見つからないときは両側面を探す
- VAR CVX=SCW,CVY=SCW
- IF VX THEN CVX=0 ELSE CVY=0
- NX=-1
- LOOP
- BX=BX+(VX*W):BY=BY+(VY*H)
- IF BX<0 || BX>SCW THEN BREAK
- IF BY<0 || BY>SCH THEN BREAK
- SPOFS SP_HITCHK,BX,BY
- SPCOLVEC SP_HITCHK, CVX, CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- SPCOLVEC SP_HITCHK,-CVX,-CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- ENDLOOP
- '---
- RETURN NX
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINSTAT OUT ED,CP
- ED=#EDGE
- CP=#CAPH
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
- '--- BACKUP IMAGE
- WINGW=W+#EDGE*2
- WINGH=H+#EDGE*2+#CAPH
- WINGX=2048-WINGW
- WINGY=2048-WINGH
- OLDGP=GTARGET()
- GTARGET #GPAGE_WORK
- GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
- '--- CREATE WINDOW
- VAR EX=WINGX+WINGW,EY=WINGY+WINGH
- GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
- GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
- GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
- '--- CLOSE AREA
- WINCW=32:WINCH=#EDGE+#CAPH-2
- WINCX=EX-WINCW:WINCY=WINGY
- GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
- GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
- GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
- '--- キャプションをのぞいたざひょう
- WINHX=WINGX+#EDGE
- WINHY=WINGY+#EDGE+#CAPH
- GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
- GTARGET OLDGP
- '--- SPRITE:WINDOW
- VAR OLDSPG=SPPAGE()
- SPPAGE #GPAGE_WORK
- SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPOFS SP_WIN,X,Y
- '--- CLOSE BUTTON
- WINCX=X+WINGW-WINCW:WINCY=Y
- '--- SPRITE:SHADOW
- SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPLINK SP_SHADOW,SP_WIN
- SPCOLOR SP_SHADOW,RGB(160,0,0,0)
- SPOFS SP_SHADOW,3,3,20
- SPPAGE OLDSPG
- '--- CAPTION
- GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
- '---
- RETURN SP_WIN
- END
- '=======================================
- '■CLOSE
- '=======================================
- COMMON DEF SB_WINCLOSE
- SPCLR SP_WIN
- SPCLR SP_SHADOW
- GTARGET OLDGP
- GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
- END
- '=======================================
- '■CHECK CLOSE BUTTON
- '=======================================
- COMMON DEF SB_CHKWINCLOSE(X,Y)
- IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
- IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
- RETURN 1
- END
- '
- ' ### MULTILINE TEXT EDITOR
- '
- '=======================================
- '■文字列の入力(複数行対応)
- '=======================================
- COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
- '--- CALC DOTSIZE
- MSGTW=TW:MSGTH=TH
- VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
- VAR DH=(TH*MSGENTY)+#MSGOY
- '--- CREATE WINDOW
- SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
- GTARGET #GPAGE_WORK
- '--- MAX MSGLINE ON WINDOW
- MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
- MSGH=TH
- MSGGX=WINHX:MSGGY=WINHY
- MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
- '--- SPLIT MESSAGE
- VAR C$
- VAR I=0,MC=0
- FILL MSG$,""
- LOOP
- C$=MID$(MS$,I,1):INC I
- IF C$=="" THEN INC MC:BREAK
- IF C$==LF$ THEN
- INC MC
- ELSE
- IF LEN(MSG$[MC])<MSGTW THEN
- MSG$[MC]=MSG$[MC]+C$
- ENDIF
- ENDIF
- ENDLOOP
- IF MC==0 THEN INC MC
- MSGLINECNT=MC
- '--- SPRITE:CURSOR
- VAR OLDSPG=SPPAGE()
- CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
- CSRX=LEN(MSG$[CSRY])
- SPPAGE -1
- SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
- SPLINK SP_CSR,SP_WIN
- SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
- SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
- SPVAR SP_CSR,"OX",CSRX
- SPVAR SP_CSR,"OY",CSRY
- SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
- SPCOLOR SP_CSR,#C_CSRON
- SPANIM SP_CSR,"C",8,#C_CSRON,8,#C_CSROFF,0
- SETCSROFS SP_CSR
- SPPAGE OLDSPG
- '--- CHECK ENTER&DRAW
- FOR I=0 TO MSGH-1
- EDPUTLINE I
- NEXT
- '
- ' ### MAIN LOOP
- '
- LOOP
- VSYNC
- SB_INPUT 0 'USBKEY NOT GAMEMODE
- SB_TOUCHMOUSE 1
- EDITOR
- IF CHKCALL(USER$) THEN CALL USER$
- CALL SPRITE
- IF SB_BUTTON("BUTTON","IMPACT") AND (1<<#B_RDOWN) THEN BREAK
- IF ISESC THEN BREAK
- IF (MOSBI AND &H01) && SB_CHKWINCLOSE(MOSX,MOSY) THEN BREAK
- IF MOSBI AND &H02 THEN BREAK
- ENDLOOP
- '--- CLOSE
- SB_WINCLOSE
- SPCLR SP_CSR
- '--- MAKE MESSAGE
- VAR TX$=""
- FOR I=0 TO MSGH-1
- TX$=TX$+MSG$[I]+LF$
- NEXT
- RETURN TX$
- END
- '---------------------------------------
- ' INPUT CURSOR
- '---------------------------------------
- DEF SPFUNC_CSRINPUT
- SETCSROFS CALLIDX()
- END
- '---
- DEF SETCSROFS IX
- VAR HX=SPVAR(IX,"HX")
- VAR HY=SPVAR(IX,"HY")
- VAR OX=SB_MSGOFS(CSRX,MSG$[CSRY])
- VAR OY=CSRY*MSGENTY
- SPOFS IX,OX+HX,OY+HY
- END
- '---------------------------------------
- ' MULTI INPUT MAIN
- '---------------------------------------
- DEF EDITOR
- VAR OX=CSRX,OY=CSRY,O,W,L
- VAR HX,HY,DW,DH
- 'LOCATE 2,2
- 'PRINT FORMAT$("%3D,%3D",CSRX,CSRY)
- '--- GET VECTOR
- VAR VX,VY
- SB_BUTVEC "MIX","REPEAT" OUT VX,VY
- VAR BTN=SB_BUTTON("MIX","NEW")
- VAR BTI=SB_BUTTON("BUTTON","IMPACT")
- VAR BTR=SB_BUTTON("MIX","REPEAT")
- VAR INS=SB_KEYSTAT("INS")
- VAR ESC=SB_KEYSTAT("ESC")
- VAR BS=SB_KEYSTAT("BS")
- VAR DEL=SB_KEYSTAT("DEL")
- VAR ENT=SB_KEYSTAT("ENT")
- 'PRINT INS,ESC,BS,DEL,ENT,HEX$(BTN),HEX$(BTN),VX,VY
- '--- ACTION
- IF BS THEN EDSUBBS :VX=0:VY=0
- IF DEL THEN EDSUBDEL:VX=0:VY=0
- IF ENT THEN EDSUBENT:VX=0:VY=0
- IF KEY$!="" THEN EDSETCHR KEY$,INS:VX=0:VY=0
- '--- MOVE X
- VAR SX=LEN(MSG$[CSRY]),SY=MSGH
- CSRX=CSRX+VX
- IF VX<0 && CSRX<0 THEN
- CSRX=0:DEC CSRY
- IF CSRY<0 THEN CSRY=0 ELSE CSRX=LEN(MSG$[CSRY])
- ENDIF
- IF VX>0 && CSRX>SX THEN
- CSRX=SX
- INC CSRY
- IF CSRY>=SY THEN CSRY=SY-1 ELSE CSRX=0
- ENDIF
- '--- MOVE Y
- IF VX==0 && VY THEN
- CSRY=CSRY+VY
- IF CSRY<0 THEN CSRY=0
- IF CSRY>=SY THEN CSRY=SY-1
- ENDIF
- SX=LEN(MSG$[CSRY])
- IF CSRX>SX THEN CSRX=SX
- END
- '---------------------------------------
- ' BACKSPACE:1文字前を消す
- '---------------------------------------
- DEF EDSUBBS
- VAR C$,H$,T$,M$=MSG$[CSRY]
- VAR NX,I,L=LEN(M$),L2
- '--- 一番前?
- IF CSRX==0 THEN
- '--- カーソルより後ろに文字列があるか?
- NX=LEN(MSG$[CSRY-(CSRY!=0)])
- IF L THEN
- '--- 上の行に残り文字列を結合
- IF CSRY THEN
- '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
- H$=MSG$[CSRY-1]:NX=LEN(MSG$[CSRY-1])
- WHILE M$!=""
- C$=LEFT$(M$,1)
- IF SB_MSGLEN( H$+C$ )>MSGGW THEN BREAK
- M$=RIGHT$(M$,LEN(M$)-1)
- H$=H$+C$
- WEND
- '--- 上の行に収まりきらなかったら一部を結合し残りは前の行に残す
- MSG$[CSRY-1]=H$:EDPUTLINE CSRY-1
- MSG$[CSRY]=M$ :EDPUTLINE CSRY
- ENDIF
- ENDIF
- '--- 1行削除
- IF M$=="" THEN
- FOR I=CSRY TO MSGH-1
- MSG$[I]=MSG$[I+1]:EDPUTLINE I
- NEXT
- MSG$[MSGH-1]="":EDPUTLINE MSGH-1
- ENDIF
- IF CSRY THEN DEC CSRY:CSRX=NX
- RETURN
- ENDIF
- '---
- H$=MID$(M$,0,CSRX-1)
- T$=MID$(M$,CSRX,L-CSRX)
- DEC CSRX
- MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' DELETE:1文字後ろを消す
- '---------------------------------------
- DEF EDSUBDEL
- VAR C$,H$,T$,M$=MSG$[CSRY]
- VAR I,L=LEN(M$)
- '--- 一番後ろ?
- IF CSRX>=L THEN
- '--- 下の行から持ってこれるだけ持ってくる
- IF CSRY!=MSGH-1 THEN
- '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
- H$=MSG$[CSRY+1]
- WHILE H$!=""
- C$=LEFT$(H$,1)
- IF SB_MSGLEN( M$+C$ )>MSGGW THEN BREAK
- H$=RIGHT$(H$,LEN(H$)-1)
- M$=M$+C$
- WEND
- MSG$[CSRY+1]=H$:EDPUTLINE CSRY+1
- MSG$[CSRY]=M$ :EDPUTLINE CSRY
- '--- 1行削除?
- IF H$=="" THEN
- FOR I=CSRY+1 TO MSGH-1
- MSG$[I]=MSG$[I+1]:EDPUTLINE I
- NEXT
- MSG$[MSGH-1]="":EDPUTLINE MSGH-1
- ENDIF
- ENDIF
- RETURN
- ENDIF
- '--- 後ろを消す
- H$=MID$(M$,0,CSRX)
- T$=MID$(M$,CSRX+1,L-CSRX)
- MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' 1文字追加
- '---------------------------------------
- DEF EDSETCHR K$,INS
- '--- 新しい文字は文字数内か?
- VAR M$=MSG$[CSRY]
- IF LEN(M$)>=MSGTW THEN RETURN
- '--- 新しい文字はドット範囲に収まるか?
- VAR L=SB_MSGLEN(M$)
- VAR SX=SB_CHRSIZE(MID$(M$,CSRX,1))
- IF L+SX>MSGGW THEN RETURN '入らない時に押し出すか?
- '--- 新しい文字を追加
- L=LEN(M$):SX=CSRX:IF SX>L THEN SX=L
- VAR H$=MID$(M$,0,SX)
- VAR T$=MID$(M$,CSRX,L-SX)
- MSG$[CSRY]=H$+K$+T$:EDPUTLINE CSRY
- INC CSRX
- END
- '---------------------------------------
- ' 改行
- '---------------------------------------
- DEF EDSUBENT
- VAR M$=MSG$[CSRY]
- VAR I,L=LEN(M$)
- IF CSRY==MSGH-1 THEN RETURN '空きなし
- '--- 最後の行に空きがあるか?
- IF MSG$[MSGH-1]!="" THEN RETURN '空きなし
- '--- 1行ずらす
- FOR I=MSGH-1 TO CSRY+1 STEP -1
- MSG$[I]=MSG$[I-1]:EDPUTLINE I
- NEXT
- '--- 改行時のカーソルより後ろを新しい行へ
- VAR H$=MID$(M$,0,CSRX)
- VAR T$=MID$(M$,CSRX,L-CSRX)
- MSG$[CSRY]=H$:EDPUTLINE CSRY
- CSRX=0:INC CSRY
- MSG$[CSRY]=T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' 1行再表示
- '---------------------------------------
- DEF EDPUTLINE Y
- VAR HX=MSGGX
- VAR HY=MSGGY+Y*MSGENTY+#MSGOY
- GFILL HX,HY,HX+MSGGW-1,HY+MSGENTY-1,#C_WINBASE
- SB_GMSG HX,HY,MSG$[Y],#C_WHITE,#ALP
- END
- '
- ' ### FONT/MESSAGE
- '
- '=======================================
- '■メッセージ関係の初期化
- '=======================================
- COMMON DEF SB_INITMSG PR,FS,MG,LY
- IF PR==0 THEN MG=0
- FONTPROP=PR
- FONTSIZE=FS
- MSGMARGIN=MG
- MSGENTY=LY+FONTSIZE
- END
- '=======================================
- '■文字列全体のドット数
- '=======================================
- COMMON DEF SB_MSGLEN( TX$ )
- RETURN SB_MSGOFS( LEN(TX$),TX$ )
- END
- '=======================================
- '■文字列の指定位置までのドット数
- '=======================================
- COMMON DEF SB_MSGOFS( OX,TX$ )
- VAR I=0,X=0,C,W,SC=1,SPC
- VAR C$
- WHILE I<OX
- C$=MID$(TX$,I,1):INC I
- IF C$==CHR$(10) || C$=="" THEN BREAK
- X=X+(SB_CHRSIZE(C$)+MSGMARGIN)*SC
- WEND
- RETURN X
- END
- '=======================================
- '■指定1文字のドット数
- '=======================================
- COMMON DEF SB_CHRSIZE(C$)
- VAR C,FS=FONTSIZE
- IF C$!="" THEN
- C=ASC(C$)
- IF C>=32 && C<128 THEN
- IF FONTPROP THEN FS=FONTW[C]
- ENDIF
- ENDIF
- RETURN FS
- END
- '=======================================
- '■1行表示(プロポーショナル対応)
- '=======================================
- COMMON DEF SB_GMSG HX,HY,TX$,COL,ALP
- VAR I=0,X=0,Y=0,C,FX,W,SC=1
- VAR SPC,TX=HX,ST=FONTSIZE
- VAR C$
- LOOP
- C$=MID$(TX$,I,1):INC I
- IF C$=="" THEN BREAK
- C=ASC(C$):FX=0:W=FONTSIZE:SPC=MSGMARGIN
- IF C<128 THEN
- W=SB_CHRSIZE(C$)
- IF W==FONTSIZE THEN FX=0:SPC=0 ELSE FX=FONTX[C]:SPC=1
- HX=HX-FX*SC
- ENDIF
- GPUTCHR X+HX,Y+HY,C$,ST,SC,SC,COL,ALP
- X=X+(FX+W+SPC)*SC
- ENDLOOP
- END
- '=======================================
- '■フォントのサイズと開始点を調査(プロポーショナル用)
- '=======================================
- COMMON DEF SB_CHKFONT SPCSIZE
- VAR P=GTARGET()
- GTARGET 5 'FONT
- '---
- VAR I=0,U,V,W,H,HX
- VAR SX,HSW,SSW,FS=FONTSIZE
- VAR VTOP=(FS==16)*1024
- VAR C,A,R,G,B
- FOR V=VTOP TO VTOP+FS*2-1 STEP FS
- FOR U=0 TO FS*64-1 STEP FS
- HX=0:SX=0:HSW=0:SSW=0
- FOR W=0 TO FS-1
- FOR H=0 TO FS-1
- RGB GPGET(U+W,H+V) OUT A,R,G,B
- IF A THEN BREAK
- NEXT
- IF H==FS THEN
- IF HSW==0 THEN INC HX ELSE BREAK
- ELSE
- IF HSW==0 THEN HSW=1
- IF HSW THEN INC SX
- ENDIF
- NEXT
- IF HX==FS THEN HX=0:SX=FS
- FONTX[I]=HX:FONTW[I]=SX
- INC I
- NEXT
- NEXT
- '--- SPACE
- C=ASC(" ")
- FONTX[C]=0
- FONTW[C]=SPCSIZE
- '---
- GTARGET P
- END
- '
- ' ### BUTTON/KEY/STICK
- '
- '=======================================
- '■入力系デバイス読込み
- '---------------------------------------
- ' USB=1:USBKEY IS GAMEMODE
- '=======================================
- COMMON DEF SB_INPUT USB
- '--- USBKEY
- CONST #USBKEY_ESC =&H29
- CONST #USBKEY_SPACE =&H2C
- CONST #USBKEY_UP =&H52
- CONST #USBKEY_DOWN =&H51
- CONST #USBKEY_LEFT =&H50
- CONST #USBKEY_RIGHT =&H4F
- CONST #USBKEY_ENTER =&H28
- CONST #USBKEY_ENTER2=&H58
- CONST #USBKEY_CTRL =&HE0
- CONST #USBKEY_CTRL2 =&HE4
- CONST #USBKEY_ALT =&HE2
- CONST #USBKEY_ALT2 =&HE6
- CONST #USBKEY_WIN =&HE3
- CONST #USBKEY_WIN2 =&HE7
- CONST #USBKEY_SHIFT =&HE1
- CONST #USBKEY_SHIFT2=&HE5
- CONST #USBKEY_CAPS =&H39
- CONST #USBKEY_TAB =&H2B
- CONST #USBKEY_INS =&H49
- CONST #USBKEY_DEL =&H4C
- CONST #USBKEY_BS =&H2A
- CONST #USBKEY_HANZEN=&H35
- CONST #USBKEY_AT =&H2F
- '---
- CONST #USBKEY_1 =&H1E
- CONST #USBKEY_2 =&H1F
- CONST #USBKEY_3 =&H20
- CONST #USBKEY_4 =&H21
- CONST #USBKEY_5 =&H22
- CONST #USBKEY_6 =&H23
- CONST #USBKEY_7 =&H24
- CONST #USBKEY_8 =&H25
- CONST #USBKEY_9 =&H26
- CONST #USBKEY_0 =&H27
- CONST #USBKEY_MINUS =&H2D
- CONST #USBKEY_CARET =&H2E '^
- CONST #USBKEY_YEN =&H89
- '---
- CONST #USBKEY_A =&H04
- CONST #USBKEY_B =&H05
- CONST #USBKEY_C =&H06
- CONST #USBKEY_D =&H07
- CONST #USBKEY_E =&H08
- CONST #USBKEY_F =&H09
- CONST #USBKEY_G =&H0A
- CONST #USBKEY_H =&H0B
- CONST #USBKEY_I =&H0C
- CONST #USBKEY_J =&H0D
- CONST #USBKEY_K =&H0E
- CONST #USBKEY_L =&H0F
- CONST #USBKEY_M =&H10
- CONST #USBKEY_N =&H11
- CONST #USBKEY_O =&H12
- CONST #USBKEY_P =&H13
- CONST #USBKEY_Q =&H14
- CONST #USBKEY_R =&H15
- CONST #USBKEY_S =&H16
- CONST #USBKEY_T =&H17
- CONST #USBKEY_U =&H18
- CONST #USBKEY_V =&H19
- CONST #USBKEY_W =&H1A
- CONST #USBKEY_X =&H1B
- CONST #USBKEY_Y =&H1C
- CONST #USBKEY_Z =&H1D
- '
- ' KEY(FROM BASIC)
- '
- VAR KEYBS=0,KEYENT=0
- OLDKEY$=KEY$:KEY$=INKEY$()
- IF KEY$!="" THEN
- IF KEY$==CHR$(8) THEN
- KEY$="":KEYBS=1 'BACKSPACE
- ELSEIF KEY$==CHR$(13) THEN
- KEY$="":KEYENT=1 'ENTER
- ELSEIF ASC(KEY$)<&H20 THEN
- KEY$=""
- ENDIF
- ENDIF
- '
- ' KEY(FROM USB)
- '
- VAR N=0
- IF KEYBOARD(#USBKEY_UP,0) THEN N=N OR (1<<#B_LUP)
- IF KEYBOARD(#USBKEY_DOWN,0) THEN N=N OR (1<<#B_LDOWN)
- IF KEYBOARD(#USBKEY_LEFT,0) THEN N=N OR (1<<#B_LLEFT)
- IF KEYBOARD(#USBKEY_RIGHT,0) THEN N=N OR (1<<#B_LRIGHT)
- '---
- IF USB THEN
- IF KEYBOARD(#USBKEY_SPACE,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_W,0) THEN N=N OR (1<<#B_LUP)
- IF KEYBOARD(#USBKEY_S,0) THEN N=N OR (1<<#B_LDOWN)
- IF KEYBOARD(#USBKEY_A,0) THEN N=N OR (1<<#B_LLEFT)
- IF KEYBOARD(#USBKEY_D,0) THEN N=N OR (1<<#B_LRIGHT)
- IF KEYBOARD(#USBKEY_Z,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_X,0) THEN N=N OR (1<<#B_RDOWN) 'B
- IF KEYBOARD(#USBKEY_C,0) THEN N=N OR (1<<#B_RLEFT) 'Y
- IF KEYBOARD(#USBKEY_V,0) THEN N=N OR (1<<#B_RUP) 'X
- IF KEYBOARD(#USBKEY_ALT,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_ALT2,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_WIN,0) THEN N=N OR (1<<#B_RDOWN) 'B
- IF KEYBOARD(#USBKEY_WIN2,0) THEN N=N OR (1<<#B_RDOWN) 'B
- ENDIF
- '--- L/R
- IF KEYBOARD(#USBKEY_SHIFT,0) THEN N=N OR (1<<#B_L1)
- IF KEYBOARD(#USBKEY_CTRL,0) THEN N=N OR (1<<#B_L2)
- IF KEYBOARD(#USBKEY_SHIFT2,0) THEN N=N OR (1<<#B_R1)
- IF KEYBOARD(#USBKEY_CTRL2,0) THEN N=N OR (1<<#B_R2)
- '---
- KEYSUB #INP_KEY,N
- '--- SPECIAL KEY
- ISSHIFT=KEYBOARD(#USBKEY_SHIFT,0) OR KEYBOARD(#USBKEY_SHIFT2,0)
- ISCTRL=KEYBOARD(#USBKEY_CTRL,0) OR KEYBOARD(#USBKEY_CTRL2,0)
- ISESC=KEYBOARD(#USBKEY_ESC,2)
- IF KEYBOARD(#USBKEY_INS,2) THEN INSMODE=!INSMODE
- IF KEYBOARD(#USBKEY_CAPS,2) THEN CAPSMODE=!CAPSMODE
- KEYREP KEYBOARD(#USBKEY_TAB,0),TABCNT OUT ISTAB,TABCNT
- VAR B=KEYBS OR KEYBOARD(#USBKEY_BS,0)
- KEYREP B,BSCNT OUT ISBS,BSCNT
- KEYREP KEYBOARD(#USBKEY_DEL,0),DELCNT OUT ISDEL,DELCNT
- VAR E=KEYBOARD(#USBKEY_ENTER,0) OR KEYBOARD(#USBKEY_ENTER2,0) OR KEYENT
- KEYREP E,ENTCNT OUT ISENT,ENTCNT
- '
- ' BUTTON
- '
- KEYSUB #INP_BUTTON,BUTTON(0)
- '
- ' STICK(L)
- '
- VAR X,Y,LM=0.2
- STICK 0,0 OUT X,Y
- N=0
- IF X>-LM && X<LM THEN X=0
- IF Y>-LM && Y<LM THEN Y=0
- IF Y<-LM THEN N=N OR (1<<#B_LUP)
- IF Y> LM THEN N=N OR (1<<#B_LDOWN)
- IF X<-LM THEN N=N OR (1<<#B_LLEFT)
- IF X> LM THEN N=N OR (1<<#B_LRIGHT)
- KEYSUB #INP_STICKL,N
- '
- ' STICK(R)
- '
- STICK 0,1 OUT X,Y
- N=0
- IF X>-LM && X<LM THEN X=0
- IF Y>-LM && Y<LM THEN Y=0
- IF Y<-LM THEN N=N OR (1<<#B_LUP)
- IF Y> LM THEN N=N OR (1<<#B_LDOWN)
- IF X<-LM THEN N=N OR (1<<#B_LLEFT)
- IF X> LM THEN N=N OR (1<<#B_LRIGHT)
- KEYSUB #INP_STICKR,N
- '
- ' MIX
- '
- VAR S,RX=0,RY=0,ID=#INP_MIX
- X=0:Y=0
- '--- VECTOR
- FOR N=0 TO #MAX_IDTBL-1
- S=IDTBL[N]
- IF INP[S,#IMD_VX] THEN X=INP[S,#IMD_VX]
- IF INP[S,#IMD_VY] THEN Y=INP[S,#IMD_VY]
- IF INP[S,#IMD_REPVX] THEN RX=INP[S,#IMD_REPVX]
- IF INP[S,#IMD_REPVY] THEN RY=INP[S,#IMD_REPVY]
- NEXT
- INP[ID,#IMD_VX]=X
- INP[ID,#IMD_VY]=Y
- INP[ID,#IMD_REPVX]=RX
- INP[ID,#IMD_REPVY]=RY
- '--- BUTTON
- VAR TP
- TP=#IMD_NEW :INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- TP=#IMD_REPEAT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- TP=#IMD_IMPACT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- END
- '---------------------------------------
- ' CHECK KEY REPEAT
- '---------------------------------------
- DEF KEYREP N,C OUT _F,_C
- _F=0:_C=0
- IF N==0 THEN RETURN
- _C=C+1
- _F=((_C==1) || ((_C>=KW1) && ((_C-KW1) MOD KW2)==0))
- END
- '---------------------------------------
- ' CHECK REPEAT, MAKE VECTOR
- '---------------------------------------
- DEF KEYSUB ID,N
- '---
- INP[ID,#IMD_OLD]=INP[ID,#IMD_NEW]
- INP[ID,#IMD_NEW]=N
- '--- IMPACT
- INP[ID,#IMD_IMPACT]=N AND (NOT INP[ID,#IMD_OLD])
- '--- REPEAT
- VAR R=0,T=INP[ID,#IMD_TIME]
- IF INP[ID,#IMD_OLD]!=N THEN T=0 ELSE INC T
- IF T==0 || (T>=KW1 && ((T-KW1) MOD KW2)==0) THEN R=N
- INP[ID,#IMD_TIME]=T
- INP[ID,#IMD_REPEAT]=R
- '--- VECTOR(REPEAT)
- VAR VX=0,VY=0
- IF R AND (1<<#B_LUP) THEN DEC VY
- IF R AND (1<<#B_LDOWN) THEN INC VY
- IF R AND (1<<#B_LLEFT) THEN DEC VX
- IF R AND (1<<#B_LRIGHT) THEN INC VX
- INP[ID,#IMD_REPVX]=VX
- INP[ID,#IMD_REPVY]=VY
- '--- VECTOR(NEW)
- VX=0:VY=0
- IF N AND (1<<#B_LUP) THEN DEC VY
- IF N AND (1<<#B_LDOWN) THEN INC VY
- IF N AND (1<<#B_LLEFT) THEN DEC VX
- IF N AND (1<<#B_LRIGHT) THEN INC VX
- INP[ID,#IMD_VX]=VX
- INP[ID,#IMD_VY]=VY
- END
- '=======================================
- '■特殊キーの状態
- '=======================================
- COMMON DEF SB_KEYSTAT(N$)
- IF N$=="INS" || N$=="INSERT" THEN RETURN INSMODE
- IF N$=="ESC" || N$=="ESCAPE" THEN RETURN ISESC
- IF N$=="BS" || N$=="BACKSPACE" THEN RETURN ISBS
- IF N$=="DEL" || N$=="DELETE" THEN RETURN ISDEL
- IF N$=="ENT" || N$=="ENTER" THEN RETURN ISENT
- IF N$=="CAPS" || N$=="CAPSLOCK" THEN RETURN CAPSMODE
- IF N$=="SHIFT" THEN RETURN ISSHIFT
- IF N$=="CTRL" THEN RETURN ISCTRL
- END
- '=======================================
- '■ビット単位のボタン情報
- '=======================================
- COMMON DEF SB_BUTTON(ID$,MD$)
- VAR ID,MD
- GETIDMODE ID$,MD$ OUT ID,MD
- IF ID==-1 || MD==-1 THEN RETURN 0 'NONE
- RETURN INP[ID,MD]
- END
- '---------------------------------------
- ' GET ID&MODE
- '---------------------------------------
- DEF GETIDMODE ID$,MD$ OUT _ID,_MD
- VAR ID=-1,MD=-1
- '---
- IF ID$=="MIX" THEN ID=#INP_MIX
- IF ID$=="BUTTON" THEN ID=#INP_BUTTON
- IF ID$=="KEY" THEN ID=#INP_KEY
- IF ID$=="STICKL" THEN ID=#INP_STICKL
- IF ID$=="STICKR" THEN ID=#INP_STICKR
- '---
- IF MD$=="NEW" THEN MD=#IMD_NEW
- IF MD$=="REPEAT" THEN MD=#IMD_REPEAT
- IF MD$=="IMPACT" THEN MD=#IMD_IMPACT
- IF MD$=="RELEASE" THEN MD=#IMD_RELEASE
- IF MD$=="OLD" THEN MD=#IMD_OLD
- '---
- _ID=ID
- _MD=MD
- END
- '=======================================
- '■方向キーによる移動量
- '=======================================
- COMMON DEF SB_BUTVEC ID$,MD$ OUT _VX,_VY
- VAR ID,MD
- GETIDMODE ID$,MD$ OUT ID,MD
- _VX=0:_VY=0
- IF ID!=-1 THEN
- IF MD$=="NEW" THEN
- _VX=INP[ID,#IMD_VX]
- _VY=INP[ID,#IMD_VY]
- ELSEIF MD$=="REPEAT" THEN
- _VX=INP[ID,#IMD_REPVX]
- _VY=INP[ID,#IMD_REPVY]
- ENDIF
- ENDIF
- END
- '=======================================
- '■タッチ&マウス情報取得
- '=======================================
- COMMON DEF SB_TOUCHMOUSE SW
- '--- TOUCH
- TOUCH OUT TCS,TCX,TCY
- TCR=(TCS==1) || ((TCS>KW1) && (((TCS-KW1) MOD KW2)==0))
- '--- MOUSE:BUTTON
- OLDMOSBN=MOSBN
- MOSBN=MBUTTON() 'b0=L,b1=R,b2=C
- IF MOSBN==0 THEN MOSBN=MOSBN OR (TCS==1)
- MOSBI=MOSBN AND (NOT OLDMOSBN)
- VAR MC=MOSBNCNT
- IF OLDMOSBN==MOSBN THEN INC MC ELSE MC=0
- IF MC==1 || ((MC>KW1) && (((MC-KW1) MOD KW2)==0)) THEN
- MOSBR=MOSBN
- ELSE
- MOSBR=0
- ENDIF
- MOSBNCNT=MC
- '--- MOUSE:座標&ホイール
- OLDMOSX=MOSX
- OLDMOSY=MOSY
- OLDMOSW=MOSW
- MOUSE 0 OUT MOSX,MOSY,MOSW
- IF SW && TCS THEN MOSX=TCX:MOSY=TCY
- MOSVX=MOSX-OLDMOSX
- MOSVY=MOSY-OLDMOSY
- MOSVW=MOSW-OLDMOSW
- END
- '=======================================
- '■タッチ情報取得
- '=======================================
- COMMON DEF SB_GETTOUCH OUT X,Y,N,R
- X=TCX:Y=TCY:N=TCS:R=TCR
- END
- '=======================================
- '■マウス情報取得
- '=======================================
- COMMON DEF SB_GETMOUSE OUT X,Y,W
- X=MOSX:Y=MOSY:W=MOSW
- END
- '---
- COMMON DEF SB_GETMOSBUT OUT N,I,R
- N=MOSBN:I=MOSBI:R=MOSBR
- END
- '---
- COMMON DEF SB_GETMOSVEC OUT X,Y,W
- X=MOSVX:Y=MOSVY:W=MOSVW
- END
- '=======================================
- '■角丸四角の描画(かならずぐうすうさいずになる)
- '=======================================
- COMMON DEF GRFILL X1,Y1,X2,Y2,C,R
- GPUTBUT X1,Y1,X2,Y2,C,R,0
- END
- '=======================================
- '■角丸四角ボタンの描画(かならずぐうすうさいずになる)
- 'X1,Y1:してん
- 'X2,Y2:しゅうてん
- ' C:いろ
- ' R:角丸はんけい
- ' ATR:角四角していビット(b3= b2= b1= b0=)
- '=======================================
- COMMON DEF GPUTBUT X1,Y1,X2,Y2,C,R,ATR
- '--- はばとたかさをもとめる(いちのちょうせいふくむ)
- IF X1>X2 THEN SWAP X1,X2
- IF Y1>Y2 THEN SWAP Y1,Y2
- VAR W=(((X2-X1)+1) DIV 2)*2
- VAR H=(((Y2-Y1)+1) DIV 2)*2
- VAR RR=R*2
- VAR CX=X1+W/2,CY=Y1+H/2
- '--- たてなが?
- IF W<H && RR>W THEN
- R=W/2
- GCIRCLEF CX,Y1+R,R,C,ATR AND &B1100
- GCIRCLEF CX,Y2-R,R,C,ATR AND &B0011
- GFILL X1,Y1+R,X2,Y2-R,C
- RETURN
- ENDIF
- '--- よこなが?
- IF W>H && RR>H THEN
- R=H/2
- GCIRCLEF X1+R,CY,R,C,ATR AND &B1100
- GCIRCLEF X2-R,CY,R,C,ATR AND &B0011
- GFILL X1+R,Y1,X2-R,Y2,C
- RETURN
- ENDIF
- '--- つうじょう
- GCIRCLEF X1+R,Y1+R,R,C,ATR AND &B1000
- GCIRCLEF X2-R,Y1+R,R,C,ATR AND &B0100
- GCIRCLEF X1+R,Y2-R,R,C,ATR AND &B0010
- GCIRCLEF X2-R,Y2-R,R,C,ATR AND &B0001
- GFILL X1+R,Y1,X2-R,Y2,C
- GFILL X1,Y1+R,X2,Y2-R,C
- END
- '---------------------------------------
- ' CIRCLE/FILL
- '---------------------------------------
- DEF GCIRCLEF X,Y,RR,C,ATR
- IF ATR THEN
- GFILL X-RR,Y-RR,X+RR,Y+RR,C
- RETURN
- ENDIF
- '--- 色分解
- VAR R,G,B,A,TP=#G_ALPHA
- RGB C OUT A,R,G,B
- '---
- GCIRCLE X,Y,RR,RGB(1,R,G,B)
- GPAINT X,Y,C,RGB(1,R,G,B)
- GCIRCLE X,Y,RR,C
- '--- アンチエイリアス用に色分解
- 'VAR R,G,B,A,TP=#G_ALPHA
- 'RGB C OUT A,R,G,B
- 'VAR C2=RGB(200,R/2,G/2,B/2)
- 'GCIRCLE X,Y,RR,C2,#G_ALPHA
- END
- '===== END OF SOURCE =====
- '"
- ' SMILEBOOM LIBRARY "
- '"
- '
- ' どこか適当なスロットでEXECしてから利用します
- '
- ' (C)SMILEBOOM
- '
- ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
- ' 2019.01.07:フォントの状態確認
- ' 2019.01.07:複数行対応の文字列入力ウィンドウ
- ' 2019.01.08:BUTVECのタイプ対応
- ' 2019.02.04:複数行入力はすべての行を返す
- '---------------------------------------
- ' 2019.03.31:文字列入力の引数を文字数に変更
- ' 2019.04.11:最初の文字列が受け取れないバグ修正
- '---------------------------------------
- ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
- ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
- ' 2019.04.30:スプライト検索処理追加
- ' 2019.05.07:GRFILL(角丸四角の描画)
- ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
- '
- OPTION STRICT
- VAR VER$="1.1"
- '--- BUTTON(KEYBOARD/STICK)
- ENUM \
- #INP_MIX=0,\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL,\
- #INP_STICKR,\
- #MAX_INP
- ENUM \
- #IMD_NEW=0,\
- #IMD_REPEAT,\
- #IMD_IMPACT,\
- #IMD_RELEASE,\
- #IMD_VX,\
- #IMD_VY,\
- #IMD_REPVX,\
- #IMD_REPVY,\
- #IMD_OLD,\
- #IMD_TIME,\
- #IMD_X,\
- #IMD_Y,\
- #MAX_IMD
- CONST #MAX_IDTBL=3
- DIM IDTBL[#MAX_IDTBL]=[\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL\
- ]
- VAR OLDKEY$="",KEY$=""
- VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
- VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
- VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
- VAR INP[#MAX_INP,#MAX_IMD]
- '--- TOUCH&MOUSE
- VAR TCX=0,TCY=0,TCS=0,TCR=0
- VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
- VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
- VAR OLDMOSW=0,MOSW=0,MOSVW=0
- '--- KEY REPEAT
- VAR KW1,KW2
- SYSPARAM "KEYREPEAT" OUT KW1,KW2
- '--- FONT
- DIM FONTX[128],FONTW[128]
- VAR FONTPROP=0,FONTSIZE=16
- '--- SCREEN
- VAR SCW,SCH
- '--- GPAGE
- CONST #GPAGE_WORK =0
- CONST #GPAGE_DEFSP=4
- '--- WORK
- CONST #EDGE=2,#CAPH=11,#LCW=2
- VAR OLDGP
- VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
- VAR WINCX,WINCY,WINCW,WINCH
- DIM GTMP[2048*2048]
- '--- COLOR
- CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
- CONST #C_CSROFF =RGB(120, 0,120,255)
- CONST #C_WINBASE=#C_NAVY
- CONST #C_WINEDGE=#C_WHITE
- CONST #C_CLOSE =RGB(255,128,128,220)
- '--- MESSAGE
- CONST #MSGOX=2,#MSGOY=4
- CONST #MAX_MSG=2048/16
- CONST #ALP=2
- CONST #DEFSPACE=4
- CONST #DEFENTY=2
- VAR LF$=CHR$(10)
- DIM MSG$[#MAX_MSG]
- VAR MSGLINECNT=0,MSGENTY=FONTSIZE
- VAR MSGW,MSGH,CSRX,CSRY
- VAR MSGGX,MSGGY,MSGGW,MSGGH
- VAR MSGTW,MSGTH
- VAR MSGMARGIN=0
- '--- SPRITE
- CONST #SP_LIBTOP =4090
- CONST #SP_LIBEND =4094
- VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
- VAR SP_WIN,SP_SHADOW,SP_CSR
- VAR SP_HITCHK
- '--- HIT CHECK
- CONST #MAX_CHKLIST=100
- DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
- '--- INITIALIZE
- SB_INITLIB #SP_LIBTOP,#SP_LIBEND
- END
- '--- DEBUG
- ACLS
- 'XSCREEN 640,360,2,0
- 'XSCREEN 1280,720,1,0
- VAR C$="複数行対応 テキストエディター"
- VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
- VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
- PRINT A$
- PRINT "LEN MSG:";SB_MSGLEN(M$)
- END
- '
- ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
- '
- COMMON DEF USER_FUNC
- PRINT "USER"
- END
- '
- ' SMILEBOOM LIBRARY PROGRAM
- '
- '=======================================
- '■存在確認用
- '=======================================
- COMMON DEF SB_LIB()
- 'CHKCALL("SB_LIB")==TRUE
- RETURN VER$
- END
- '=======================================
- '■ライブラリ初期設定
- '=======================================
- COMMON DEF SB_INITLIB ST,SE
- '---
- SPTOP=ST:SPEND=SE
- '---
- XSCREEN OUT SCW,SCH
- '---
- SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
- SPCOLOR SP_HITCHK,#C_CLEAR
- SB_CHKFONT #DEFSPACE
- SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
- END
- '
- ' ### SPRITE HELPER
- '
- '=======================================
- '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
- '=======================================
- COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
- '--- 移動していない?
- IF VX==0 && VY==0 THEN RETURN -1
- '--- X優先(方向限定:斜めには動かさない)
- IF VX && VY THEN VY=0
- '--- 発生元情報取得
- VAR U,V,W,H,OX,OY
- SPOFS SP,1 OUT OX,OY
- SPCHR SP OUT U,V,W,H
- '--- 当たり判定用のスプライト準備
- VAR BX=OX+W/2,BY=OY+H/2
- SPOFS SP_HITCHK,BX,BY,-4000
- SPCHR SP_HITCHK,,,W,H
- SPHOME SP_HITCHK,W/2,H/2
- SPCOL SP_HITCHK,0,MSK
- SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
- SPCOLOR SP_HITCHK,#C_CLEAR
- '--- 進行方向にあるスプライトを探す
- VAR CNT=0
- VAR NX=SPHITSP(SP_HITCHK)
- IF NX!=-1 THEN
- '--- 1個目発見
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- '--- 他にもあるか?(続きの確認)
- LOOP
- NX=SPHITSP()
- IF NX==-1 THEN BREAK
- '---
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- IF CNT>=#MAX_CHKLIST THEN BREAK
- ENDLOOP
- '--- 1個だけなら自分自身
- IF CNT>1 THEN
- '--- 近い順に並べる
- SORT 0,CNT,CHKLIST,CHKSP
- NX=CHKSP[1] '0番目は自分自身なので1番目を使う
- RETURN NX
- ENDIF
- ENDIF
- '--- 正面に見つからないときは両側面を探す
- VAR CVX=SCW,CVY=SCW
- IF VX THEN CVX=0 ELSE CVY=0
- NX=-1
- LOOP
- BX=BX+(VX*W):BY=BY+(VY*H)
- IF BX<0 || BX>SCW THEN BREAK
- IF BY<0 || BY>SCH THEN BREAK
- SPOFS SP_HITCHK,BX,BY
- SPCOLVEC SP_HITCHK, CVX, CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- SPCOLVEC SP_HITCHK,-CVX,-CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- ENDLOOP
- '---
- RETURN NX
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINSTAT OUT ED,CP
- ED=#EDGE
- CP=#CAPH
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
- '--- BACKUP IMAGE
- WINGW=W+#EDGE*2
- WINGH=H+#EDGE*2+#CAPH
- WINGX=2048-WINGW
- WINGY=2048-WINGH
- OLDGP=GTARGET()
- GTARGET #GPAGE_WORK
- GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
- '--- CREATE WINDOW
- VAR EX=WINGX+WINGW,EY=WINGY+WINGH
- GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
- GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
- GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
- '--- CLOSE AREA
- WINCW=32:WINCH=#EDGE+#CAPH-2
- WINCX=EX-WINCW:WINCY=WINGY
- GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
- GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
- GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
- '--- キャプションをのぞいたざひょう
- WINHX=WINGX+#EDGE
- WINHY=WINGY+#EDGE+#CAPH
- GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
- GTARGET OLDGP
- '--- SPRITE:WINDOW
- VAR OLDSPG=SPPAGE()
- SPPAGE #GPAGE_WORK
- SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPOFS SP_WIN,X,Y
- '--- CLOSE BUTTON
- WINCX=X+WINGW-WINCW:WINCY=Y
- '--- SPRITE:SHADOW
- SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPLINK SP_SHADOW,SP_WIN
- SPCOLOR SP_SHADOW,RGB(160,0,0,0)
- SPOFS SP_SHADOW,3,3,20
- SPPAGE OLDSPG
- '--- CAPTION
- GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
- '---
- RETURN SP_WIN
- END
- '=======================================
- '■CLOSE
- '=======================================
- COMMON DEF SB_WINCLOSE
- SPCLR SP_WIN
- SPCLR SP_SHADOW
- GTARGET OLDGP
- GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
- END
- '=======================================
- '■CHECK CLOSE BUTTON
- '=======================================
- COMMON DEF SB_CHKWINCLOSE(X,Y)
- IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
- IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
- RETURN 1
- END
- '
- ' ### MULTILINE TEXT EDITOR
- '
- '=======================================
- '■文字列の入力(複数行対応)
- '=======================================
- COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
- '--- CALC DOTSIZE
- MSGTW=TW:MSGTH=TH
- VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
- VAR DH=(TH*MSGENTY)+#MSGOY
- '--- CREATE WINDOW
- SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
- GTARGET #GPAGE_WORK
- '--- MAX MSGLINE ON WINDOW
- MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
- MSGH=TH
- MSGGX=WINHX:MSGGY=WINHY
- MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
- '--- SPLIT MESSAGE
- VAR C$
- VAR I=0,MC=0
- FILL MSG$,""
- LOOP
- C$=MID$(MS$,I,1):INC I
- IF C$=="" THEN INC MC:BREAK
- IF C$==LF$ THEN
- INC MC
- ELSE
- IF LEN(MSG$[MC])<MSGTW THEN
- MSG$[MC]=MSG$[MC]+C$
- ENDIF
- ENDIF
- ENDLOOP
- IF MC==0 THEN INC MC
- MSGLINECNT=MC
- '--- SPRITE:CURSOR
- VAR OLDSPG=SPPAGE()
- CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
- CSRX=LEN(MSG$[CSRY])
- SPPAGE -1
- SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
- SPLINK SP_CSR,SP_WIN
- SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
- SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
- SPVAR SP_CSR,"OX",CSRX
- SPVAR SP_CSR,"OY",CSRY
- SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
- SPCOLOR SP_CSR,#C_CSRON
- SPANIM SP_CSR,"C",8,#C_CSRON,8,#C_CSROFF,0
- SETCSROFS SP_CSR
- SPPAGE OLDSPG
- '--- CHECK ENTER&DRAW
- FOR I=0 TO MSGH-1
- EDPUTLINE I
- NEXT
- '
- ' ### MAIN LOOP
- '
- LOOP
- VSYNC
- SB_INPUT 0 'USBKEY NOT GAMEMODE
- SB_TOUCHMOUSE 1
- EDITOR
- IF CHKCALL(USER$) THEN CALL USER$
- CALL SPRITE
- IF SB_BUTTON("BUTTON","IMPACT") AND (1<<#B_RDOWN) THEN BREAK
- IF ISESC THEN BREAK
- IF (MOSBI AND &H01) && SB_CHKWINCLOSE(MOSX,MOSY) THEN BREAK
- IF MOSBI AND &H02 THEN BREAK
- ENDLOOP
- '--- CLOSE
- SB_WINCLOSE
- SPCLR SP_CSR
- '--- MAKE MESSAGE
- VAR TX$=""
- FOR I=0 TO MSGH-1
- TX$=TX$+MSG$[I]+LF$
- NEXT
- RETURN TX$
- END
- '---------------------------------------
- ' INPUT CURSOR
- '---------------------------------------
- DEF SPFUNC_CSRINPUT
- SETCSROFS CALLIDX()
- END
- '---
- DEF SETCSROFS IX
- VAR HX=SPVAR(IX,"HX")
- VAR HY=SPVAR(IX,"HY")
- VAR OX=SB_MSGOFS(CSRX,MSG$[CSRY])
- VAR OY=CSRY*MSGENTY
- SPOFS IX,OX+HX,OY+HY
- END
- '---------------------------------------
- ' MULTI INPUT MAIN
- '---------------------------------------
- DEF EDITOR
- VAR OX=CSRX,OY=CSRY,O,W,L
- VAR HX,HY,DW,DH
- 'LOCATE 2,2
- 'PRINT FORMAT$("%3D,%3D",CSRX,CSRY)
- '--- GET VECTOR
- VAR VX,VY
- SB_BUTVEC "MIX","REPEAT" OUT VX,VY
- VAR BTN=SB_BUTTON("MIX","NEW")
- VAR BTI=SB_BUTTON("BUTTON","IMPACT")
- VAR BTR=SB_BUTTON("MIX","REPEAT")
- VAR INS=SB_KEYSTAT("INS")
- VAR ESC=SB_KEYSTAT("ESC")
- VAR BS=SB_KEYSTAT("BS")
- VAR DEL=SB_KEYSTAT("DEL")
- VAR ENT=SB_KEYSTAT("ENT")
- 'PRINT INS,ESC,BS,DEL,ENT,HEX$(BTN),HEX$(BTN),VX,VY
- '--- ACTION
- IF BS THEN EDSUBBS :VX=0:VY=0
- IF DEL THEN EDSUBDEL:VX=0:VY=0
- IF ENT THEN EDSUBENT:VX=0:VY=0
- IF KEY$!="" THEN EDSETCHR KEY$,INS:VX=0:VY=0
- '--- MOVE X
- VAR SX=LEN(MSG$[CSRY]),SY=MSGH
- CSRX=CSRX+VX
- IF VX<0 && CSRX<0 THEN
- CSRX=0:DEC CSRY
- IF CSRY<0 THEN CSRY=0 ELSE CSRX=LEN(MSG$[CSRY])
- ENDIF
- IF VX>0 && CSRX>SX THEN
- CSRX=SX
- INC CSRY
- IF CSRY>=SY THEN CSRY=SY-1 ELSE CSRX=0
- ENDIF
- '--- MOVE Y
- IF VX==0 && VY THEN
- CSRY=CSRY+VY
- IF CSRY<0 THEN CSRY=0
- IF CSRY>=SY THEN CSRY=SY-1
- ENDIF
- SX=LEN(MSG$[CSRY])
- IF CSRX>SX THEN CSRX=SX
- END
- '---------------------------------------
- ' BACKSPACE:1文字前を消す
- '---------------------------------------
- DEF EDSUBBS
- VAR C$,H$,T$,M$=MSG$[CSRY]
- VAR NX,I,L=LEN(M$),L2
- '--- 一番前?
- IF CSRX==0 THEN
- '--- カーソルより後ろに文字列があるか?
- NX=LEN(MSG$[CSRY-(CSRY!=0)])
- IF L THEN
- '--- 上の行に残り文字列を結合
- IF CSRY THEN
- '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
- H$=MSG$[CSRY-1]:NX=LEN(MSG$[CSRY-1])
- WHILE M$!=""
- C$=LEFT$(M$,1)
- IF SB_MSGLEN( H$+C$ )>MSGGW THEN BREAK
- M$=RIGHT$(M$,LEN(M$)-1)
- H$=H$+C$
- WEND
- '--- 上の行に収まりきらなかったら一部を結合し残りは前の行に残す
- MSG$[CSRY-1]=H$:EDPUTLINE CSRY-1
- MSG$[CSRY]=M$ :EDPUTLINE CSRY
- ENDIF
- ENDIF
- '--- 1行削除
- IF M$=="" THEN
- FOR I=CSRY TO MSGH-1
- MSG$[I]=MSG$[I+1]:EDPUTLINE I
- NEXT
- MSG$[MSGH-1]="":EDPUTLINE MSGH-1
- ENDIF
- IF CSRY THEN DEC CSRY:CSRX=NX
- RETURN
- ENDIF
- '---
- H$=MID$(M$,0,CSRX-1)
- T$=MID$(M$,CSRX,L-CSRX)
- DEC CSRX
- MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' DELETE:1文字後ろを消す
- '---------------------------------------
- DEF EDSUBDEL
- VAR C$,H$,T$,M$=MSG$[CSRY]
- VAR I,L=LEN(M$)
- '--- 一番後ろ?
- IF CSRX>=L THEN
- '--- 下の行から持ってこれるだけ持ってくる
- IF CSRY!=MSGH-1 THEN
- '--- 1文字ずつ追加して収まるかどうかを判定(プロポーショナル対応)
- H$=MSG$[CSRY+1]
- WHILE H$!=""
- C$=LEFT$(H$,1)
- IF SB_MSGLEN( M$+C$ )>MSGGW THEN BREAK
- H$=RIGHT$(H$,LEN(H$)-1)
- M$=M$+C$
- WEND
- MSG$[CSRY+1]=H$:EDPUTLINE CSRY+1
- MSG$[CSRY]=M$ :EDPUTLINE CSRY
- '--- 1行削除?
- IF H$=="" THEN
- FOR I=CSRY+1 TO MSGH-1
- MSG$[I]=MSG$[I+1]:EDPUTLINE I
- NEXT
- MSG$[MSGH-1]="":EDPUTLINE MSGH-1
- ENDIF
- ENDIF
- RETURN
- ENDIF
- '--- 後ろを消す
- H$=MID$(M$,0,CSRX)
- T$=MID$(M$,CSRX+1,L-CSRX)
- MSG$[CSRY]=H$+T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' 1文字追加
- '---------------------------------------
- DEF EDSETCHR K$,INS
- '--- 新しい文字は文字数内か?
- VAR M$=MSG$[CSRY]
- IF LEN(M$)>=MSGTW THEN RETURN
- '--- 新しい文字はドット範囲に収まるか?
- VAR L=SB_MSGLEN(M$)
- VAR SX=SB_CHRSIZE(MID$(M$,CSRX,1))
- IF L+SX>MSGGW THEN RETURN '入らない時に押し出すか?
- '--- 新しい文字を追加
- L=LEN(M$):SX=CSRX:IF SX>L THEN SX=L
- VAR H$=MID$(M$,0,SX)
- VAR T$=MID$(M$,CSRX,L-SX)
- MSG$[CSRY]=H$+K$+T$:EDPUTLINE CSRY
- INC CSRX
- END
- '---------------------------------------
- ' 改行
- '---------------------------------------
- DEF EDSUBENT
- VAR M$=MSG$[CSRY]
- VAR I,L=LEN(M$)
- IF CSRY==MSGH-1 THEN RETURN '空きなし
- '--- 最後の行に空きがあるか?
- IF MSG$[MSGH-1]!="" THEN RETURN '空きなし
- '--- 1行ずらす
- FOR I=MSGH-1 TO CSRY+1 STEP -1
- MSG$[I]=MSG$[I-1]:EDPUTLINE I
- NEXT
- '--- 改行時のカーソルより後ろを新しい行へ
- VAR H$=MID$(M$,0,CSRX)
- VAR T$=MID$(M$,CSRX,L-CSRX)
- MSG$[CSRY]=H$:EDPUTLINE CSRY
- CSRX=0:INC CSRY
- MSG$[CSRY]=T$:EDPUTLINE CSRY
- END
- '---------------------------------------
- ' 1行再表示
- '---------------------------------------
- DEF EDPUTLINE Y
- VAR HX=MSGGX
- VAR HY=MSGGY+Y*MSGENTY+#MSGOY
- GFILL HX,HY,HX+MSGGW-1,HY+MSGENTY-1,#C_WINBASE
- SB_GMSG HX,HY,MSG$[Y],#C_WHITE,#ALP
- END
- '
- ' ### FONT/MESSAGE
- '
- '=======================================
- '■メッセージ関係の初期化
- '=======================================
- COMMON DEF SB_INITMSG PR,FS,MG,LY
- IF PR==0 THEN MG=0
- FONTPROP=PR
- FONTSIZE=FS
- MSGMARGIN=MG
- MSGENTY=LY+FONTSIZE
- END
- '=======================================
- '■文字列全体のドット数
- '=======================================
- COMMON DEF SB_MSGLEN( TX$ )
- RETURN SB_MSGOFS( LEN(TX$),TX$ )
- END
- '=======================================
- '■文字列の指定位置までのドット数
- '=======================================
- COMMON DEF SB_MSGOFS( OX,TX$ )
- VAR I=0,X=0,C,W,SC=1,SPC
- VAR C$
- WHILE I<OX
- C$=MID$(TX$,I,1):INC I
- IF C$==CHR$(10) || C$=="" THEN BREAK
- X=X+(SB_CHRSIZE(C$)+MSGMARGIN)*SC
- WEND
- RETURN X
- END
- '=======================================
- '■指定1文字のドット数
- '=======================================
- COMMON DEF SB_CHRSIZE(C$)
- VAR C,FS=FONTSIZE
- IF C$!="" THEN
- C=ASC(C$)
- IF C>=32 && C<128 THEN
- IF FONTPROP THEN FS=FONTW[C]
- ENDIF
- ENDIF
- RETURN FS
- END
- '=======================================
- '■1行表示(プロポーショナル対応)
- '=======================================
- COMMON DEF SB_GMSG HX,HY,TX$,COL,ALP
- VAR I=0,X=0,Y=0,C,FX,W,SC=1
- VAR SPC,TX=HX,ST=FONTSIZE
- VAR C$
- LOOP
- C$=MID$(TX$,I,1):INC I
- IF C$=="" THEN BREAK
- C=ASC(C$):FX=0:W=FONTSIZE:SPC=MSGMARGIN
- IF C<128 THEN
- W=SB_CHRSIZE(C$)
- IF W==FONTSIZE THEN FX=0:SPC=0 ELSE FX=FONTX[C]:SPC=1
- HX=HX-FX*SC
- ENDIF
- GPUTCHR X+HX,Y+HY,C$,ST,SC,SC,COL,ALP
- X=X+(FX+W+SPC)*SC
- ENDLOOP
- END
- '=======================================
- '■フォントのサイズと開始点を調査(プロポーショナル用)
- '=======================================
- COMMON DEF SB_CHKFONT SPCSIZE
- VAR P=GTARGET()
- GTARGET 5 'FONT
- '---
- VAR I=0,U,V,W,H,HX
- VAR SX,HSW,SSW,FS=FONTSIZE
- VAR VTOP=(FS==16)*1024
- VAR C,A,R,G,B
- FOR V=VTOP TO VTOP+FS*2-1 STEP FS
- FOR U=0 TO FS*64-1 STEP FS
- HX=0:SX=0:HSW=0:SSW=0
- FOR W=0 TO FS-1
- FOR H=0 TO FS-1
- RGB GPGET(U+W,H+V) OUT A,R,G,B
- IF A THEN BREAK
- NEXT
- IF H==FS THEN
- IF HSW==0 THEN INC HX ELSE BREAK
- ELSE
- IF HSW==0 THEN HSW=1
- IF HSW THEN INC SX
- ENDIF
- NEXT
- IF HX==FS THEN HX=0:SX=FS
- FONTX[I]=HX:FONTW[I]=SX
- INC I
- NEXT
- NEXT
- '--- SPACE
- C=ASC(" ")
- FONTX[C]=0
- FONTW[C]=SPCSIZE
- '---
- GTARGET P
- END
- '
- ' ### BUTTON/KEY/STICK
- '
- '=======================================
- '■入力系デバイス読込み
- '---------------------------------------
- ' USB=1:USBKEY IS GAMEMODE
- '=======================================
- COMMON DEF SB_INPUT USB
- '--- USBKEY
- CONST #USBKEY_ESC =&H29
- CONST #USBKEY_SPACE =&H2C
- CONST #USBKEY_UP =&H52
- CONST #USBKEY_DOWN =&H51
- CONST #USBKEY_LEFT =&H50
- CONST #USBKEY_RIGHT =&H4F
- CONST #USBKEY_ENTER =&H28
- CONST #USBKEY_ENTER2=&H58
- CONST #USBKEY_CTRL =&HE0
- CONST #USBKEY_CTRL2 =&HE4
- CONST #USBKEY_ALT =&HE2
- CONST #USBKEY_ALT2 =&HE6
- CONST #USBKEY_WIN =&HE3
- CONST #USBKEY_WIN2 =&HE7
- CONST #USBKEY_SHIFT =&HE1
- CONST #USBKEY_SHIFT2=&HE5
- CONST #USBKEY_CAPS =&H39
- CONST #USBKEY_TAB =&H2B
- CONST #USBKEY_INS =&H49
- CONST #USBKEY_DEL =&H4C
- CONST #USBKEY_BS =&H2A
- CONST #USBKEY_HANZEN=&H35
- CONST #USBKEY_AT =&H2F
- '---
- CONST #USBKEY_1 =&H1E
- CONST #USBKEY_2 =&H1F
- CONST #USBKEY_3 =&H20
- CONST #USBKEY_4 =&H21
- CONST #USBKEY_5 =&H22
- CONST #USBKEY_6 =&H23
- CONST #USBKEY_7 =&H24
- CONST #USBKEY_8 =&H25
- CONST #USBKEY_9 =&H26
- CONST #USBKEY_0 =&H27
- CONST #USBKEY_MINUS =&H2D
- CONST #USBKEY_CARET =&H2E '^
- CONST #USBKEY_YEN =&H89
- '---
- CONST #USBKEY_A =&H04
- CONST #USBKEY_B =&H05
- CONST #USBKEY_C =&H06
- CONST #USBKEY_D =&H07
- CONST #USBKEY_E =&H08
- CONST #USBKEY_F =&H09
- CONST #USBKEY_G =&H0A
- CONST #USBKEY_H =&H0B
- CONST #USBKEY_I =&H0C
- CONST #USBKEY_J =&H0D
- CONST #USBKEY_K =&H0E
- CONST #USBKEY_L =&H0F
- CONST #USBKEY_M =&H10
- CONST #USBKEY_N =&H11
- CONST #USBKEY_O =&H12
- CONST #USBKEY_P =&H13
- CONST #USBKEY_Q =&H14
- CONST #USBKEY_R =&H15
- CONST #USBKEY_S =&H16
- CONST #USBKEY_T =&H17
- CONST #USBKEY_U =&H18
- CONST #USBKEY_V =&H19
- CONST #USBKEY_W =&H1A
- CONST #USBKEY_X =&H1B
- CONST #USBKEY_Y =&H1C
- CONST #USBKEY_Z =&H1D
- '
- ' KEY(FROM BASIC)
- '
- VAR KEYBS=0,KEYENT=0
- OLDKEY$=KEY$:KEY$=INKEY$()
- IF KEY$!="" THEN
- IF KEY$==CHR$(8) THEN
- KEY$="":KEYBS=1 'BACKSPACE
- ELSEIF KEY$==CHR$(13) THEN
- KEY$="":KEYENT=1 'ENTER
- ELSEIF ASC(KEY$)<&H20 THEN
- KEY$=""
- ENDIF
- ENDIF
- '
- ' KEY(FROM USB)
- '
- VAR N=0
- IF KEYBOARD(#USBKEY_UP,0) THEN N=N OR (1<<#B_LUP)
- IF KEYBOARD(#USBKEY_DOWN,0) THEN N=N OR (1<<#B_LDOWN)
- IF KEYBOARD(#USBKEY_LEFT,0) THEN N=N OR (1<<#B_LLEFT)
- IF KEYBOARD(#USBKEY_RIGHT,0) THEN N=N OR (1<<#B_LRIGHT)
- '---
- IF USB THEN
- IF KEYBOARD(#USBKEY_SPACE,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_W,0) THEN N=N OR (1<<#B_LUP)
- IF KEYBOARD(#USBKEY_S,0) THEN N=N OR (1<<#B_LDOWN)
- IF KEYBOARD(#USBKEY_A,0) THEN N=N OR (1<<#B_LLEFT)
- IF KEYBOARD(#USBKEY_D,0) THEN N=N OR (1<<#B_LRIGHT)
- IF KEYBOARD(#USBKEY_Z,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_X,0) THEN N=N OR (1<<#B_RDOWN) 'B
- IF KEYBOARD(#USBKEY_C,0) THEN N=N OR (1<<#B_RLEFT) 'Y
- IF KEYBOARD(#USBKEY_V,0) THEN N=N OR (1<<#B_RUP) 'X
- IF KEYBOARD(#USBKEY_ALT,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_ALT2,0) THEN N=N OR (1<<#B_RRIGHT) 'A
- IF KEYBOARD(#USBKEY_WIN,0) THEN N=N OR (1<<#B_RDOWN) 'B
- IF KEYBOARD(#USBKEY_WIN2,0) THEN N=N OR (1<<#B_RDOWN) 'B
- ENDIF
- '--- L/R
- IF KEYBOARD(#USBKEY_SHIFT,0) THEN N=N OR (1<<#B_L1)
- IF KEYBOARD(#USBKEY_CTRL,0) THEN N=N OR (1<<#B_L2)
- IF KEYBOARD(#USBKEY_SHIFT2,0) THEN N=N OR (1<<#B_R1)
- IF KEYBOARD(#USBKEY_CTRL2,0) THEN N=N OR (1<<#B_R2)
- '---
- KEYSUB #INP_KEY,N
- '--- SPECIAL KEY
- ISSHIFT=KEYBOARD(#USBKEY_SHIFT,0) OR KEYBOARD(#USBKEY_SHIFT2,0)
- ISCTRL=KEYBOARD(#USBKEY_CTRL,0) OR KEYBOARD(#USBKEY_CTRL2,0)
- ISESC=KEYBOARD(#USBKEY_ESC,2)
- IF KEYBOARD(#USBKEY_INS,2) THEN INSMODE=!INSMODE
- IF KEYBOARD(#USBKEY_CAPS,2) THEN CAPSMODE=!CAPSMODE
- KEYREP KEYBOARD(#USBKEY_TAB,0),TABCNT OUT ISTAB,TABCNT
- VAR B=KEYBS OR KEYBOARD(#USBKEY_BS,0)
- KEYREP B,BSCNT OUT ISBS,BSCNT
- KEYREP KEYBOARD(#USBKEY_DEL,0),DELCNT OUT ISDEL,DELCNT
- VAR E=KEYBOARD(#USBKEY_ENTER,0) OR KEYBOARD(#USBKEY_ENTER2,0) OR KEYENT
- KEYREP E,ENTCNT OUT ISENT,ENTCNT
- '
- ' BUTTON
- '
- KEYSUB #INP_BUTTON,BUTTON(0)
- '
- ' STICK(L)
- '
- VAR X,Y,LM=0.2
- STICK 0,0 OUT X,Y
- N=0
- IF X>-LM && X<LM THEN X=0
- IF Y>-LM && Y<LM THEN Y=0
- IF Y<-LM THEN N=N OR (1<<#B_LUP)
- IF Y> LM THEN N=N OR (1<<#B_LDOWN)
- IF X<-LM THEN N=N OR (1<<#B_LLEFT)
- IF X> LM THEN N=N OR (1<<#B_LRIGHT)
- KEYSUB #INP_STICKL,N
- '
- ' STICK(R)
- '
- STICK 0,1 OUT X,Y
- N=0
- IF X>-LM && X<LM THEN X=0
- IF Y>-LM && Y<LM THEN Y=0
- IF Y<-LM THEN N=N OR (1<<#B_LUP)
- IF Y> LM THEN N=N OR (1<<#B_LDOWN)
- IF X<-LM THEN N=N OR (1<<#B_LLEFT)
- IF X> LM THEN N=N OR (1<<#B_LRIGHT)
- KEYSUB #INP_STICKR,N
- '
- ' MIX
- '
- VAR S,RX=0,RY=0,ID=#INP_MIX
- X=0:Y=0
- '--- VECTOR
- FOR N=0 TO #MAX_IDTBL-1
- S=IDTBL[N]
- IF INP[S,#IMD_VX] THEN X=INP[S,#IMD_VX]
- IF INP[S,#IMD_VY] THEN Y=INP[S,#IMD_VY]
- IF INP[S,#IMD_REPVX] THEN RX=INP[S,#IMD_REPVX]
- IF INP[S,#IMD_REPVY] THEN RY=INP[S,#IMD_REPVY]
- NEXT
- INP[ID,#IMD_VX]=X
- INP[ID,#IMD_VY]=Y
- INP[ID,#IMD_REPVX]=RX
- INP[ID,#IMD_REPVY]=RY
- '--- BUTTON
- VAR TP
- TP=#IMD_NEW :INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- TP=#IMD_REPEAT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- TP=#IMD_IMPACT:INP[ID,TP]=INP[#INP_KEY,TP] OR INP[#INP_BUTTON,TP]
- END
- '---------------------------------------
- ' CHECK KEY REPEAT
- '---------------------------------------
- DEF KEYREP N,C OUT _F,_C
- _F=0:_C=0
- IF N==0 THEN RETURN
- _C=C+1
- _F=((_C==1) || ((_C>=KW1) && ((_C-KW1) MOD KW2)==0))
- END
- '---------------------------------------
- ' CHECK REPEAT, MAKE VECTOR
- '---------------------------------------
- DEF KEYSUB ID,N
- '---
- INP[ID,#IMD_OLD]=INP[ID,#IMD_NEW]
- INP[ID,#IMD_NEW]=N
- '--- IMPACT
- INP[ID,#IMD_IMPACT]=N AND (NOT INP[ID,#IMD_OLD])
- '--- REPEAT
- VAR R=0,T=INP[ID,#IMD_TIME]
- IF INP[ID,#IMD_OLD]!=N THEN T=0 ELSE INC T
- IF T==0 || (T>=KW1 && ((T-KW1) MOD KW2)==0) THEN R=N
- INP[ID,#IMD_TIME]=T
- INP[ID,#IMD_REPEAT]=R
- '--- VECTOR(REPEAT)
- VAR VX=0,VY=0
- IF R AND (1<<#B_LUP) THEN DEC VY
- IF R AND (1<<#B_LDOWN) THEN INC VY
- IF R AND (1<<#B_LLEFT) THEN DEC VX
- IF R AND (1<<#B_LRIGHT) THEN INC VX
- INP[ID,#IMD_REPVX]=VX
- INP[ID,#IMD_REPVY]=VY
- '--- VECTOR(NEW)
- VX=0:VY=0
- IF N AND (1<<#B_LUP) THEN DEC VY
- IF N AND (1<<#B_LDOWN) THEN INC VY
- IF N AND (1<<#B_LLEFT) THEN DEC VX
- IF N AND (1<<#B_LRIGHT) THEN INC VX
- INP[ID,#IMD_VX]=VX
- INP[ID,#IMD_VY]=VY
- END
- '=======================================
- '■特殊キーの状態
- '=======================================
- COMMON DEF SB_KEYSTAT(N$)
- IF N$=="INS" || N$=="INSERT" THEN RETURN INSMODE
- IF N$=="ESC" || N$=="ESCAPE" THEN RETURN ISESC
- IF N$=="BS" || N$=="BACKSPACE" THEN RETURN ISBS
- IF N$=="DEL" || N$=="DELETE" THEN RETURN ISDEL
- IF N$=="ENT" || N$=="ENTER" THEN RETURN ISENT
- IF N$=="CAPS" || N$=="CAPSLOCK" THEN RETURN CAPSMODE
- IF N$=="SHIFT" THEN RETURN ISSHIFT
- IF N$=="CTRL" THEN RETURN ISCTRL
- END
- '=======================================
- '■ビット単位のボタン情報
- '=======================================
- COMMON DEF SB_BUTTON(ID$,MD$)
- VAR ID,MD
- GETIDMODE ID$,MD$ OUT ID,MD
- IF ID==-1 || MD==-1 THEN RETURN 0 'NONE
- RETURN INP[ID,MD]
- END
- '---------------------------------------
- ' GET ID&MODE
- '---------------------------------------
- DEF GETIDMODE ID$,MD$ OUT _ID,_MD
- VAR ID=-1,MD=-1
- '---
- IF ID$=="MIX" THEN ID=#INP_MIX
- IF ID$=="BUTTON" THEN ID=#INP_BUTTON
- IF ID$=="KEY" THEN ID=#INP_KEY
- IF ID$=="STICKL" THEN ID=#INP_STICKL
- IF ID$=="STICKR" THEN ID=#INP_STICKR
- '---
- IF MD$=="NEW" THEN MD=#IMD_NEW
- IF MD$=="REPEAT" THEN MD=#IMD_REPEAT
- IF MD$=="IMPACT" THEN MD=#IMD_IMPACT
- IF MD$=="RELEASE" THEN MD=#IMD_RELEASE
- IF MD$=="OLD" THEN MD=#IMD_OLD
- '---
- _ID=ID
- _MD=MD
- END
- '=======================================
- '■方向キーによる移動量
- '=======================================
- COMMON DEF SB_BUTVEC ID$,MD$ OUT _VX,_VY
- VAR ID,MD
- GETIDMODE ID$,MD$ OUT ID,MD
- _VX=0:_VY=0
- IF ID!=-1 THEN
- IF MD$=="NEW" THEN
- _VX=INP[ID,#IMD_VX]
- _VY=INP[ID,#IMD_VY]
- ELSEIF MD$=="REPEAT" THEN
- _VX=INP[ID,#IMD_REPVX]
- _VY=INP[ID,#IMD_REPVY]
- ENDIF
- ENDIF
- END
- '=======================================
- '■タッチ&マウス情報取得
- '=======================================
- COMMON DEF SB_TOUCHMOUSE SW
- '--- TOUCH
- TOUCH OUT TCS,TCX,TCY
- TCR=(TCS==1) || ((TCS>KW1) && (((TCS-KW1) MOD KW2)==0))
- '--- MOUSE:BUTTON
- OLDMOSBN=MOSBN
- MOSBN=MBUTTON() 'b0=L,b1=R,b2=C
- IF MOSBN==0 THEN MOSBN=MOSBN OR (TCS==1)
- MOSBI=MOSBN AND (NOT OLDMOSBN)
- VAR MC=MOSBNCNT
- IF OLDMOSBN==MOSBN THEN INC MC ELSE MC=0
- IF MC==1 || ((MC>KW1) && (((MC-KW1) MOD KW2)==0)) THEN
- MOSBR=MOSBN
- ELSE
- MOSBR=0
- ENDIF
- MOSBNCNT=MC
- '--- MOUSE:座標&ホイール
- OLDMOSX=MOSX
- OLDMOSY=MOSY
- OLDMOSW=MOSW
- MOUSE 0 OUT MOSX,MOSY,MOSW
- IF SW && TCS THEN MOSX=TCX:MOSY=TCY
- MOSVX=MOSX-OLDMOSX
- MOSVY=MOSY-OLDMOSY
- MOSVW=MOSW-OLDMOSW
- END
- '=======================================
- '■タッチ情報取得
- '=======================================
- COMMON DEF SB_GETTOUCH OUT X,Y,N,R
- X=TCX:Y=TCY:N=TCS:R=TCR
- END
- '=======================================
- '■マウス情報取得
- '=======================================
- COMMON DEF SB_GETMOUSE OUT X,Y,W
- X=MOSX:Y=MOSY:W=MOSW
- END
- '---
- COMMON DEF SB_GETMOSBUT OUT N,I,R
- N=MOSBN:I=MOSBI:R=MOSBR
- END
- '---
- COMMON DEF SB_GETMOSVEC OUT X,Y,W
- X=MOSVX:Y=MOSVY:W=MOSVW
- END
- '=======================================
- '■角丸四角の描画(かならずぐうすうさいずになる)
- '=======================================
- COMMON DEF GRFILL X1,Y1,X2,Y2,C,R
- GPUTBUT X1,Y1,X2,Y2,C,R,0
- END
- '=======================================
- '■角丸四角ボタンの描画(かならずぐうすうさいずになる)
- 'X1,Y1:してん
- 'X2,Y2:しゅうてん
- ' C:いろ
- ' R:角丸はんけい
- ' ATR:角四角していビット(b3= b2= b1= b0=)
- '=======================================
- COMMON DEF GPUTBUT X1,Y1,X2,Y2,C,R,ATR
- '--- はばとたかさをもとめる(いちのちょうせいふくむ)
- IF X1>X2 THEN SWAP X1,X2
- IF Y1>Y2 THEN SWAP Y1,Y2
- VAR W=(((X2-X1)+1) DIV 2)*2
- VAR H=(((Y2-Y1)+1) DIV 2)*2
- VAR RR=R*2
- VAR CX=X1+W/2,CY=Y1+H/2
- '--- たてなが?
- IF W<H && RR>W THEN
- R=W/2
- GCIRCLEF CX,Y1+R,R,C,ATR AND &B1100
- GCIRCLEF CX,Y2-R,R,C,ATR AND &B0011
- GFILL X1,Y1+R,X2,Y2-R,C
- RETURN
- ENDIF
- '--- よこなが?
- IF W>H && RR>H THEN
- R=H/2
- GCIRCLEF X1+R,CY,R,C,ATR AND &B1100
- GCIRCLEF X2-R,CY,R,C,ATR AND &B0011
- GFILL X1+R,Y1,X2-R,Y2,C
- RETURN
- ENDIF
- '--- つうじょう
- GCIRCLEF X1+R,Y1+R,R,C,ATR AND &B1000
- GCIRCLEF X2-R,Y1+R,R,C,ATR AND &B0100
- GCIRCLEF X1+R,Y2-R,R,C,ATR AND &B0010
- GCIRCLEF X2-R,Y2-R,R,C,ATR AND &B0001
- GFILL X1+R,Y1,X2-R,Y2,C
- GFILL X1,Y1+R,X2,Y2-R,C
- END
- '---------------------------------------
- ' CIRCLE/FILL
- '---------------------------------------
- DEF GCIRCLEF X,Y,RR,C,ATR
- IF ATR THEN
- GFILL X-RR,Y-RR,X+RR,Y+RR,C
- RETURN
- ENDIF
- '--- 色分解
- VAR R,G,B,A,TP=#G_ALPHA
- RGB C OUT A,R,G,B
- '---
- GCIRCLE X,Y,RR,RGB(1,R,G,B)
- GPAINT X,Y,C,RGB(1,R,G,B)
- GCIRCLE X,Y,RR,C
- '--- アンチエイリアス用に色分解
- 'VAR R,G,B,A,TP=#G_ALPHA
- 'RGB C OUT A,R,G,B
- 'VAR C2=RGB(200,R/2,G/2,B/2)
- 'GCIRCLE X,Y,RR,C2,#G_ALPHA
- END
- '===== END OF SOURCE =====
- '"
- ' SMILEBOOM LIBRARY "
- '"
- '
- ' どこか適当なスロットでEXECしてから利用します
- '
- ' (C)SMILEBOOM
- '
- ' 2019.01.07:USBKEY、BUTTON、STICKの統合型情報取得
- ' 2019.01.07:フォントの状態確認
- ' 2019.01.07:複数行対応の文字列入力ウィンドウ
- ' 2019.01.08:BUTVECのタイプ対応
- ' 2019.02.04:複数行入力はすべての行を返す
- '---------------------------------------
- ' 2019.03.31:文字列入力の引数を文字数に変更
- ' 2019.04.11:最初の文字列が受け取れないバグ修正
- '---------------------------------------
- ' 2019.04.14:複数行入力プロポーショナル扱いをやめる
- ' 2019.04.24:INKEY$()のBSとENTERを受け付ける
- ' 2019.04.30:スプライト検索処理追加
- ' 2019.05.07:GRFILL(角丸四角の描画)
- ' 2019.05.07:GPUTBUT(角丸四角ボタンの描画)
- '
- OPTION STRICT
- VAR VER$="1.1"
- '--- BUTTON(KEYBOARD/STICK)
- ENUM \
- #INP_MIX=0,\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL,\
- #INP_STICKR,\
- #MAX_INP
- ENUM \
- #IMD_NEW=0,\
- #IMD_REPEAT,\
- #IMD_IMPACT,\
- #IMD_RELEASE,\
- #IMD_VX,\
- #IMD_VY,\
- #IMD_REPVX,\
- #IMD_REPVY,\
- #IMD_OLD,\
- #IMD_TIME,\
- #IMD_X,\
- #IMD_Y,\
- #MAX_IMD
- CONST #MAX_IDTBL=3
- DIM IDTBL[#MAX_IDTBL]=[\
- #INP_BUTTON,\
- #INP_KEY,\
- #INP_STICKL\
- ]
- VAR OLDKEY$="",KEY$=""
- VAR INSMODE=0,CAPSMODE=0,ISESC=0,ISSHIFT=0,ISCTRL=0
- VAR ISBS=0,BSCNT=0,ISDEL=0,DELCNT=0
- VAR ISENT=0,ENTCNT=0,ISTAB=0,TABCNT=0
- VAR INP[#MAX_INP,#MAX_IMD]
- '--- TOUCH&MOUSE
- VAR TCX=0,TCY=0,TCS=0,TCR=0
- VAR OLDMOSBN=0,MOSBNCNT=0,MOSBN=0,MOSBR=0,MOSBI=0
- VAR OLDMOSX=0,OLDMOSY=0,MOSX=0,MOSY=0,MOSVX=0,MOSVY=0
- VAR OLDMOSW=0,MOSW=0,MOSVW=0
- '--- KEY REPEAT
- VAR KW1,KW2
- SYSPARAM "KEYREPEAT" OUT KW1,KW2
- '--- FONT
- DIM FONTX[128],FONTW[128]
- VAR FONTPROP=0,FONTSIZE=16
- '--- SCREEN
- VAR SCW,SCH
- '--- GPAGE
- CONST #GPAGE_WORK =0
- CONST #GPAGE_DEFSP=4
- '--- WORK
- CONST #EDGE=2,#CAPH=11,#LCW=2
- VAR OLDGP
- VAR WINGX,WINGY,WINGW,WINGH,WINHX,WINHY
- VAR WINCX,WINCY,WINCW,WINCH
- DIM GTMP[2048*2048]
- '--- COLOR
- CONST #C_CSRON =#C_YELLOW 'RGB(240,255,255,200)
- CONST #C_CSROFF =RGB(120, 0,120,255)
- CONST #C_WINBASE=#C_NAVY
- CONST #C_WINEDGE=#C_WHITE
- CONST #C_CLOSE =RGB(255,128,128,220)
- '--- MESSAGE
- CONST #MSGOX=2,#MSGOY=4
- CONST #MAX_MSG=2048/16
- CONST #ALP=2
- CONST #DEFSPACE=4
- CONST #DEFENTY=2
- VAR LF$=CHR$(10)
- DIM MSG$[#MAX_MSG]
- VAR MSGLINECNT=0,MSGENTY=FONTSIZE
- VAR MSGW,MSGH,CSRX,CSRY
- VAR MSGGX,MSGGY,MSGGW,MSGGH
- VAR MSGTW,MSGTH
- VAR MSGMARGIN=0
- '--- SPRITE
- CONST #SP_LIBTOP =4090
- CONST #SP_LIBEND =4094
- VAR SPTOP =#SP_LIBTOP,SPEND=#SP_LIBEND
- VAR SP_WIN,SP_SHADOW,SP_CSR
- VAR SP_HITCHK
- '--- HIT CHECK
- CONST #MAX_CHKLIST=100
- DIM CHKLIST[#MAX_CHKLIST],CHKSP[#MAX_CHKLIST]
- '--- INITIALIZE
- SB_INITLIB #SP_LIBTOP,#SP_LIBEND
- END
- '--- DEBUG
- ACLS
- 'XSCREEN 640,360,2,0
- 'XSCREEN 1280,720,1,0
- VAR C$="複数行対応 テキストエディター"
- VAR M$="ABCdefghiJKlmn さんぷる"+LF$+"2ND LINE"+LF$+"てきとうなもじれつahikl"
- VAR A$=SB_EDIT$(32,64,320,128,C$,M$,"USER_FUNC")
- PRINT A$
- PRINT "LEN MSG:";SB_MSGLEN(M$)
- END
- '
- ' TEST(スロットを超えて呼び出されるので、必ず COMMONDEF として定義)
- '
- COMMON DEF USER_FUNC
- PRINT "USER"
- END
- '
- ' SMILEBOOM LIBRARY PROGRAM
- '
- '=======================================
- '■存在確認用
- '=======================================
- COMMON DEF SB_LIB()
- 'CHKCALL("SB_LIB")==TRUE
- RETURN VER$
- END
- '=======================================
- '■ライブラリ初期設定
- '=======================================
- COMMON DEF SB_INITLIB ST,SE
- '---
- SPTOP=ST:SPEND=SE
- '---
- XSCREEN OUT SCW,SCH
- '---
- SP_HITCHK=SPSET(SPTOP,SPEND,0,0,8,8,0)
- SPCOLOR SP_HITCHK,#C_CLEAR
- SB_CHKFONT #DEFSPACE
- SB_INITMSG FONTPROP,FONTSIZE,MSGMARGIN,#DEFENTY
- END
- '
- ' ### SPRITE HELPER
- '
- '=======================================
- '■進行方向にあるスプライトを探す(十字方向のみの移動に限定)
- '=======================================
- COMMON DEF SB_SPSCAN(SP,VX,VY,MSK)
- '--- 移動していない?
- IF VX==0 && VY==0 THEN RETURN -1
- '--- X優先(方向限定:斜めには動かさない)
- IF VX && VY THEN VY=0
- '--- 発生元情報取得
- VAR U,V,W,H,OX,OY
- SPOFS SP,1 OUT OX,OY
- SPCHR SP OUT U,V,W,H
- '--- 当たり判定用のスプライト準備
- VAR BX=OX+W/2,BY=OY+H/2
- SPOFS SP_HITCHK,BX,BY,-4000
- SPCHR SP_HITCHK,,,W,H
- SPHOME SP_HITCHK,W/2,H/2
- SPCOL SP_HITCHK,0,MSK
- SPCOLVEC SP_HITCHK,VX*SCW,VY*SCW
- SPCOLOR SP_HITCHK,#C_CLEAR
- '--- 進行方向にあるスプライトを探す
- VAR CNT=0
- VAR NX=SPHITSP(SP_HITCHK)
- IF NX!=-1 THEN
- '--- 1個目発見
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- '--- 他にもあるか?(続きの確認)
- LOOP
- NX=SPHITSP()
- IF NX==-1 THEN BREAK
- '---
- SPOFS NX,1 OUT OX,OY '+PARENT
- CHKSP[CNT]=NX
- CHKLIST[CNT]=((OX-BX)*VX)+((OY-BY)*VY)
- INC CNT
- IF CNT>=#MAX_CHKLIST THEN BREAK
- ENDLOOP
- '--- 1個だけなら自分自身
- IF CNT>1 THEN
- '--- 近い順に並べる
- SORT 0,CNT,CHKLIST,CHKSP
- NX=CHKSP[1] '0番目は自分自身なので1番目を使う
- RETURN NX
- ENDIF
- ENDIF
- '--- 正面に見つからないときは両側面を探す
- VAR CVX=SCW,CVY=SCW
- IF VX THEN CVX=0 ELSE CVY=0
- NX=-1
- LOOP
- BX=BX+(VX*W):BY=BY+(VY*H)
- IF BX<0 || BX>SCW THEN BREAK
- IF BY<0 || BY>SCH THEN BREAK
- SPOFS SP_HITCHK,BX,BY
- SPCOLVEC SP_HITCHK, CVX, CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- SPCOLVEC SP_HITCHK,-CVX,-CVY
- NX=SPHITSP(SP_HITCHK):IF NX!=-1 THEN BREAK
- ENDLOOP
- '---
- RETURN NX
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINSTAT OUT ED,CP
- ED=#EDGE
- CP=#CAPH
- END
- '=======================================
- '■ウィンドウ
- '=======================================
- COMMON DEF SB_WINOPEN(X,Y,W,H,CP$)
- '--- BACKUP IMAGE
- WINGW=W+#EDGE*2
- WINGH=H+#EDGE*2+#CAPH
- WINGX=2048-WINGW
- WINGY=2048-WINGH
- OLDGP=GTARGET()
- GTARGET #GPAGE_WORK
- GSAVE WINGX,WINGY,WINGW,WINGH,GTMP
- '--- CREATE WINDOW
- VAR EX=WINGX+WINGW,EY=WINGY+WINGH
- GFILL WINGX ,WINGY ,EX-1,EY-1,#C_CLEAR
- GFILL WINGX+1,WINGY ,EX-2,EY-1,#C_WINEDGE
- GFILL WINGX ,WINGY+1,EX-1,EY-2,#C_WINEDGE
- '--- CLOSE AREA
- WINCW=32:WINCH=#EDGE+#CAPH-2
- WINCX=EX-WINCW:WINCY=WINGY
- GFILL WINCX ,WINCY,WINCX+WINCW-1,WINCY+WINCH-2,#C_CLOSE
- GFILL WINCX+1 ,WINCY,WINCX+WINCW-1,WINCY+WINCH-1,#C_CLOSE
- GPUTCHR WINCX+13,WINCY+2,"",8,#C_WHITE,#ALP
- '--- キャプションをのぞいたざひょう
- WINHX=WINGX+#EDGE
- WINHY=WINGY+#EDGE+#CAPH
- GFILL WINHX,WINHY,WINHX+W-1,WINHY+H-1,#C_WINBASE
- GTARGET OLDGP
- '--- SPRITE:WINDOW
- VAR OLDSPG=SPPAGE()
- SPPAGE #GPAGE_WORK
- SP_WIN=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPOFS SP_WIN,X,Y
- '--- CLOSE BUTTON
- WINCX=X+WINGW-WINCW:WINCY=Y
- '--- SPRITE:SHADOW
- SP_SHADOW=SPSET(SPTOP,SPEND,WINGX,WINGY,WINGW,WINGH,0)
- SPLINK SP_SHADOW,SP_WIN
- SPCOLOR SP_SHADOW,RGB(160,0,0,0)
- SPOFS SP_SHADOW,3,3,20
- SPPAGE OLDSPG
- '--- CAPTION
- GPUTCHR WINGX+#EDGE+2,WINGY+#EDGE+1,CP$,8,#C_BLACK,#ALP
- '---
- RETURN SP_WIN
- END
- '=======================================
- '■CLOSE
- '=======================================
- COMMON DEF SB_WINCLOSE
- SPCLR SP_WIN
- SPCLR SP_SHADOW
- GTARGET OLDGP
- GLOAD WINGX,WINGY,WINGW,WINGH,GTMP,0
- END
- '=======================================
- '■CHECK CLOSE BUTTON
- '=======================================
- COMMON DEF SB_CHKWINCLOSE(X,Y)
- IF X<WINCX || X>=WINCX+WINCW THEN RETURN 0
- IF Y<WINCY || Y>=WINCY+WINCH THEN RETURN 0
- RETURN 1
- END
- '
- ' ### MULTILINE TEXT EDITOR
- '
- '=======================================
- '■文字列の入力(複数行対応)
- '=======================================
- COMMON DEF SB_EDIT$(DX,DY,TW,TH,CP$,MS$,USER$)
- '--- CALC DOTSIZE
- MSGTW=TW:MSGTH=TH
- VAR DW=(TW*(FONTSIZE+MSGMARGIN))+#MSGOX*2
- VAR DH=(TH*MSGENTY)+#MSGOY
- '--- CREATE WINDOW
- SP_WIN=SB_WINOPEN(DX,DY,DW,DH+#LCW,CP$)
- GTARGET #GPAGE_WORK
- '--- MAX MSGLINE ON WINDOW
- MSGW=TW 'DW DIV (FONTSIZE+MSGMARGIN)
- MSGH=TH
- MSGGX=WINHX:MSGGY=WINHY
- MSGGW=DW-MSGMARGIN*4:MSGGH=DH-MSGENTY
- '--- SPLIT MESSAGE
- VAR C$
- VAR I=0,MC=0
- FILL MSG$,""
- LOOP
- C$=MID$(MS$,I,1):INC I
- IF C$=="" THEN INC MC:BREAK
- IF C$==LF$ THEN
- INC MC
- ELSE
- IF LEN(MSG$[MC])<MSGTW THEN
- MSG$[MC]=MSG$[MC]+C$
- ENDIF
- ENDIF
- ENDLOOP
- IF MC==0 THEN INC MC
- MSGLINECNT=MC
- '--- SPRITE:CURSOR
- VAR OLDSPG=SPPAGE()
- CSRY=MSGLINECNT-1:IF CSRY>=MSGH-1 THEN CSRY=MSGH-1
- CSRX=LEN(MSG$[CSRY])
- SPPAGE -1
- SP_CSR=SPSET(SPTOP,SPEND,0,0,2,18,0)
- SPLINK SP_CSR,SP_WIN
- SPVAR SP_CSR,"HX",(WINHX-WINGX)+#EDGE/2
- SPVAR SP_CSR,"HY",(WINHY-WINGY)+#EDGE/2
- SPVAR SP_CSR,"OX",CSRX
- SPVAR SP_CSR,"OY",CSRY
- SPFUNC SP_CSR,"SPFUNC_CSRINPUT"
- SPCOLOR SP_CSR,#C_CSRON
- SPANIM SP_CSR,"C",8,#C_CSRON,
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement