gsquare 命令の右下隅が欠ける現象
ぴょぴょ 2013/5/26(Sun) 18:18:48|NO.54321
初めて質問します。
こちらはHSP歴2ヶ月半の者です。
なお、C言語歴16年、C++言語歴7年だったりします。
最近、HSPでいろいろとツールソフトを作成し、
マニュアルとネット検索より gsquare 命令の使い方を覚えました。
そこで今日はシューティング・ゲームを試しに作ろうとしました。
そこで問題が発生します。
まずは次のサンプルを実行して見て下さい。
// 記号定数
#const FIGHT_XSIZE (32)
#const FIGHT_YSIZE (32)
#const SLOPE_COUNT (7)
// メイン部
*Main
gosub *MakeImage : pos 0, 0 : gcopy 2,0,0,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
gosub *CopyImage : pos 0,32 : gcopy 1,0,0,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
stop
// 自動画像生成
*MakeImage
buffer 2,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
font MSGOTHIC,FIGHT_YSIZE
s="B","A","@","山","@","A","B"
x=0
y=0
rrr=$00 : ggg=$99 : bbb=$00
repeat SLOPE_COUNT
color rrr,ggg,bbb : boxf x,y,(x+FIGHT_XSIZE),(y+FIGHT_YSIZE)
color $00,$66,$00 : pos x,y : mes s(cnt)
x+=FIGHT_XSIZE
ggg+=$11
loop
gsel 0
return
// 四角形のコピー
*CopyImage
buffer 1,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
color $00,$00,$00 : boxf
x=0
y=0
// B
dstX=(x+8),(x+24),(x+24),(x+ 8)
dstY=(y+8),(y+ 0),(y+32),(y+24)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// A
dstX=(x+4),(x+28),(x+28),(x+ 4)
dstY=(y+8),(y+ 0),(y+32),(y+24)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// @
dstX=(x+0),(x+32),(x+32),(x+ 0)
dstY=(y+4),(y+ 0),(y+32),(y+28)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// 山
dstX=(x+0),(x+32),(x+32),(x+ 0)
dstY=(y+0),(y+ 0),(y+32),(y+32)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// @
dstX=(x+0),(x+32),(x+32),(x+ 0)
dstY=(y+0),(y+ 4),(y+28),(y+32)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// A
dstX=(x+4),(x+28),(x+28),(x+ 4)
dstY=(y+0),(y+ 8),(y+24),(y+32)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
// B
dstX=(x+8),(x+24),(x+24),(x+ 8)
dstY=(y+0),(y+ 8),(y+24),(y+32)
srcX=(x+0),(x+32),(x+32),(x+ 0)
srcY=(y+0),(y+ 0),(y+32),(y+32)
gsquare 2,dstX,dstY,srcX,srcY : x+=FIGHT_XSIZE
gsel 0
return
上記のサンプルは1段目の画像を gsquare で変形して buffer 2 にコピーしてます。
この2段目の左側の3つの画像を見て下さい。
私の環境ではB、A、@の右下隅が欠けてます。
皆さんの環境では正常に台形コピーできてますか?
同じ現象で右下隅が欠けていた場合は、どのように修正すれば良いのか?
教えて欲しいです。(HSPバグなのでしょうか?)
ぴょぴょ 2013/5/26(Sun) 18:20:01|NO.54322
> 上記のサンプルは1段目の画像を gsquare で変形して buffer 2 にコピーしてます。
間違った。
buffer 1 にコピーします。
暇人 2013/5/26(Sun) 19:19:00|NO.54324
> buffer 2,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
を
buffer 2,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE+1
にする
ぴょぴょ 2013/5/26(Sun) 19:55:13|NO.54326
暇人さんへ
ありがとうございます。
正しく台形コピーされました。
しかし、なぜ33ピクセルにしないといけないのでしょうか?
(y+31)にすれば正しく台形コピーされますが、
その場合は下の1ドットがコピーされないよね。
暇人 2013/5/26(Sun) 21:53:11|NO.54334
*MakeImage内のgsel 0の上に
color 255
line 0,FIGHT_YSIZE,(FIGHT_XSIZE*SLOPE_COUNT),FIGHT_YSIZE
を追加すると何が起こってるか分かり易い
変形させる場合隣接してるドットも使用される事がある
隣接のドットがバッファに存在しないから欠けてる感じ
バグか仕様(高速化のためにチェック省いてるとか)かは分からない
ぴょぴょ 2013/5/26(Sun) 23:17:27|NO.54335
暇人さんへ
再回答ありがとうございます。
> 変形させる場合隣接してるドットも使用される事がある
> 隣接のドットがバッファに存在しないから欠けてる感じ
なるほどね。
> バグか仕様(高速化のためにチェック省いてるとか)かは分からない
そうですね。
gsquare 命令のアルゴリズムが分からないので判断できませんね。
きっと偶数よりも奇数でないと正常に台形コピー出来ないのでしょうな。(仮説)
一様、問題は解決しましたので「解決」チェックを付けて終了します。