//キャラクターを自由に動かす //#include "設定.txt" //上の#includeで外部テキストファイルを読み込んでフレームスキップと町の人口? //見たいなのを変数に代入して設定しています //今はとりあえず直下に変数を定義しておきます frameskip=1 people=10 //←自由に変更可能 screen 0,640,480 font msgothic,24 chara_number=people randomize dim x,chara_number dim y,chara_number dim r,chara_number dim g,chara_number dim b,chara_number dim xgo,chara_number dim ygo,chara_number repeat chara_number x.cnt=rnd(640) y.cnt=rnd(480) r.cnt=rnd(255) g.cnt=rnd(255) b.cnt=rnd(255) loop //0は自分 goto *main //------------------------------------- #deffunc drawp stick key,15 //十字キーで動かせる物体がひとつ存在します、peopleの値をおおきく if key&1 : x.0-=2 //しすぎると埋もれてしまいますが; if key&2 : y.0-=2 if key&4 : x.0+=2 if key&8 : y.0+=2 repeat chara_number //画面からはみ出ないための処理 if cnt!0 { x(cnt)-=1 : y(cnt)-=1 if count\16=0 : xgo(cnt)=rnd(3) : ygo(cnt)=rnd(3) x.cnt+=xgo.cnt*1 : y.cnt+=ygo.cnt*1 } if x(cnt)>628 : x(cnt)=628 if y(cnt)>480 : y(cnt)=480 if x(cnt)<12 : x(cnt)=12 if y(cnt)<32 : y(cnt)=32 loop return #deffunc drawp2 //ここで描画順を決定 //各人(長方形)のy座標を0〜480それぞれ参照し、描画させています repeat 481 ycheck=cnt //各ループが参照するy座標 repeat chara_number ya=y.cnt if ya!ycheck : continue color r.cnt,g.cnt,b.cnt //もし現在参照しているy座標と物体のy座標が一致したら、 boxf x(cnt)-12,y(cnt)-32,x(cnt)+12,y(cnt) //その物体を描画。 loop loop return *main gmode 0 repeat count=cnt redraw 0 color 255,255,255 : boxf drawp if frameskip!1 : if count\frameskip=0 : continue drawp2 redraw 1 await 1000/60 loop
上のスクリプトは、RPGでマップ上を歩くスプライト(長方形)の相互の前後関係も含めて描画させるものです。
特定のスプライトより上の座標にいればそのスプライトの下(後ろ)に表示され、逆も然りです。
ここで#deffuncで定義したdrawp2命令のy座標を参照している部分について、
簡単に言えば毎フレームでy座標の小さい順にスプライトを描画させているんですが、
スクリプトがちょっと複雑すぎるような気がしまして・・・(実際、これをつくってみたら
かなり処理が遅くなりました)
いちいちy座標ごとにすべてのスプライトのy座標との一致を確認しているのが面倒なきがします。
もう少しシンプルに記述できる方法、または以上のものと異なるもっと効率のいい処理の方法
がなにかありましたらアドバイスください。