Monday, November 28, 2011

そんなんAR..とは

ニコニコにあげた動画(プチコンでテトリス2)が監視されてたみたいです。少なくとも存在を察知されていた模様。似て非なるものにしてたつもりが。。
そういえば一時期「この動画は三原によって監視されています」ってタグがついてました(今は消えてます)。


変なことにならないようにしないと。

Tuesday, November 1, 2011

プチコンでテトリス2

テトリスを再び作りました。

どこかにありそうなゲーム画面
作成中だったものをyoutubeにアップロード


前に作ったのは今おもえばプロトタイプ?。無駄なつくりがそこかしこにあって、細かいところがいまいちだったので、新たに作り直し。

  • 見た目をよくした
  • ブロックのデータが16個の配列だったのを4つに
  • ブロックの表示ループを展開
  • 移動中のブロックをBGからスプライトに変更
  • プログラムでキャラ定義していたのをCHRED2で作成
  • タイトルつけた
  • ランキング(自動読み込み、保存)つけた
  • スコアをつけた
  • レベル、グレードをそれっぼくした
  • プログラムの構造を見直してGOSUB〜RETURNを減らした
  • ブロックが消えるときに飛び散らせてみた
  • ブロックがNEXT直下まで積みあがっている時のIRSの挙動をちゃんとした
  • 40ラインモードをつけた(ワンダースワン版テトリスに似た感じで)
  • 20Gモードをつけた
などなど、山ほど変更。
TGMでいうT.L.S(ゴーストブロック)の処理が意外と重く、姑息な高速化をふんだんに使い、ブロックを消す処理以外は1フレーム以内で動くように。

ひたすらテストプレイを繰り返すうちにちょっとだけ本家TGMでのグレードがあがり、上達したかも(といってももともとがたいしてうまくないのですが)

Saturday, October 1, 2011

プチコンで数式計算

プチコンでPB-100 挫折放棄中をみて、面白いなあとおもったので作ってみた。ほんとはBASICがつくれたらすごいんだけど、そんな能力が無いので数式計算。変数も関数も無く、整数のみ、数字は5桁までという制約つき。プチコンのダイレクトモード使えばいいじゃんという話ですが。
ひとつだけいいところがあって、ベキ乗(累乗)が計算できます。2^16=65536とか。
上がプチコン、下の">"以降がプログラム実行結果

使い方:実行すると">"が表示されるので、数式を入力。1+1や1*2+3や3*(2+1)など。でEnterを押すと、答えを表示。かっこ、演算子は^、%、*、/、+、-が入力可能。
演算はプチコン頼り。数式の解釈がメイン。デバッグはプチコンで計算し、プログラムの計算と一致すればOKとしてます。


CLEAR
DIM RP$(127),RPA(127),RPW$(127)

LMAX=5
_PAR0=1
_PARC=2
_OPE=3
_NUM=4

@IN
LINPUT ">";I$
IX=0:IE=LEN(I$)-1:B$="":ER=0
RPSP=0:RPWSP=0

@LOOP
C$=MID$(I$,IX,1)
IF C$==" " THEN GOTO @LSKP
ATR=_NUM
IF IX==0 AND C$=="-" THEN GOSUB @NUM
IF (PRE==_PARC OR PRE==_OPE) AND C$=="-" THEN GOSUB @NUM
IF C$>="0" AND C$<="9" THEN GOSUB @NUM
ATR=_PARO
IF C$=")" THEN GOSUB @PARCLOSE
ATR=_PARC
IF C$="(" THEN GOSUB @PAROPEN
ATR=_OPE
IF C$="*" THEN GOSUB @OPE
IF C$="/" THEN GOSUB @OPE
IF C$="^" THEN GOSUB @OPE
IF C$="%" THEN GOSUB @OPE
IF C$="+" THEN GOSUB @OPE
IF C$="-" THEN GOSUB @OPE
@LSKP
IX=IX+1:IF IX<=IE GOTO @LOOP
GOSUB @OPEEND
GOSUB @CALC
?"=";A$
GOTO @IN

