BG_VIEW


 [機能] バックグラウンドグラフィックの表示位置と表示サイズを設定します。

 [書式] BG_VIEW [表示開始X],[表示開始Y],[表示サイズX],[表示サイズY],[拡大表示倍数],[グラフィック画面同期スイッチ]

 [説明]
  初期状態ではBGグラフィックは非表示になっているので使用時は'SCREEN'命令で表示をonにします。
  バックグラウンドグラフィックはグラフィックバッファの16x16ピクセルで区切られたパーツのパターンの並びで構成されます。
  1画面16x16パーツを基本単位として、全体の面積が256画面になるように平方を設定します。(BG_SCALE)
  左上の表示開始座標を [表示開始X], [表示開始Y] で設定します。(初期状態 0,0 )
  スプライトの原点座標(0,0)もこの開始座標に影響を受けます。
  バックグラウンドグラフィックから抜き出して表示する部分を [表示サイズX], [表示サイズY] で指定します。(初期状態 256,256 )
  '拡大表示倍数'でBGとスプライト全体の拡大度を指定します。マシンの解像度に応じたものを指定します。
  小数単位の指定ができます。(1以下で縮小、最大倍数64)

  [解像度2倍スイッチ]
  n=0または無指定:通常モード。
  n=1:スプライトの解像度だけ2倍になる。
  n=2:スプライトとBGの解像度が2倍になる。

  [グラフィック画面同期スイッチ]
  グラフィック画面を背面にして2画面スクロールにする時に使います。
  グラフィック画面をBG画面枠に同期表示するかどうかを指定できます。
  0 同期なしです。グラフィック画面は左上から全画面表示されます。(通常)
  1 同期します。グラフィック画面はBG画面表示位置、表示サイズと同じ枠になります。拡大倍数も同じになります。
  グラフィック画面の表示読み込みを絶対位置で roll ,,vx,vy で指定できます。(仮想ハードウェアスクロール機能)
  例:サンプル smp_2roll.bas
  またこの値nに2を足すことで(2,3指定) BG_VIEWの枠外を黒地でマスクすることができます。
  枠外にはみ出したスプライト表示を覆うことができます。

  [補足]
  パラメータが省略されると元の値を保持します。
  グラフィック画面は基本的に表示画面サイズの分だけrollで使用できますがメモリが特に少ない機種を除き
  最小でも縦横1536Pixel分確保されて使用できます。(表示画面サイズが1536Pixelに満たない場合でも)
  また同期スイッチが1の時はテキスト画面も同様に表示位置、表示サイズが同期されます。
 
  グラフィックバッファのサイズは初期状態で端末画面と同サイズになっています。サイズを広げる命令は現在ありませんが
  無地のダミー画像を希望サイズにしてgloadすることにより最大3840x3840まで広げることができます。
  (メモリと解像度が少ないマシンでは2160x2160までです。4K以上の解像度のマシンではでは解像度分まで対応しています)

  [解像度2倍スイッチ]の補足・詳細
  例えば'bg_view ,,256,256'で画像を作り全画面に拡大表示させた時
  通常はスプライト'sp_def'の定義範囲が16x16ならば'sp_put'の表示範囲も16x16[BG 1パーツ分]ですが
  onの時は'sp_def'の定義範囲32x32の内容を[BG 1パーツ分]のサイズの中に表示させることができます。
  この表示でもBGグラフィックの衝突判定は16x16の時と同じです。
  n=2:スプライト解像度2倍でBGグラフィック解像度も2倍になります。
  バッファの読み込み元は通常1パーツ16pixel単位ですがこれが2倍の32pixelになります。
  (バッファの定義画像も1ブロック32x32で描かれたものを用意しておきます)
  これで移動単位や衝突判定は16の時と同じ扱いになります。
  使用例として5番目のパラメータ'拡大表示倍数'が2倍でこの'解像度2倍スイッチ'が2ならば
  表示は32x32pixelの解像度で座標指定や各種判定は16x16の時と同じ扱いができます。
  (OpenGLモードの時は巨大画像が必要なため、n=2のBG2倍の指定はできません)
 
 [例] 
    screen ,,,1
    bg_view 0,0,256,256,2


  BG_SCALE


 [機能] バックグラウンドグラフィックの全体のサイズを指定します。

 [書式] BG_SCALE X画面数, Y画面数

 [説明]
  1画面16x16パーツを基本単位として、全体の面積が256画面以下になるように平方を設定します。

 [例]
  bg_scale 16,16
  bg_scale 8,1



  BG_PUT


 [機能] 画面の座標指定でバックグラウンドグラフィックにパーツを描画します。

 [書式] BG_PUT x,y,n

 [説明]
  指定座標のバックグラウンドグラフィックにパーツパターンn を書き込みます。
  書き込みは直ぐに表示に反映されます。
  この座標はバックグラウンドグラフィックの全体の座標(BG_FILL使用)でなく、
  画面に表示されたままのピクセルの座標になります。(スプライトの座標と同じ)
  パターンナンバーはグラフィックバッファ(16x16ピクセル単位で区切られている)のパターンで
  パターンナンバーn=左(0)からの位置+上(0)からの位置x256 となります。(例:4,2の位置なら516)
  反転表示の場合
  X反転はパターンナンバーにさらに+128します。(8ビット目が1)
  Y反転はパターンナンバーにさらに-32768します。(16ビット目が1)
 [例]
    bg_put 128,96,4
    bg_put 128,96,4+128 :'x-reverse



  BG_FILL


 [機能] バックグラウンドグラフィックを指定のパーツで埋めます。

 [書式] BG_FILL n,x1,y1[,x2,y2] [,コピースイッチ]

 [説明]
  バッファのパターンナンバーn=バッファ左からの位置+上からの位置x256
  コピースイッチが省略の場合、単独のパターンn で埋めます。 範囲は (x1,y1)-(x2,y2) です。
  x2,y2 が省略された時は単独で x1,y1 への書き込みになります。
  ここで使用される座標はバックグラウンドグラフィック全体のパーツ単位の座標になります。
  範囲は BG_SCALE 4,4 が指定されている時は 0~63,0~63 となります。(1画面で16パーツの並び)
  表示は'BG_SCENE'が実行されるまで更新されません。

  コピースイッチが指定された場合、バッファのパーツ側もx,yに合わせて移動します。
  (見た目その範囲のバッファの画像がそのままバックグラウンド側に現れます)
  コピースイッチの値
  0.反転なしでそのまま。
  1.x反転。パーツはx2からx1への順になります。値は+128されます。
  2.y反転。パーツはy2からy1への順になります。値は-32768されます。
  3.xy反転。1と2を合わせた順になります。
 [例]
    bg_fill 520,10,10,20,20
    bg_fill 520,10,10,20,20,3 :'xy-reverse



  BG_SCENE


 [機能] バックグラウンドグラフィック画面の最初の表示開始画面を指定します。

 [書式] BG_SCENE 画面X, 画面Y

 [説明]
  1画面16x16パーツを基本単位として指定します。(BG_SCALEと同じ単位)
  指定できる範囲は0~(BG_SCALEの指定値-1)です。

 [例]
  bg_scene 0,3



  BG_ROLL


 [機能] バックグラウンドグラフィックをスクロールさせます。

 [書式] BG_ROLL [相対方向X],[相対方向Y] [,n] [,絶対座標AX] [,絶対座標AY]

 [説明]
  正の数(右又は下)、負の数(左又は上)でスクロール方向を指定します。0はスクロールしません。
  一度で指定できるスクロール可能なピクセルの範囲は-16~0~16です。
  それ以上の指定をしても絶対値16は超えません。
  上下左右の端は繋がっています。(球面スクロール)
  n=1 に指定されるとスプライトもスクロールに合わせて移動します。

  OpenGLモードでは絶対座標AX,AYを指定することができます。(この場合相対の座標とnスイッチは無視されます)
  範囲はbg_scaleの幅x256ピクセルです。(例:bg_scale 4,2ならAX:0~1023 AY:0~511)
  範囲を超えた部分はループしますがOpenGLモードでは球面スクロール表示はされません。

 [例]
     bg_roll 1,-1 :'相対指定
     bg_roll ,,,200,100 :'絶対指定



  BG_BORDER


 [機能] 衝突判定のあるバックグラウンドグラフィックのパターンパーツの境界を指定します。

 [書式] BG_BORDER パターンナンバー

 [説明]
  スプライトと衝突判定される(SP_BGHIT)パーツの境界をパターンナンバーで指定します。
  パターンナンバー=左(0)からの位置+上(0)からの位置x256
  種類:
   0: 指定パーツ以前。衝突なし。
   1: 指定パーツ位置。
   2: 指定パーツ以後。衝突あり。

 [例]
  bg_border 8



  BG_LOAD


 [機能] バックグラウンドグラフィックをファイルから読み込みます。

 [書式] BG_LOAD "ファイル名"

 [説明]
  元と同じ画面を再現するには'BG_SCALE'で同じ設定にしておく必要がありますが、
  画面単位で保存されているため、画面の並びが変わるだけで異なる設定でも読み込みは可能です。

 [例]
  bg_load "map1.bg"



  BG_SAVE


 [機能] バックグラウンドグラフィックをファイルに保存します。

 [書式] BG_SAVE "ファイル名"

 [説明]
  'BG_SCALE'で指定された範囲を画面単位で保存します。
  1画面= 16x16パーツ。

 [例]
  bg_save "map1.bg"



  BG_GET


 [機能] バックグラウンドグラフィックのパーツのパターン番号を取得します。

 [書式] BG_GET(x, y [,n])

 [説明]
  指定できる座標は2系統あります。
  n=0: 画面表示と同じピクセル単位での座標。(BG_PUTと同じ)
  n=1: バックグラウンドグラフィック全体のパーツ単位での座標。(BG_FILLと同じ)
  第3パラメーターの nは省略すると0と同じになります。
  nはスイッチとしての数字の0か1で、変数や計算式を指定することはできません。

  返り値のパターンナンバーとバックグラウンドグラフィックの関係。
  パターンナンバー=左(0)からの位置+上(0)からの位置x256

 [例]
  a=bg_get(24,16,1)
  b=bg_get(8,3)


  BG_MAP


 [機能] バックグラウンドグラフィックのスクロール座標を取得します。

 [書式] BG_MAP(n)

 [説明]
  バックグラウンドグラフィックの左上を(0,0)として現在のスクロール位置を返します。
  n=0: Xのスクロール位置
  n=1: Yのスクロール位置

 [例]
  a=bg_map(0)



  SP_MAPX  SP_MAPY


 [機能] 表示画面上の任意位置がBGグラフィックのどのパーツにあたるかを返します。

 [書式] SP_MAPX(n)    SP_MAPY(n)

 [説明]
  表示画面上の任意位置のpixelがBGグラフィック上のどのパーツ位置上にあたるか
  そのパーツ位置を返します。
  BGグラフィックがスクロール中でも計算してその位置を返します。

  SP_MAPXは nにpixel位置-X を与えパーツ位置-X を返します。
  SP_MAPYは nにpixel位置-Y を与えパーツ位置-Y を返します。

  スプライトとBGグラフィックの処理はbg_get()やsp_bghit()で
  書き込みはbg_putやbg_fillで簡潔に処理できますが
  それ以上の複雑な処理をする時等にこの関数を使用します。
  取得した値はそのままbg_fillに使用できます。

 [例] スプライト4番の座標の位置のBGグラフィックに16のデータを書き込みます。
     x=sp_mapx(sp_stat(4,0))
     y=sp_mapy(sp_stat(4,1))
     bg_fill 16,x,y


  BG_GENE


 [機能] BGスクロールで新たに出現したパーツ番号の羅列を取得し、スプライトキャラクターの出現を補助します。

 [書式] BG_GENE(n)

 [説明]
  BG画面のスクロールで特定位置でスプライトを発生させたい時にBGにデータを埋め込んで使用します。
  画面が四方にスクロールした時に16Pixel毎に一度、縦または横一列に新たなパーツ群が発生します。
  (表示サイズが256Pixelの場合は16パーツ+α個発生します)
  そこから得られるパーツ番号に応じてスプライトキャラクターを発生させるプログラムを組むことができます。
  バッファでのパーツ番号=左(0)からの位置+上(0)からの位置x256
  nの値:0~4までが情報、5以降が実際のパーツ番号になります。
   0:出現したパーツの数
   1:最初のパーツのX座標
   2:最初のパーツのY座標
   3:横方向スクロールの時0、縦方向の時は1を返します。
   4:縦方向スクロールの時0、横方向の時は1を返します。
   5以降:出現したパーツ番号を返します
    5から4+bg_gene(0)の位置までデータが収まります。
    この最終位置が読み出されたと同時にbg_gene(0)の値はクリアされ0になります。

  ただし縦横同時スクロールで横方向と縦方向のパーツが同時に発生している場合は
  まず横スクロールで得られるデータが取得されて(パーツの並びは縦一列)
  その後最終値取得でbg_gene(0)の値はクリアされずにすぐに縦スクロールの情報が取得されます。
  この2回目の縦の最終値を取得するとbg_gene(0)の値は0になります。
  横スクロールではパーツの出現は左か右側でパーツの描画は縦に走るので得られるのは縦一列のデータになります。
  縦スクロールではパーツの出現は上か下側でパーツの描画は横に走るので得られるのは横一列のデータになります。

  左スクロールでは最初のパーツは左上側で下に向かって16Pixelの間隔で次のパーツが並んでいきます。
  最初のパーツの座標は(bg_gene(1),bg_gene(2))ですが
  i番目のパーツの座標を求めるには
  x=bg_gene(1)+i*16*bg_gene(3)
  y=bg_gene(2)+i*16*bg_gene(4)
  がパーツの左上角の座標となります。
  bg_gene(3)とbg_gene(4)が横か縦方向のどちらかによって、xかyの値の増幅を打ち消しています。
  他の各方向は以下のようになります。
  右スクロールでは最初のパーツは右上側でパーツの描画は下に向かう
  上スクロールでは最初のパーツは左上側でパーツの描画は右に向かう
  下スクロールでは最初のパーツは左下側でパーツの描画は右に向かう
  実際の使用法は同梱の smp_gene.bas を参照してください。

  *スプライト発生に割り当てているパーツ番号のバッファの場所は無地にしておくのが実際の用法になります。
  これは発生するスプライトの種類を示すもので実際表示されるスプライトパターンとは異なるためです。

 [例]smp_gene.bas 部分抜粋
     250 lp01:
     260 for i=1 to ec
     270 sp_put i
     280 cx(i)+=1 :'スクロールに合わせてスプライトも移動させます
     290 if sp_out(i)thenkn=i:i-=1:gosub ckill: :continue :'画面外なら消す
     300 next
     310 bg_roll -1,0  :'スクロール ここで16Pixel毎にbg_geneのデータ発生
     320 if bg_gene(0)>0 then :'データが新しく発生しているなら
     330 lp02:
     340 for i=0 to bg_gene(0)-1  :'パーツの個数だけ
     350 if bg_gene(i+5)>=2 then :'各データが2より大きいならそれに応じたスプライト発生
     360 ec+=1
     370 nx=bg_gene(1)+i*16*bg_gene(3) :'各パーツの座標を求めています X座標
     380 ny=bg_gene(2)+i*16*bg_gene(4) :'Y座標
     390 na=bg_gene(i+5)-2:gosub cmake: :'それに応じたスプライト発生
     400 endif
     410 next
     420 endif
     430 if bg_gene(0)>0 then goto lp02: :'縦方向のデータも同時発生している場合はもう一度処理を行います
     440 vsync
     450 goto lp01:

  四角はBGのブロックで○はスプライトの発生になります。
  青の○は何度も出現します。
  赤の○はbg_gdsetで出現時にマップから消されるので2周目以降は出現しません。


  BG_GDSET


 [機能] BG_GENEで出現したスプライトが繰り返し出ないように出現と同時にマップから消去させるそのパーツ番号の範囲を指定します。

 [書式] BG_GDSET [開始パーツ番号],[終了パーツ番号] [,SP_OUTの横拡張範囲] [,SP_OUTの縦拡張範囲]

 [説明]
  BGスクロールで一度出現したスプライトが再度出ないように出現と同時にマップ上から0でクリアさせることができます。
  そのパーツ番号の範囲を指定します。
  SP_OUTの画面範囲の広がりを第3(横方向)、第4(縦方向)パラメータでpixel単位で指定できます。
  この設定と連携しているSP_OUTも参照して下さい。

 [例]smp_gene.bas 部分抜粋
     190 bg_gdset 3,10
  3から10までの番号のパーツがスクロールで現れるとbg_geneにデータを残してBGマップ上からは0でクリアされます。



  SP_BGHIT


 [機能] スプライトのバックグラウンドグラフィックに対する衝突判定値を返します。

 [書式] SP_BGHIT(スプラトNo [,方向X, 方向Y])

 [説明]
  'BG_BORDER'で指定した衝突判定のあるパーツが指定方向の側面にあるかどうか調べます。
  側面はその方向の'SP_MARGIN'の判定位置+'SP_BGHIT'の各方向指定量です。
  1つでも衝突パーツがある場合は 返り値=2 を返します。
  全て'BG_BORDER'の境界パーツの場合返り値=1 を返します。
  それ以外は 返り値=0 を返します。
  *反転表示パーツでは反転値を含むため正常に判別できません。

  方向X, 方向Yが 0,0 の場合はスプライトの内側(MARGINより内側)の面積全てを調べます。
  返り値は側面の場合と同じです。

  方向X,方向Yを省略した記述の場合、(sp_bghit(i)等パラメータがスプライトNoの一つだけの場合)
  そのスプライトサイズ全体の中心点を読み込みBG_BORDERで指定された衝突パーツであるかどうかを判別します。
  衝突パーツ(指定位置含む)ならばそのBGパターンナンバーを、非衝突パーツなら0を返します。

 [例]
  a=sp_bghit(0,1,0)
  スプライトサイズ16(座標0,0)、MARGIN4、SP_BGHIT(0,1,0)の場合。
  スプライト右側のx=12の位置が衝突判定のパーツかどうか調べます。
  方向Xがマイナス値の場合、スプライトの左のマージン除いた位置から方向X分の位置を調べます。

 [例] バックグラウンドグラフィック&衝突サンプル
    [smp_bghit.bas]

    100 line(16,0)-(31,15),col(14),b
    110 line(32,0)-(47,15),col(10),b
    120 line(48,0)-(63,15),col(13),b
    130 line(51,3)-(60,12),col(9),b
    140 get@(0,0),64,16,(0,0)
    150 sp_def 0,(48,0),16,16
    160 cls 3 : print"Touch!"
    170 sp_on 0,1 : sp_margin 0,3
    180 bg_scale 2,2
    190 bg_view 0,0,256,256
    200 bg_border 1
    210 bg_fill 2,0,0,15,0:bg_fill 2,0,15,15,15
    220 bg_fill 2,0,0,0,15:bg_fill 2,15,0,15,15
    230 bg_fill 1,5,5,9,9
    240 bg_scene 0,0
    250 screen1,1,1,1
    260x=80:y=128:mx=1:my=-1
    270 '
    280 for i=1 to 4000
    290 if touch(2)>0 and touch(1)<256 then bg_put touch(0),touch(1),1
    300 sp_put 0,(x,y),0
    310 h1=sp_bghit(0,mx,0)
    320 h2=sp_bghit(0,0,my)
    330 h4=h3 : h3=sp_bghit(0,0,0)
    340 if h3<>h4 then print h3
    350 if h1=2 then mx=-mx:print h1
    360 if h2=2 then my=-my:print h2
    370 bg_roll mx,my
    380 vsync 1
    390 next



  OPENGL


 [機能] OpenGLによる描画表示モードに切り替えます。

 [書式] OPENGL ON|OFF|0~4

 [説明]
  OpenGLモードにすることにより高速表示が可能になります。
  テキスト、グラフィック、スプライト、BGグラフィックの全ての表示に対応しています。
  特にスプライトとBGグラフィックの動的な表示で効果を発揮します。
  通常のプログラムからそのままOpenGLモードに移行できますが手順として
  bg_コマンドで全てのBGグラフィックの設定を終えてから最後にopengl onにします。
  ('bg_scene'は後からでも可能です)
  プログラム終了時は自動的にopengl offになります。

  OpenGLモードの注意点。
  実画面への描画はできますが、そのままでは表示更新されません。(bg_put命令など)
  更新するには後述の番号指定で個別に画面を再構成する必要があります。
  (負荷がかかり一瞬止まります、連続更新はバッテリーの負担にもなるので推奨しません)
  BGマップの端で球面状の繋がりがありません。(範囲の外側は正常に表示されません)
  OpenGLモードではBGグラフィック表示で大量のメモリを消費します。
  メモリが少ないロースペックマシンでbg_scaleの大きなザイズを指定すると
  'Out of memory'エラーやメモリ破損による終了処理になることがあります。

  ON  OpenGL描画表示モードにします。
  OFF ノーマル描画表示モードにします。
  数値0~4 各画面で更新された実画面からOpenGL用の画面を再構成して表示に反映させます。
   0 テキスト画面を再構成します。 (print命令実行の後など)
   1 グラフィック画面を再構成します。 (line,circle命令の実行の後など)
   2 グラフィックバッファを再構成します。 (gload命令実行の後など)
   3 BGグラフィックのマップを再構成します。 (bg_put,bg_fill命令実行の後など)

 [例]
    サンプルプログラムの'acsamp.bas'の250行を
     250 opengl on
    にして実行してみてください。

    'フリックでBGグラフィックを高速スクロールさせるサンプル
    '[smp_opengl.bas]

    100 '
    110 cls 3:screen ,,,1< br>    120sx=12:sy=2
    130 for i=0 to 15
    140 line(0,i)-(15,i),rgb(200-i*6,48+i*8,64+i)
    150 next
    160 get@(0,0),16,16,(16,0):cls 2
    170 if size(0)+size(1)>800 then sz=2 else sz=1
    180 bg_scale sx,sy
    190 bg_view 0,0,256,256,sz
    200 for y=0 to sy-1
    210 for x=0 to sx-1
    220 symbol(x*16,y*16),hex$(x)+hex$(y),12
    230 next
    240 next
    250 getbitmap:cls 2
    260 for x=0 to sx*16-1
    270 for y=0 to sy*16-1
    280 if pixc(x,y)<>0 then bg_fill 1,x,y
    290 next
    300 next
    310 init"kb:0"
    320 opengl on :ui_msg"Flick"
    330 'loop
    340 vsync< br>    350x=-touch(3):y=-touch(4)
    360 bg_roll x+mx,y+my
    370 mx=mx+x/16-sgn(mx)/10
    380 my=my+y/16-sgn(my)/10
    390 goto 340