Sunday, March 27, 2011

プチコンでYOPPAL

その昔、MSXの雑誌「MSX・FAN」に載っていた「YOPPAL」というゲームの移植です。当時「酔っぱらいゲーム」みたいにいわれていたかと思います。
パレットをMSXっぽくしたり超低機能MML再生をつけたりしたので、それなりにそっくりになってるかと。

DSiへ移植されたYOPPALの図



操作:
Aボタンで上昇しますが、常に重力があり、離すと下へいきます。
左右で横移動しますが、慣性がかかっています。
緑色の線を操作し、右下の黄色のゴールへたどり着くことが目的です。
全7面、オールクリアで、エンディングデモとクリアまでにかかったTIMEを表示します。

---PRG:YOPPAL
‘*** YOPPAL for DSi ***
CLEAR
DIM P(14)

VISIBLE 1,1,1,1,1,1
CLS:GCLS:SPCLR
CHRINIT “BGF0”
CHRINIT “BGU3”
GOSUB @PALINIT
GOSUB @PALSET
CHRSET “BGU3”,0,”1571000055570000455500001451000000000000000000000000000000000000”
RESTORE @NOTEDAT:FOR I=0 TO 13:READ P(I):NEXT I
RESTORE @SCENEDAT:FOR I=1 TO 7:READ O$(I):NEXT I

@NEWGAME
O=1:U=0

@MAIN
 GCLS 0
 FOR I=0 TO 1
  FOR J=0 TO 63
   GPUTCHR J*4,I*180,”BGU3”,0,0,1
  NEXT
  FOR J=1 TO 44
   GPUTCHR I*252,J*4,”BGU3”,0,0,1
  NEXT
 NEXT

 A$=O$(O)
 FOR I=0 TO 3:B=VAL(“&H”+MID$(A$,I*2,2)):G=128
  FOR J=1 TO 6:iF B>=G THEN GOSUB @WALLTATE:B=B-G
  G=FLOOR(G/2):NEXT J
 NEXT I
 FOR I=0 TO 4:B=VAL(“&H”+MID$(A$,I*2+8,2)):G=128
  FOR J=1 TO 6:IF B>=G THEN GOSUB @WALLYOKO:B=B-G
  G=FLOOR(G/2):NEXT J
 NEXT I
 GFILL 252,148,255,179,10:’GOAL

 X=20:Y=164:Z=3.5:V=0:W=0:OX=X:OY=Y:GCOLOR 3:GPSET X,Y
 A$="SCENE["+STR$(O)+"]":GX=0:GY=185:GOSUB @GPRINT

 @PLAY
 B=BUTTON():S=B AND 15:U=U+1
 IF S AND 4 THEN V=V-0.5:IF V<=-Z THEN V=-Z
 IF S AND 8 THEN V=V+0.5:IF V>=Z THEN V=Z
 IF B AND 16 THEN W=W-2:IF W<-3 THEN W=-3
 W=W+1:IF W>3 THEN W=3
 X=X+V:Y=Y+W:I=GSPOIT(X,Y)
 GLINE OX,OY,X,Y:OX=X:OY=Y
 VSYNC 3
 IF I==0 OR I==3 GOTO @PLAY
 IF I==10 THEN P$=“O6CDEFC”:GOSUB @MML:O=O+1
 IF I!=10 THEN P$=“O5GFEDC”:GOSUB @MML
 IF O==8 GOTO @ALLCLEAR
GOTO @MAIN

@ALLCLEAR
A$=“:TIME[“+STR$(U)+”]”:GX=64:GY=185:GOSUB @GPRINT
P$=“DEGCDEGEDC”:GOSUB @MML
FOR I=0 TO 1
GLINE X,Y,RND(255),RND(184),RND(16)
I=BUTTON() AND 15 VSYNC 2
NEXT:GOTO @NEWGAME

@MML
‘OCTAVE=O3~O6
‘CDEFGABC,#
M=0
@MMLLOOP
ML=1
N=ASC(MID$(P$,M,1))-ASC(“A”)
NN$=“”:IF M<LEN(P$)-1 THEN NN$=MID$(P$,M+1,1)
IF NN$=“#” THEN ML=2:N=N+8
IF N==14 AND NN$=“” GOTO @NEXTMML
IF N==14 THEN ML=2:OCT=(VAL(NN$)-3)*4096-8192:GOTO @NEXTMML
@PLAYMML
BEEP 0,FLOOR(OCT+341.3*P(N)+0.5)
VSYNC 5
@NEXTMML
M=M+ML
IF M<LEN(P$) GOTO @MMLLOOP
RETURN