@NUM
A$=C$
@NUMLP
C$=MID$(I$,IX+1,1)
IF C$>="0" AND C$<="9" THEN A$=A$+C$:IX=IX+1:GOTO @NUMLP
IF LEN(A$)>LMAX THEN ER=1:?"OVERFLOW ERROR":STOP
IF ER=0 THEN GOSUB @RPPUSH
C$="":PRE=ATR:RETURN

@PAROPEN
A$=C$:GOSUB @RPWPUSH
C$="":PRE=ATR:RETURN

@PARCLOSE
IF RPWSP=0 THEN RETURN
PRE=ATR
GOSUB @RPWPOP
IF A$=="(" THEN RETURN
GOSUB @RPPUSH
IF RPWSP>0 GOTO @PARCLOSE
RETURN

@OPE
IF RPWSP<1 GOTO @OPEPUSH
@OPEPUSHW
A$=C$:GOSUB @RPWPUSH
C$="":PRE=ATR:RETURN

@OPEEND
IF RPWSP==0 THEN RETURN
GOSUB @RPWPOP
GOSUB @RPPUSH
IF RPWSP>0 GOTO @OPEEND
RETURN

@OPEPR
PR=255
IF A$=="^" THEN PR=1
IF A$=="%" THEN PR=2
IF A$=="*" THEN PR=2
IF A$=="/" THEN PR=2
IF A$=="+" THEN PR=3
IF A$=="-" THEN PR=3
RETURN

@CALC
SP=0:RPWSP=0
@CALCLP
A$=RP$(AP):ATR=RPA(SP)
IF ATR==_NUM THEN GOSUB @RPWPUSH:GOTO @CALCSKP
B$=A$
GOSUB @RPWPOP:A2=VAL(A$)
GOSUB @RPWPOP:A1=VAL(A$)
IF B$=="*" THEN A0=A1*A2
IF B$=="/" THEN GOSUB @CALCDIV
IF B$=="^" THEN GOSUB @CALCPOW
IF B$=="%" THEN A0=A1%A2
IF B$=="+" THEN A0=A1+A2
IF B$=="-" THEN A0=A1-A2
A$=STR$(A0):GOSUB @RPWPUSH
@CALCSKP
SP=SP+1
IF SP0 THEN FOR I=1 TO A2:A0=A0*A1:NEXT
RETURN

@RPPUSH
IF RPSP>127 THEN ER=1:?"RP STACK OVERFLOW":STOP
IF ER==0 THEN RP$(RPSP)=A$:RPA(RPSP)=ATR:RPSP=RPSP+1
RETURN

@RPPOP
RPSP=RPSP-1:IF RPSP<0 THEN ER=1:?"RP STACK OVERFLOW":STOP
IF ER==0 THEN RPW$(RPSP)=A$:RPSP=RPSP+1
RETURN

@RPWPUSH
IF PRWSP==127 THEN ER=3:?"ERR:RPW STACK OVERFLOW":STOP
IF ER==0 THEN RPW$(RPWSP)=A$:RPWSP=RPWSP+1
RETURN

@RPWPOP
RPWSP=RPWSP-1:IF RPWSP<0 THEN ER=4:?"ERR:RPWSP -":STOP
IF ER==0 THEN A$=RPW$(RPWSP):
RETURN
ちなみにプログラム名はRPCALC1。その名の通り、逆ポーランド記法(Reverse Polish Notation)を使ってます。おかしいところがあったらすいません。 以下ページを見ながら作りました。非常に分かりやすい説明なので作りやすいのでは。 ところでLINPUTを初めて使いましたが、入力は32桁まででした。これ以上を実現しようとすると、INKEY$/BUTTON/タッチスクリーンとかで自作?

2012/12/1 リストがおかしくなっていたので修正しました

Monday, September 19, 2011

プチコンでカレンダー

3DSはいろいろなソフトが添付されていて、本体だけでいろいろ遊べますが、なぜかカレンダーを見る機能が見あたりません。 なので、プチコンでカレンダーを作ってみます。とりあえず簡単なもので、今月のカレンダーを表示するもの。

