SP_PUT


 [機能] 指定のスプライトを指定座標に表示します。

 [書式] SP_PUT n,(x,y), [,pt] [,反転スイッチ]

 [説明]
  n: スプライトナンバー。 (0~255)まで使えます。
  スプライトナンバーが大きいものが手前に表示されます。
  x,y: 配置座標。小数値を含んだ値でも可。
  pt: 'SP_DEF'で定義されたパターンナンバー。
  反転スイッチ: 0(または省略).反転無し  1.x反転  2.y反転  3.xy反転 

 [例] スプライト表示サンプル
   [smp_sp.bas]
   100 circle(7,7),7,col(9)
   110 circle(7+16,7),7,col(10)
   120 circle(7+32,7),7,col(12)
   130 get@(0,0),48,16,(0,0)
   140 sp_def 0,(0,0),16,16
   150 sp_def 1,(16,0),16,16
   160 sp_def 2,(32,0),16,16
   170 sp_on 0,1:sp_on 1,1:sp_on 2,1
   180 dim x(3)
   190 for i=1 to 100
   200 sp_put 0,(x(0),16),0 : x(0)=x(0)+1
   210 sp_put 1,(x(1),48),1 : x(1)=x(1)+2
   220 sp_put 2,(x(2),80),2 : x(2)=x(2)+3
   230 vsync
   240 next

  [応用]
  *省略形で高速化
  sp_put 10 のようにスプライトナンバーだけ指定して以下省略すると、
  そのスプライトナンバーで前に指定した変数のアドレスを直接参照するようになります。
  最初に変数指定で記述してループ時に省略することにより若干高速化することができます。
 [例]
     sp_put i,(cx(i),cy(i)),cp(i)
     '...loop
     for i=0 to ec
     cx(i)+=1
     sp_put i
     next
     'この例ではcx(i),cy(i),cp(i)が固定の変数になり、各アドレスの値を直接参照しています。
     'サンプル'acsamp.bas'に使用例があります。



  SP_DEF


 [機能] グラフィックバッファの指定の範囲をスプライトパターンとして定義します。

 [書式] SP_DEF n,(x1,y1),x2,y2

 [説明]
  (x1,y1) 定義するパターンのバッファでの開始座標。
  x2,y2 パターンの幅。
  n: 定義されるパターンナンバー。 (0~255)まで定義できます。


  SP_ON


 [機能] スプライトの表示/非表示を切り替えます。

 [書式] SP_ON n,sw

 [説明]
  n: スプライトナンバー
  sw=0 非表示
  sw=1 通常スプライトとして表示
  sw=2 拡大縮小スプライトとして表示
   2を指定すると拡大縮小スプライトとなりSP_ZOOMで指定した任意の拡大率での表示が可能となります。


  SP_MOVE


 [機能] スプライトを指定の動作パターンで自動的に動かします。

 [書式] SP_MOVE n,[pt],[d1],[d2],[d3],[d4]

 [説明]
  設定されたスプライト(表示ONのもの)はフレーム毎で移動を続けます。
  n: スプライトナンバー
  pt: 動作パターン
  pt=1 現在動作パターンは1番の直進のみです。
  X方向に毎フレームd1ずつ移動します。
  Y方向に毎フレームd2ずつ移動します。
  移動量は小数単位で指定できます。

  d3,d4ではスプライトのアニメーションパターンを指定します。
  sp_defで定義された通常表示されるスプライトパターンを基点として
  グラフィックバッファで右方向にスプライトのX幅単位で何個までずらしていくかをd3で指定します。
  (グラフィックバッファに予め横に並ぶようにアニメパターンを並べて描画しておきます)
  アニメーションパターンは指定された数でループします。
  例えばd3=4を指定すると基点1から始まり4番目のパターンまで来ると次は1番に戻ります。
  d4は何フレーム単位で次のアニメパターンへ移っていくかを指定します。(アニメの速度)

  pt=0 を指定すると動作とアニメーションが止まります。
  現在のスプライトの座標等の情報はsp_stat関数で取得できます。
  *この命令により毎フレーム動作が行われるため、
  (,i)モードではタイミングが追いつかずに(,c)モードと異なる動作になることがあります。

 [例] スプライト 自動ムーブ&アニメーション、スワップ サンプル
   [smp_mv_anm.bas]
    100 screen 1,1,1,0:cls 3
    110 for i=0 to 15
    120 if i>7 then j=7-(i-8) else j=i
    130 circle(i*32+16,16),7+j
    140 next
    150 get@(0,0),32*16,32,(0,0):cls 2
    160 sp_def 1,(0,0),32,32
    170 sp_def 2,(0,0),32,32
    180 sp_on 1,1
    190 sp_on 2,1
    200 sp_move 1,1,1,0,16,8
    210 sp_put 1,(32,100),1
    220 sp_put 2,(32,200),2
    230 while -1
    240 vsync 256
    250 sp_swap 1,2
    260 k=-(k-1)
    270 print "Swap move sprite ";k+1
    280 sp_put k+1,(32,sp_stat(k+1,1)),1
    290 wend


  SP_ZOOM


 [機能] 拡大スプライトの拡大率を指定します。

 [書式] SP_ZOOM スプライトナンバー ,[全体またはx拡大率] ,[y拡大率] ,[回転角度]

 [説明]
  スプライトナンバー(0~スプライト最大数-1まで)スプライトごとに拡大率、回転角度を指定します。
  拡大率:1が拡大なしの状態で小数単位で指定します。1以下は縮小です。
  第2パラメータのみ指定の場合はxとy両方の拡大率と判別されます。
  第3パラメータのy拡大率がある場合はxyそれぞれ独立した拡大率指定と判別されます。
  回転角度を指定することで360度単位で回転表示させることができます。(右回り)
  拡大回転スプライトとして使用するスプライト番号は sp_on スプライト番号,2 とsp_onで2を指定して
  個別に拡大回転表示用のスプライトであることを明示しなければいけません。(参照:sp_on)
  回転の軸は常にスプライト中心部になります。
  表示の基点はSP_ORDERで指定します。
  拡大スプライトはxy反転表示、sp_moveの自動移動、sp_hit等の衝突判定が使用できません。
  (衝突対象から除外されます)
  現時点では拡大回転スプライトはOpenGLモードには対応していません。

 [例] その他サンプル"smp_spzoom.bas"
    sp_on 12,2
    for i=0 to 360
    sp_put 12,x,y,pt
    sp_zoom 12,1+i/100,,i
    next



  SP_ORDER


 [機能] スプライトの表示優先順位や拡大スプライトの使用範囲を指定します。

 [書式] SP_ORDER [表示優先順位開始],[拡大sp最初],[拡大sp最後],[基点x],[基点y]

 [説明]
 [表示優先順位開始番号]
  スプライトの表示優先順位開始番号を指定します。
  通常スプライトは0番が一番奥に、255番が一番手前に表示されます。(デフォルト0の状態)
  例えば sp_order 64 を指定した場合、表示優先は
  奥 64~255 0~63 手前
  このような順位にに変更されます。

  [基点x] [基点y]
  拡大スプライトの座標指定をどこで行うか設定します。
  左上やスプライトの中央等での座標指定が可能です。
  指定方法とその単位ですが、スプライトが拡大された状態でその半分サイズを単位1(整数)とします。
  sp_order ,0,0
  左上での座標指定となります。
  sp_order ,1,1
  拡大されたスプライトの中央部分での座標指定となります。
  指定された数x半分サイズだけ右下方向に基点がずれます。(表示は左上にずれる)
  xy別々の値を設定することができます。
  通常スプライトは常に左上での座標指定になります。



  SP_SWAP


 [機能] 2つのスプライト間で全情報を交換します。

 [書式] SP_SWAP sp1,sp2

 [説明]
  sp1,sp2で交換するスプライトナンバーを指定します。
  交換されるデータは
  XY座標、XYサイズ、表示パターン、表示状態、マージンサイズ、
  衝突判定のターゲットと'sp_hit()'で得られる値、'sp_move'の移動パターンとデータ です。



  SP_STAT


 [機能] スプライトの情報を取得します。

 [書式] SP_STAT(n,d)

 [説明]
  n: スプライトナンバー。
  d: 情報の種類
   0: x 座標
   1: y 座標
   2: 現在のパターンの X サイズ
   3: 現在のパターンの Y サイズ
   4: パターンナンバー
  5:表示状態 表示=1 非表示=0
   6: SP_MOVEでの動作パターン番号
   7: SP_MOVEでのデータ1(X移動量)
   8: SP_MOVEでのデータ2(Y移動量)



  VSYNC


 [機能] 画面描画が定期更新(1/60秒)されるまで待ち、同期のタイミングを図ります。

 [書式] VSYNC [n]

 [説明]
  現在FPS(Frames Per Second)は最大60に設定されています。(1秒間に60回描画される)
  この命令は前回の更新を覚えておき、新たな更新がなされているか確認して
  更新されると次の命令に進みます。
  n が指定されている時はn/60秒間隔になります。(省略時はn=1)
  ループ中に記述することによりスプライトの動作が一定の速度に保たれます。
 [例]
    100 line(0,0)-(31,31),col(9),bf
    110 get@(0,0),32,32,(0,0)
    120 sp_def 0,(0,0),32,32
    130 cls 3 : sp_on 0,1
    140 for i=1 to 300
    150  x=x+1: y=100
    160  sp_put 0,(x,y),0
    170  vsync 1
    180 next
    190 x=0 : goto 140



  SP_OUT


 [機能] スプライトがバックグラウンド画面表示範囲の内にあるか調べます。

 [書式] SP_OUT(スプライトナンバー)
 [説明]
  指定されたスプライトがBGグラフィック画面表示範囲の内側なら 0を
  外側(非表示エリア)なら -1を返します。
  画面内側のエリアはBG_GDSETの第3パラメータの指定分だけ枠を広げることができます。
  デフォルトは枠より1pixcel分四方に広くなっています。(BG_GENEで現れたスプライトが出現と同時に消滅しないように)

 [例]
    if sp_out(1) then print"outside."



  SP_CHECK


 [機能] スプライト同士の衝突判定を行います。

 [書式] SP_CHECK
 [説明]
  あらかじめSP_TARGETで各スプライトの衝突対象を設定しておきます。
  SP_CHECKが実行された時点で重なっているスプライトの情報をSP_HITで読み取ることができます。
  スプライトの見た目より衝突サイズを小さくする時はSP_MARGINでその余白を指定します。



  SP_HIT


 [機能] 指定のスプライトが重なっている対象のスプライトナンバーを返します。(関数)

 [書式] SP_HIT(n,m)

 [説明]
  n: 調べる元のスプライトナンバー(範囲0~255)
  m: 何番目
  m=0の時は衝突しているスプライトの数を返します。
  1~以降は順に衝突している相手のスプライトナンバーを返します。
  衝突数以上の数を指定すると-1を返します。
  非表示になっているスプライトは衝突判定されません。(元が非表示の時は衝突数は0個です)

 [例]
  1番を調べて4番と6番に衝突している場合。
   sp_hit(1,0) -> 2
   sp_hit(1,1) -> 4
   sp_hit(1,2) -> 6
   sp_hit(1,3) -> -1



  SP_TARGET


 [機能] 指定スプライトの衝突対象の範囲を指定します。

 [書式] SP_TARGET スプライトナンバー,開始位置,終了位置

 [説明]
  指定のスプライトの衝突判定範囲を開始位置から終了位置までにします。(範囲0~255)
  判定を無しにするときは開始位置を終了位置より大きな値にします。



  SP_MARGIN


 [機能] スプライトで衝突判定がない余白部分のサイズを指定します。

 [書式] SP_MARGIN スプライトナンバー,余白ピクセル数

 [説明]
  外縁の四方の余白ピクセル数分だけ衝突しない領域に設定されます。
  0を指定すると表示サイズと同じ判定サイズになります。
  'SP_BGHIT'の判定のサイズにも影響を与えます。

  0000 例
  0880 スプライトサイズ4
  0880 '0'は余白領域(衝突判定がない領域)を示しています。
  0000 Margin size=1


 [例] スプライト衝突サンプル
   [smp_hit_mgn.bas]

    100 line(0,0)-(15,15),col(9),b
    110 get@(0,0),16,16,(0,0) :cls 3
    120 sp_def 0,(0,0),16,16
    130x=0:y=100
    140 sp_on 0,1:sp_on 1,1
    150 sp_target 0,0,1
    160 sp_margin 0,2
    170 sp_put 1,(100,100),0
    180 x=x+1
    190 sp_put 0,(x,y),0
    200 sp_check
    210 for i=1 to sp_hit(0,0)
    220 print"Hit no";sp_hit(0,i)
    230 next
    240 if sp_hit(0,0)>0 then stop
    250 vsync
    260 goto 180



  SP_DIST


 [機能] 2つのスプライト間の距離を返します。(Rを三平方の定理で計算)

 [書式] SP_DIST(スプライトNo1,スプライトNo2)

 [説明]
  距離は各スプライトの中心から中心へのの距離です。
  この関数とSP_HIT関数の併用で円形の衝突判定ができます。
  また次のSP_BMX/BMY関数と組み合わせることによって
  No2からNo1へ向かうスプライトのベクトル(方向と速度)の計算ができます。



  SP_BMX  SP_BMY


 [機能] SP_DISTとの組み合わせで目標物へのX,Yの移動量を計算します。

 [書式] SP_BMX([speed])

 [説明]
  直前に行われたSP_DIST(No1目標物スプライト,No2基点スプライト)では
  直線距離RとX,Yそれぞれの距離が記憶されています。
  これは2つのスプライトを座標とした直角三角形をなしていますが、
  X/R,Y/Rのように縦横を距離で割ることによって
  目標物へ向かうスプライトのX,Yそれぞれの移動量が計算できます。
  距離Rで割るのでX,Y移動量がなすベクトルの大きさはピクセル1の大きさになりますが
  [speed]の倍数指定(小数対応)で移動速度を変更することができます。(1以下は遅くなる)
  省略すると前回指定した[speed]になります。(初期状態では1)
  事前のSP_DISTでは目標物のスプライト、基点のスプライト(追う側)の順に記述して下さい。

 [例]  [smp_dist.bas]
    100 cls 3:pen ,,1
    110 screen ,,1
    120 line(1,1)-(14,14),col(15),b
    130 pen ,,0
    140 bg_view ,,,,size(0)\256
    150 sp_def 0,(0,0),16,16: '角型スプライト定義
    160 sp_on 0,1:sp_on 1,1:sp_on 2,1
    170 sd=sp_bmx(4): '速度を4倍に指定(1回でok)
    180 sp_put 0,(128,128),0: '基点スプライト
    190 x1=128:y1=128
    200 for i=0 to 16000
    210 if i mod 256=0 then y2=irnd(256): 'Y出現位置ランダム
    220 sp_put 1,(i mod 256,y2),0: '目標物のスプライト
    230 sp_put 2,(x1,y1),0: '目標物へ向かうスプライト
    240 x1+=mx:y1+=my: '加算して移動
    250 if i mod 40=16 then
    260 d=sp_dist(1,0): 'distで目標物へのR,X,Yを計算・記憶
    270 x1=sp_stat(0,0): '出現位置は基点のX座標コピー
    280 mx=sp_bmx(): 'Xのフレーム毎の移動量(方向)決定
    290 y1=sp_stat(0,1): '出現位置は基点のY座標コピー
    300 my=sp_bmy(): 'Yのフレーム毎の移動量(方向)決定
    310 endif
    320 vsync
    330 next



  SP_PRINT


 [機能] スプライトバッファに文字を書き込みスプライトで文字を表示させます。

 [書式] SP_PRINT pt, "表示文字列" ,x ,y [,フォントサイズ]

 [説明]
  pt: 'SP_DEF'で定義されたパターンナンバー。
    バッファの指定位置、この枠内に文字を書き込みます。
  "表示文字列": スプライトバッファに書き込む文字列。
    ここを chr$(12) とすると cls と同じ機能(エリア内の文字クリア)になります。
  x,y: 書き込む文字座標。
    ptの指定エリアの左上を(0,0)として文字単位で座標指定します。
  フォントサイズ: 文字のサイズです。
    省略もできます。 font 命令でもサイズ変更できます。
    座標系(表示できる文字数)に影響を与えます。
    サイズは8pixelの倍数に丸められます。

  表示の流れとしてはSP_DEFで文字の書き込み場所を確保して
  SP_PUT SP_ON で実際の表示を割り当て、表示位置指定して
  SP_PRINTで実際にバッファへ文字を書き込み、
  それが画面に表示されるという形になります。
  一枚のスプライトで文字表示用のウインドウのような使い方ができます。

  さらに事前にカラーを指定する必要があります。
  テキスト画面の設定と同じ命令を使用します。
  color テキストカラー,グラフィックカラー
  このテキストカラーが文字の色、グラフィックカラーが背景が塗りつぶされる色
  となります。最初は
  color col(15),0
  として背景を黒(透明)にして試して下さい。(デフォルトで白になっている)
  文字は何度も上書き可能なので前の文字はこの背景色で毎回クリアされることになります。

[例]"smp_spprint.bas"
   10 color col(15),0
   20 sp_def 1,(128,128),160,96
   30 sp_put 1,(32,32),1
   40 sp_on 1,1
   50 sp_print 1,"SC-12800",1,1
   60 sp_print 1,"LEFT OOO",1,2