>>疑問は、複数のキャラの表示法です。どうしたら短いコードで表示できるか教えて下さい。
配列変数と繰り返しを使用するのが一般的です。
同じ処理を複数回使用する場合には、サブルーチン、または
ユーザー定義命令を使用します。
サブルーチンに関しては cats さんの 回答、もしくは gosub 命令の ヘルプのページに
山ほどサンプルが有ったりします。
ユーザー定義命令に関してはスクリプトの
#deffunc draw var x_ , var y_
の部分で定義しています。
普通は
#module
#deffunc draw var x_ , var y_
return
#global
の様に使いますが、#module #global に挟まなくとも 引数を持つラベルの様に使用することも出来るみたいです。
#const emtotal 500
#const cipsize 10
#const CSM1 cipsize-1
#const wndx 320
#const wndy 320
#const areax wndx-cipsize
#const areay wndx-cipsize
#define ctype GET rnd(3)-1 // -1 から 1 の間の値をランダムに取得
#enum WID_MAIN = 0
screen WID_MAIN , wndx,wndy
dim emx , emtotal // Position
dim emy , emtotal
dim emsx , emtotal // 移動方向とスピードを兼ねる
dim emsy , emtotal
dim emc , emtotal // 色
// 敵を作成
repeat emtotal
emx.cnt = rnd(areax)
emy.cnt = rnd(areay)
emc.cnt = rnd(190)
emsx.cnt = GET()
emsy.cnt = GET()
loop
// メインルーチン
*@
redraw 0
stick key,0b1111
color:boxf
// NPC描画
repeat emtotal
dup x,emx.cnt
dup y,emy.cnt
dup sx,emsx.cnt
dup sy,emsy.cnt
if(rnd(100)==0){ // 一定 の 確率で向きを変更
sx=GET()
sy=GET()
}
// 位置加算
x+=sx
y+=sy
// 画面端折り返し
if((x>=areax) or (x<=0)):sx=-sx
if((y>=areay) or (y<=0)):sy=-sy
// 描画
hsvcolor emc.cnt,255,120
draw x,y
loop
// PC描画
if(key&0b0001):cx--
if(key&0b0010):cy--
if(key&0b0100):cx++
if(key&0b1000):cy++
hsvcolor i,120,255:i+=5
draw cx,cy
redraw
await 30
goto*@b
// ポジションを有効範囲に丸めて描画
#deffunc draw var x_ , var y_
x_=limit(x_,0,areax)
y_=limit(y_,0,areay)
boxf x_,y_,x_+CSM1,y_+CSM1
return