リスト
-----
CLEAR:CLS
FOR I=0 TO 6:READ C(I):NEXT
DATA 13,15,15,15,15,15,11
W$="SUMOTUWETHFRSA"
DTREAD(DATE$),Y,M,DT:D=1
IF M<2 THEN Y=Y-1:M=M+12
W=(Y+FLOOR(Y/4)-FLOOR(Y/100)+FLOOR(Y/400)+FLOOR((13*M+8)/5)+7*(4*M+5)+D)%7
A=30+(M-(M>7))%2-2*(M==2)
IF M!=2 GOTO @A
IF Y%4==0 THEN A=29
IF Y%100==0 THEN A=28
IF Y%400==0 THEN A=29
@A
COLOR 15:?Y;"/";M
FOR I=0 TO 6:LOCATE 1+I*3,2
COLOR C(I):?MID$(W$,I*2,2)
NEXT
D=1:FOR I=W TO 42:D$=""
IF D>A GOTO @B
X=1+FLOOR(I%7)*3+(D<=9)
Y=FLOOR(I/7)*2+4:C=C(I%7)
LOCATE X,Y:COLOR C:?D:D=D+1
@B
NEXT
-----
※「W= ... %7」の長い計算式は折り返しなしです。

プログラムの流れ
・システム変数から年月を取得
・月頭の曜日を計算(ツェラーの公式)
・月の末日を計算
・カレンダーをprint

ちゃんとしたプログラムであれば、曜日や月の末日は配列をつかうとおもいます。

Friday, August 5, 2011

プチコンでレインボーシャワーの移植

その昔マイコンベーシックマガジンにMSX用ゲームとして掲載されていた「レインボーシャワー」をプチコンへ移植してみました。

ベーマガの掲載内容を集めているページがありましたので紹介:MSX用 レインボーシャワー ベーマガ投稿プログラム。9801やX68000へも移植されていたようです。

左右キーで画面上の自機を操作。左上の7色の順番でショットを打ちます。下からせりあがってくるブロックに同じ色をぶつけると、周囲3x3マスが消えます。その時同じ色が周囲にあれば、連鎖します。ブロックが自機にぶつかるとゲームオーバー。上キーかSTARTでリプレイ。
連鎖は左から判定しているので、左へ連鎖しやすいです。

MSX版を移植しています。拡大スプライトを含め見た目ソックリになりました。

Sunday, July 24, 2011

プチコンで作成中のもの

プチコンで作成中のゲーム画面。
またもやテトリスですが、前回よりまし?
CHRED2が大活躍。

どこかでみたようなタイトル画面



どこかにありそうなゲーム画面

Friday, July 8, 2011

プチコン高速化4 変数名

  • 変数名は長いと少し遅い。a、bより。0.0004フレームくらい
  • ただし、変数名の長さ5文字は3、4文字より速いかも。cより


a.数字を変数に、セミコロンあり、位置固定(0,0)、変数をPRINT
CLEAR:CLS
A=0
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?A;
NEXT
?MAINCNTL-T
結果:158


b.数字を長い変数名(プチコンは8文字まで)の変数に、セミコロンあり、位置固定(0,0)、変数をPRINT
CLEAR:CLS
ABCDEFGH=0
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?ABCDEFGH;
NEXT
?MAINCNTL-T
結果:162

変数名:ABCDEFG
結果:160

変数名:ABCDEF
結果:161

変数名:ABCDE
結果:160

変数名:ABCD
結果:161

変数名:ABC
結果:159

変数名:AB
結果:159

??
変数名5文字のほうが4文字より速い?
c.でループ増やして検証


c.数字を長い変数名(プチコンは8文字まで)の変数に、セミコロンあり、位置固定(0,0)、変数をPRINT、10万回ループ
変数名:A
結果:1591

変数名:AB
結果:1600

変数名:ABC
結果:1622

変数名:ABCD
結果:1624

変数名:ABCDE
結果:1604

変数名:ABCDEF
結果:1618

変数名:ABCDEFG
結果:1610

変数名:ABCDEFGH
結果:1624

Thursday, July 7, 2011

プチコン高速化3 print

表示関係の続きで、V1.1で時間計測

