ORANGE-lightプログラミング作法

(準備中)


1.ORANGE-lightの基本
2.ゲームを作る
 グラフィックス座標系はどうなっている?
 どんな命令がある?
 circle命令がない?
 スプライトを作る(その1)
 スプライトを作る(その2)
 スプライトを操作する
 スプライトの状態を取得する
 スプライトは何個まで?

3.組込み制御のためのI/O操作
 

1.ORANGE-lightの基本

2.ゲームを作る

・グラフィックス座標系はどうなっている?

 左上が原点で以下の図のようになっています。

 
(0, 0)                          (319, 0)











(0, 239)                       (319,239)

・どんな命令がある?
 pset文line文rect文gprint文などで描画できます。
 色を指定するところは、rgb関数を使います。

 
ただし、rgb関数では色が直感的にわかりづらいので使う前に色の定義をしておいた方がよいでしょう。

 ORANGE = rgb(255, 165, 0)
 gprint 100, 100, "ORANAGE-color1",
ORANGE

・circle命令がない?
 ORANGE-lightは軽量化のために、最低限の基本命令しかありません。
 pset文で関数を作っておけば、あたかもcircle命令があるかのように記述できます。
 (circle文は作れませんが、circle関数を作って呼び出します。
 円描画のアルゴリズムはWeb検索すると見つかります。)

 circle(100, 100, 50, ORANGE)
 end

 def circle(x, y, r, color) {
  var p
  var q
  var F
  p = r
  q = 0
  F = -2 + r + 3
  while q <= p
   pset x - p, y + q, color
   pset x + p, y - q, color
   pset x - p, y - q, color
   pset x + q, y + p, color
   pset x - q, y + p, color
   pset x + q, y - p, color
   pset x - q, y - p, color
   if 0 <= F then p = p - 1: F = F - 4 * p
   q = q + 1
   F = F + 4 * q + 2
  wend
 }

スプライトを作る(その1)
 グラフックス画面を利用したゲームは、スプライト関連の命令を利用すると比較的簡単に作れます。
 スプライトは矩形のイメージパターンでできています。
 最初にメモリー配列にイメージパターンを用意しておきます。
 イメージはmdataw文で1ピクセルごとに16ビットのカラー値で指定します。
 下記は4×5の矩形のイメージです。

      IMAGE0 = getmptr()
mdataw 0xf800, 0xf800, 0xf800, 0xf800
mdataw 0xf800, 0x07e0, 0x07e0, 0x07e0
mdataw 0xf800, 0x07e0, 0x07e0, 0x07e0
mdataw 0xf800, 0x001f, 0x001f, 0x001f
mdataw 0xf800, 0x001f, 0x001f, 0x001f

 mdataw文では定数しか指定できませんので、あらかじめORANGE-studioでprint文を実行して確認しておきます。(print hex$(rgb(255, 0, 0))の結果が0xf800なので、赤の値が0xf800だとわかります。)
 イメージの格納先番地は、mdataw文の直前のgetmptr関数で取得できます。
 イメージさえ格納しておけば、sprnew関数でスプライトを簡単に作成できます。

 sprite0 = sprnew(0, 100, 100, 4, 5, IMAGE0, 0, 0)

 sprnew関数で指定したスプライト番号と同じ番号が返ってくれば、スプライトの作成に成功です。
 以降はそのスプライト番号で管理できます。

スプライトを作る(その2)
 上記の方法でスプライトを作成すると、イメージデータでメモリーを大量に消費してしまいます。
 前景色と背景色だけでスプライトを作成すると、メモリーが節約できます。
 イメージは1ピクセルを1ビットで指定します。
 mdata文で8ビットずつ格納できます。(矩形の幅が8の倍数でなくてはならないという制限が付きます。)
 ビットが立っている部分が前景色、そうでない部分が背景色になります。
 下記は8×5の矩形のイメージです。

      IMAGE1 = getmptr()
mdata 0xff
mdata 0x81
mdata 0x01
mdata 0x80
mdata 0xff

 この場合は、sprnew関数で前景色と背景色を指定してスプライトを作成します。

 sprite1 = sprnew(1, 100, 120, 8, 5, IMAGE1, rgb(255, 0, 0), rgb(0, 255, 0))

 ゲーム作成用に用意した16×16のイメージデータ8×8のイメージデータがありますので、自由にお使いください。

スプライトを操作する
 スプライトを作成しただけでは不可視状態です。
 sprdsp文でスプライトの可視/不可視を変更できます。
 sprmov文でスプライトを移動します。

スプライトの状態を取得する
 sprget文でスプライトの状態を取得できます。
 sprget文は、スプライトの状態をメモリー配列に読み込みます。
 よく使う座標の読み出しなどは、関数を作っておくとよいでしょう。

 const WORK = 0x0000
 print "x = "; getX(1)
 print "y = "; getY(1)
 ・・・・・・
 // スプライトのx座標を返します。
 def getX(spriteNumber) {
  sprget spriteNumber, WORK
  retrun mpeekw(WORK / 2)

 }


 // スプライトのy座標を返します。

 def getY(spriteNumber) {
  sprget spriteNumber, WORK
  retrun mpeekw(WORK / 2 + 1)
 }

 二つのスプライトの状態を取得すれば、重なりの判定は可能ですが、
 sprhit関数を使えば簡単です。


スプライトは何個まで?
 スプライトの数はORANGE-insideの実装によりますが、たとえば、0~9までの計10個です。これは同時に操作できるスプライトの数です。
 スプライトを表示のためにだけ使うような場合は、スプライトの使い回しができます。

 16×16ピクセルのイメージデータを表示するだけなら、同じスプライト番号を使いまわして、以下のような関数を作ることができます。

 def gput16(x, y, address, foreColor, backColor) {
  sprnew(0, x, y, 16, 16, foreColor, backColor)
  sprdsp 0, 1
 }


3.組込み制御のためのI/O操作