@GPRINT
FOR M=0 TO LEN(A$)-1
 GPUTCHR GX+M*8,GY,"BGF0",ASC(MID$(A$,M,1)),0,1
NEXT M:RETURN

@WALLYOKO
FOR W=0 TO 9
 GPUTCHR J*36+W*4,I*36+36,”BGU3”,0,0,1
NEXT W:RETURN

@WALLTATE
FOR W=0 TO 9
 GPUTCHR J*36,I*36+W*4,”BGU3”,0,0,1
NEXT W:RETURN

@PALINIT
FOR M=0 TO 15
 COLINIT “BG”,M
 COLINIT “SP”,M
 COLINIT “GRP”,M
NEXT M:RETURN

@PALSET
RESTORE @PALDAT
FOR M=0 TO 15:READ C$
 COLSET “BG”,M,C$
 COLSET “GRP”,M,C$
NEXT M:RETURN

@NOTEDAT
DATA 9,11,0,2,4,5,7
DATA 10,11,1,3,4,6,8

@PALDAT
DATA 000000,000000,24DB24,6DFF6D
DATA 2424FF,496DFF,B62424,49DBFF
DATA FF2424,FF6D6D,DBDB24,DBDB92
DATA 249224,DB49B6,B6B6B6,FFFFFF

@SCENEDAT
DATA 4450047C00FCFC
DATA 7C381C3E0084C4C080
DATA 7C3E4C980080A06444
DATA 7CF24C860008287050
DATA 64384C861094A47050
DATA 70EC5820081424AC94
DATA 1C6ED00840A0286CA4
---

もし奇特にも約140行を打ち込まれて、動かなかったり、変な動きをするようでしたら、DSからの転記ミスなので教えてください。
修正します m(_ _)m