PRINTでいろいろ

  • 改行すると遅い。dとeより。1つの改行当たり0.0008フレームくらい
  • スクロールがあると非常に遅い。aとb、eとfより。1行スクロールで0.2348フレームくらい
  • ?はPRINTと時間変わらず。fとgより。
  • 変数の表示の方が数値直書きより少し遅い。fとhより。0.0006フレームくらい
  • 配列変数の表示の方が変数より少し遅い。hとiより。0.0007フレームくらい
  • 配列変数2次元の表示の方が配列変数1次元より少し遅い。iとjより。0.0005フレームくらい

前提知識。
実行1回目は微妙に速くなったり遅くなったりするので、2回目以降の時間をみる。
1回目が変わるのはリストを変えてるから?

まず下準備。
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
NEXT
?MAINCNTL-T
結果:19

a.数字直書き、セミコロンなし
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
?0
NEXT
?MAINCNTL-T
結果:2463


b.数字直書き、セミコロンあり
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
?0;
NEXT
?MAINCNTL-T
結果:376


d.数字直書き、セミコロンなし、位置固定(0,0)
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?0
NEXT
?MAINCNTL-T
結果:160


e.数字直書き、セミコロンあり、位置固定(0,0)
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?0;
NEXT
?MAINCNTL-T
結果:152


f.数字直書き、セミコロンあり、位置固定(31,23)
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 31,23
?0;
NEXT
?MAINCNTL-T
結果:2500


g.数字直書き、セミコロンあり、位置固定(0,0)、?をPRINTに
CLEAR:CLS
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
PRINT 0;
NEXT
?MAINCNTL-T
結果:152


h.数字を変数に、セミコロンあり、位置固定(0,0)、変数をPRINT
CLEAR:CLS
A=0
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?A;
NEXT
?MAINCNTL-T
結果:158


i.数字を配列変数に、セミコロンあり、位置固定(0,0)、変数をPRINT
CLEAR:CLS
A(0)=0
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?A(0);
NEXT
?MAINCNTL-T
結果:167


j.数字を配列変数(2次元)に、セミコロンあり、位置固定(0,0)、変数をPRINT
CLEAR:CLS
A(0,0)=0
T=MAINCNTL
FOR I=0 TO 9999
LOCATE 0,0
?A(0,0);
NEXT
?MAINCNTL-T
結果:172

Wednesday, July 6, 2011

プチコン高速化2

いろんなところで書かれていますが、8x8キャラクタの表示の速さは

スプライト > BG > コンソール > グラフィック画面

の順のようです。
条件によっては異なる場合もあります。

全画面を埋めるのであればスプライトよりBGの方がいいですし
256色使いたいのであればグラフィックの方が扱いやすいですし
数字や文字列の表示であればコンソールが使いやすいです。

プログラムの作りにもよりますが、コンソールはLOCATE、PRINTの繰り返しが
重いです。なので文字列としてLOCATE,PRINTの回数を減らして表示してやると速いです。
例えば、
---
FOR I=0 TO 15
FOR J=0 TO 15
LOCATE J,I:PRINT CHR$(I*16+J);
NEXT
NEXT
---
とするよりも、
---
FOR I=0 TO 15
A$=""
FOR J=0 TO 15
A$=A$+CHR$(I);
NEXT
?A$;
NEXT
---
とするほうが、はるかに高速です。

Saturday, July 2, 2011

プチコン高速化1

プチコンV1.1アップデート記念。

プチコンでパネルを非表示にすると、わずかに高速化されます。
---
PNLTYPE "OFF"
---
VSYNC 1の何十分の一程度ですが。

Thursday, April 28, 2011

プチコンで晴れときどき爆弾

むかしむかしMSX・FANという雑誌に載っていた「晴れときどき爆弾」という1画面ゲームをプチコンに移植してみました。とある週末の2〜3時間を使って作ったのですが、作りやすさしか考えてなかったのでリストは長め(プチコンの7画面ほど)になっています。

プレイヤーはうさぎっぽい生き物で、ひたすら降り続ける爆弾を左右に避けるゲームです。よければ避けるほどスコアがあがります。リプレイは上キー。

リストは動画の後半にあります。
爆弾の縦スクロールはスプライトでムリヤリ実現しています。



