es_areaとes_exnewについて
撃 2013/8/3(Sat) 20:34:25|NO.56110
hspdxfixで、スプライトを使ったマップスクロールをちょっと作っていて
exnewに失敗する(開いたスプライトNoが無い)事が頻発して
妙だなと思ったので質問いたします。
作っていたソースからちょっと切り貼りした変なソースで申し訳ないですが。
#include "hspdx.as"
randomize
es_ini ,,256
es_screen 256,224,16,,1,1
width 512,384,0,0
es_cls
es_area 0,0,239,223
buffer 3,256,256,0
picload "test.bmp",0
es_buffer 0,0,-1,1
es_size 16,16,100
es_pat 0,16,0,0
es_pat 1,32,0,0
es_pat 2,48,0,0
es_pat 3,60,0,0
move_count=16
move_lock=0
move_dir=0
repeat 15
a=cnt
repeat 16
es_exnew b,0,256
es_set b,cnt*16,16*a,rnd(4),1,0
es_type b,2
loop
loop
*main
es_cls 0,0,0
stick ky,$0f
gosub *keychk
gosub *scroll
es_draw ,,,1
es_sync 16
await 0
goto *main
*keychk
if move_lock==0{
if ky&1 {move_dir=64 :move_lock=1}
if ky&4 {move_dir=192:move_lock=1}
}
if ky&128{es_bye:end}
return
*scroll
if move_lock==1&&move_count==16{
repeat 256
es_adir cnt,move_dir,100
loop
}
if move_count==0{
move_lock=0:move_count=16
repeat 256
es_adir cnt,move_dir,0
loop
}
if move_lock==1{move_count--}
return
(画像は何か適当なのをtest.bmpの名前で用意してください。)
カーソルで左右にスクロールしますが、es_area外に出たスプライトも
削除されること無くスプライトNo、キャラパターンから座標まで
全て保存されているようです。
エリア外に出たスプライトは破棄されて、スプライトNoも
自動的に再使用可能になると認識していましたが、違うのでしょうか?
暇人 2013/8/3(Sat) 22:45:09|NO.56113
es_getでflag値を取得して生きてる物のみes_adirしないと表示ONになる
撃 2013/8/3(Sat) 23:24:30|NO.56114
…なるほど!わかってきました。
つまり、es_areaのマニュアルにある
スプライト座標が(p1,p2)-(p3,p4)の範囲内にないものは、 自動的に削除されます。
は、正しく言うと
スプライト座標が(p1,p2)-(p3,p4)の範囲内にないものは、 flag値が0になります。
であり、
es_exnewは、flag値が0のスプライト番号を検索する。
そして、一度作られたスプライトはes_set等で内容を上書きされない限り
メモリ内に残っている。
ということなんですね。ありがとうございました。