※7/6 転記ミスがありましたので修正しました(´・ω・`)

プチコンでGRAPHIC画面でコピー

プチコンには残念なことに、GRAPHIC画面で矩形コピーを行う命令がありません。
プチコンのサンプルプログラムGRPEDでは下画面から上画面へのコピーを
Yループ → Xループ → GPAGE 1:GPOINT → GPAGE 0:GPSET → XのNEXT → YのNEXT
で実現しています。

それでもいいのですが、同じもののコピーを繰り返す場合、8x8以下であれば、キャラ定義してしまえば速くなりそうです。
以下は4x4のパターンで四角を描く(たくさんコピーする)サンプルです。

---
CHRINIT "BGF3"
CHRSET “BGU3”,0,”1571000055570000455500001451000000000000000000000000000000000000”

 GCLS 0
 FOR I=0 TO 1
  FOR J=0 TO 63
   GPUTCHR J*4,I*180,”BGU3”,0,0,1
  NEXT
  FOR J=1 TO 44
   GPUTCHR I*252,J*4,”BGU3”,0,0,1
  NEXT
 NEXT
---

プチコン 画面最下行に文字

画面最下行に文字を表示する方法について

PRINTや?で画面最下行へ文字を表示しようとするとスクロールし、一行上になってしまいます。回避方法は2通りあると思いますが、それぞれ一長一短。

  1. BGPUT
  2. GRAPHIC

1.BGPUT
いいとこ:スクロールしないし、書き換えはBGPUTするだけ。
いまいち:キャラ定義が必要なので、フォントをBGF0からコピーしてくるか、自分で定義しなければなりません。

2.GRAPHIC
いいとこ:スクロールしないし、書き換えると今までのを消してくれるし、フォント定義は不要だし、表示位置をドット単位で指定可能、しかも1、2、4、8倍で表示できる
いまいち:BGPUTより少し遅いかも?

というわけでGRAPHIC画面へ文字を表示する@GPRINTルーチン(というほど大げさなものではない)です。

---
GPAGE 0:GCLS 0:O=1
A$="SCENE["+STR$(O)+"]":GX=0:GY=185:GOSUB @GPRINT
END

@GPRINT
FOR M=0 TO LEN(A$)-1
 GPUTCHR GX+M*8,GY,"BGF0",ASC(MID$(A$,M,1)),0,1
NEXT M
RETURN
---

Saturday, March 19, 2011

プチコンでフォント変更

プチコンホームページの SHADOW FONT  に刺激されて作成。
(というかつくってみたらプログラムが同じことに。。。)
太字、イタリック体。記号は見にくい...
※元に戻すときは、R+左+START

---PRG:COLORFNT
CHRINIT "BGF0"
CL$="FCC88888"
IT$="22111000"
CLS

FOR C=0 TO 255
 LOCATE 0,0:PRINT 255-C;"   ";
 CHRREAD("BGF0",C),C$  N$=""  FOR I=0 TO 7   F$=""   FOR J=0 TO 7    T$=MID$(C$,I*8+J,1):E$=T$    IF T$=="F" THEN E$=MID$(CL$,I,1):F$=""    'BOLD    IF T$=="F" AND J<7 THEN F$=E$    IF T$!="F" AND F$!="" THEN E$=F$:F$=""    '    D$=D$+E$   NEXT   'ITALIC   K=VAL(MID$(IT$,I,1))   IF K>0 THEN FOR L=1 TO K:D$="0"+D$:NEXT   D$=MID$(D$,0,8)   N$=N$+D$   '   D$=""  NEXT  CHRSET "BGF0",C,N$ NEXT
---
修正
http://ktstg.blog.shinobi.jp/Date/20110326/1/ より
---
IF T$=="F" AND F$!="" THEN E$=F$:F$=""の部分を
IF T$!="F" AND F$!="" THEN E$=F$:F$=""に

J=VAL(MID$(IT$,I,1))の部分を
K=VAL(MID$(IT$,I,1))に

---
ってまさにその通りで誤植でした。ソース直しました。

プチコン編集時の色

編集時はBGでマス目を表示していて、
  • 背景キャラクタ=21(&H15) ...BGF0のキャラクタ
  • 背景色=225(&HC7) ...BGのカラーコード
  • 前景色=239(&HEF) ...BGのカラーコード
を使っているようなので、以下を実行すると某8ビット機のような編集画面になる。
---
COLSET "BG",225,"2424FF"
COLSET "BG",239,"2424FF"
--- 
元MSXユーザにはぐっとくる画面
 
 
元に戻すときは 
---
COLINIT "BG",225
COLINIT "BG",239
--- 

プチコンでキャラクタ一覧

BGF0のキャラクタ一覧です。昔のBASIC触った人なら何となく作れてしまうようなものですが。。
フォント初期化してないので変えたときなどに。

---PRG:CHR
CLS:CLEAR
?"  0123456789ABCDEF":?
FOR I=0 TO 15:A$=HEX$(I)+" "
FOR J=0 TO 15:A$=A$+CHR$(I*16+J)
NEXT J:?A$
NEXT I
---

Sunday, March 13, 2011

プチコンのスプライト回転

プチコンでスプライトの回転は左上が回転の中心になるので、スプライトの(8,8)を中心に回転するように見えるプログラムを書いてみました。
回るつぼ
プログラムでは配列を使っていますが、リアルタイムで計算してもそんなに遅くないと思います。VSYNC 1をコメントアウトするとすごい速さで回転します。
---
CLEAR:CLS
VISIBLE 1,1,1,1,1,1
’SETUP
DIM DX(361),DY(361)
SS=0:SX=32:SY=32:SZ=200
W=FLOOR(8*SZ/100+0.5)
R=W*SQR(2)
PX=SX+W:PY=SY+W

FOR I=0 TO 360
 DG=I+45
 IF DG>=360 THEN DG=DG-360
 DX=FLOOR(COS(RAD(DG))*R+0.5)
 DY=FLOOR(SIN(RAD(DG))*R+0.5)
 DX(I)=DX:DY(I)=DY
NEXT

’DISP
SPCLR
SPSET SS,60,0,0,0,2
SPSCALE SS,SZ
SPOFS SS,SX,SY

ST=5
FOR I=0 TO 360 STEP ST
 A=I:S=SS:X=100:Y=100
 GOSUB @PUTSP
 VSYNC 1
NEXT

END

@PUTSP
SPOFS S,X+W-DX(A),Y+W-DY(A)
SPANGLE S,A,1
RETURN 
 

プチコン petitcom

プチコン
http://smileboom.com/special/petitcom/index.html

まとめWiki
http://wiki.hosiken.jp/petc/