ほんとはひらがなフォントも作って見た目を全く同じにしたかったのですが、リストの長さとゲーム内容のバランスを考えてとりあえず保留しました。

Monday, April 18, 2011

プチコンでテトリス風ゲーム

テトリス風ゲームをプチコンで作ってみました。



1ミノ毎にLEVELが上がります。
LEVEL 1〜30は落下の待ち時間が減ります。
LEVEL 31〜50はGがあがります(1フレームで1段以上(Gの数だけ)落下する)
LEVEL 50で最高速の20Gになります。

画面左上の数字がFPS値です。
(かん違いでなければ)おおよそ60FPSを維持しているみたいで、プチコン/DSの演算の速さのおかげです。

BGMPLAYではいまいちあうものが見つかりませんでした。自前でBGMを用意してみましたが、プログラムの構造に問題があってBGMがわずかにとぎれることがあり、BGM演奏は呼び出さなくしました。音はいくつかの効果音のみとなっています。
ブロックの落下を止めるとBGMがきれいに流れるのですが。。。

動画のおまけで流れるBGMはゲーム中の演奏はあきらめたものです。
MMLはTSSCPまとめWikiの「Tetris -C-TYPE-」をみて打ち込みました。作った方ありがとうございます。
TSSの仕様で「Tetris -C-TYPE-」の演奏に必要そうな所だけを用意しました。難しい機能(音色とかループとかマクロとか)は実装してないです。
プチコンのBEEPは4オクターブ+1しか表現できないので、泣く泣く高音パートのオクターブを1つ下げ低音パートを1つあげています。一番下をO3Cとすると、O3C〜O7Cが使える範囲となります。

プログラムは900行ほどになってしまいました。
ゲーム本体は700行いかないです。
残り200行ほどはつけようとしてうまくいかなかったBGMルーチンとそのデータです。

作ってて思ったのは、

  • MERGEがほしい〜 ... MERGE "プログラム名"で後ろに追加とか
  • 割り込み命令がほしい ... ON INTERVAL GOSUBとか
  • BEEPをのピッチをもっと広く ...エラー時の音がBEEPで再現できないのはいかがなものか
  • BEEP中の音量とかピッチを変えられると楽しいかも。音声再生方式の問題があるかもしれないですが、そこをなんとか?
です。

Saturday, April 2, 2011

プチコンでタイマー割り込みっぽいもの

プチコンではBEEPやSPRITEなどでそれぞれタイマーを持っていますが、汎用的なタイマー割り込みがありません。

で、無いものは作ってみます。

幸い、システム変数にMAINCNTLというフレーム数を示すものがあるので、60分の1秒の精度を持つタイマーとして使います。(用語集に1フレーム=1/60秒とあります)

星が点滅し、謎のBGM(雑音)が奏でられるサンプルです。
プログラムでは、次のことをしています。

  1. 10フレームに1回星を表示
  2. 20フレームに1回星を消去
  3. 10フレームに1回ランダムな音色でBEEP

プチコンは表示さえ抑えれば処理速度はめっさ速いので、こんなしくみで処理を詰め込んでもそれなりに動作するようです。

---TIMER INTERRUPT TEST
CLEAR:CLS
I1=10
I2=20
I3=10
T1=MAINCNTL
T2=MAINCNTL
T3=MAINCNTL
'
@MAIN
IF MAINCNTL-T1>I1 THEN GOSUB @INT1:T1=MAINCNTL
IF MAINCNTL-T2>I2 THEN GOSUB @INT2:T2=MAINCNTL
IF MAINCNTL-T3>I3 THEN GOSUB @INT3:T3=MAINCNTL
GOTO @MAIN
'
@INT1
LOCATE 10,10:?"★"
RETURN
@INT2
LOCATE 10,10:?" "
RETURN
@INT3
BEEP RND(64)
RETURN
---
I1〜3 ... 割り込みタイミング
T1〜3 ... タイマー保存用
配列変数に入れてループで回し、とび先はON〜GOSUBで管理してもよいかもしれません。

※code-prettify、プチコンBASICだといまいち。

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/