HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1205
さーすbuffer ~ gcopy に変わるhgimg3の機能11解決


さーす

リンク

2015/12/5(Sat) 13:13:10|NO.73427

2Dグラフィックを使ったゲームを製作中なのですが、
標準命令では画像処理が重くなってしまうためhgimg3(directx)を使用して画像処理をしようと模索
しています。
現時点の記述は
バッファを大量に定義してそれぞれにpicloadで画像を読み込み、gcopyで随時使用する、という方式
なのですが
ほとんど完成してしまっているため、記述が大量すぎて改めて1から、というのは難しく
可能であれば バッファからgcopyする部分をhgimg3の同じような機能の命令に置き換えられないものか、と
考えています。
自分でもいろいろ模索したのですが何分素人なのでdirectxに関してはちんぷんかんぷんで・・・
質問自体がおかしい可能性もありますが、どうにか buffer x : gcopy x をhgimg3の機能に置き換えるにはどのようにしたらよいでしょうか・・・



この記事に返信する


cats

リンク

2015/12/5(Sat) 14:08:04|NO.73434

gcopyやpicload等を使用したコードはそのままでも正しく実行できるようにしたい、ということでしょうか。
Windowsが全てVM上にあってDirectXが使えないので、確認できないのですが、
#undefと#defineでgcopy等の命令をhgimg3のものに書き換えていけば、できないことも無いと思います。
もし画像の管理のプログラムを
#const buf_enemy 1
buffer buf_enemy : picload "enemy.png"
~
gcopy buf_enemy, ~~
のように書いているのであれば、これを最終的に
texload "enemy.png" : buf_enemy = stat
~
hgrotate buf_enemy, ~~
という風に変更するような定義を行なえばいいです。
buffer 1 : picload "enemy.png"
のように数字でIDを書いている場合は、
texload "enemy.png"
data(1) = buf_enemy
という風にIDの変数を保持するためのモジュールを作る必要があります。
gcopyで呼び出すときも
gcopy 1, ~~ => hgrotate data(1), ~~
と定義します。



さーす

リンク

2015/12/5(Sat) 14:37:09|NO.73435

catsさん、ありがとうございます!

catsさんのおっしゃるとおりの意図で合ってます!


screen 0,800,700 buffer 1 picload "enemy.png" buffer 2 ----省略----- gsel 0 goto *main *main gmode 4,,,255 color 255,255,255 pos 0,0 gcopy 1,0,0,200,200 pos 200,0 gcopy 2,0,0,200,200 ---省略----

かなり省いて書くとこういう感じの処理になってます。
なるほど、命令の書き換えですか・・・



暇人

リンク

2015/12/5(Sat) 16:39:48|NO.73437

gcopyの代わりに使うhgrotateはposで設定されてる座標が
コピー画像の中心になるように描画されるので画面上の
表示位置の調整が必要になる(当たり判定等はそのままで大丈夫だろう)


#include "hgimg3.as" #undef picload #define picload(%1) texload %1 //texload2にするとpngのアルファ値対応になるがSYSREQ_COLORKEYは無視される #undef gcopy #define gcopy(%1,%2=0,%3=0) hgrotate %1,%2,%3 //hgrotateのp5,p6は描画サイズなのでgmodeと違うサイズを指定すると拡縮してしまうので省略 screen 0,800,700 hgini hgsetreq SYSREQ_COLORKEY ,$0 //これ以降に読み込んだ画像の黒を透過 picload dir_exe+"\\hsptv\\hsptv_img.bmp" texid(1)=stat picload dir_exe+"\\hsptv\\logop.bmp" texid(2)=stat gsel 0 clscolor $4040 goto *main *main hgdraw //画面初期化(clscolorで指定した色で塗られる) gmode 2,200,200 //コピー元のサイズ(gcopyのp4,p5と同じ) pos 100,100 gcopy texid(1),0,0 gmode 2,360,148 pos 200,300 gcopy texid(2),0,0 hgsync 16 goto *main
結局色々変更が必要だから
エディタの置き換え使って地道に修正した方が良い気がする・・・



cats

リンク

2015/12/5(Sat) 18:00:24|NO.73442

Windows 10で動かしたらDirectX動いたので作ってみました。
画像IDに数値をそのまま使われているようなので、それに対応させました。
pos+hgrotateの座標がpos+gcopyに合わない、という問題は考えてないので、適当に改造してください。
使用可能なbufferの数はMAX_PICTで調整してください。
あと、gmodeは2に固定しているので、そこも仕様に合わせて変えてください。

#include "hgimg3.as" #module "alternative" // del #undef buffer #undef picload #undef gcopy // max texture #const MAX_PICT 256 // hgini #define global hgini_ hgini : dim link, MAX_PICT : LAST = -1 // picload #define global picload(%1, %2) _picload_ %1 #deffunc _picload_ str f texload f link(LAST) = stat return 0 // buffer #deffunc buffer int _id_ link(_id_) = 0 LAST = _id_ return // gcopy #define global gcopy(%1, %2=0, %3=0, %4=0, %5=0) _gcopy_ %1, %2, %3, %4, %5 #deffunc _gcopy_ int p1, int p2, int p3, int p4, int p5 gmode 2, p4, p5 hgrotate link(p1), p2, p3, 0.0, p4, p5 return 0 #global // main hgini_ buffer 1 picload "test.bmp" buffer 2 picload "test.bmp" *main hgdraw pos 160, 120 gcopy 1, 0, 0, 64, 64 pos 100, 100 gcopy 2, 0, 0, 32, 32 hgsync 20 goto *main
同じようにgzoom等も作れると思います。
picloadの前にhginiの呼び出しが必要なので、初期化をhgini_にしています。



さーす

リンク

2015/12/5(Sat) 19:48:06|NO.73452

お二方ともありがとうございます!
catsさんのスクリプトを導入したところ、元のbufferの数が多すぎるのか、
buffer 700前後のところからtexture error(-1)が出てしまうようです
MAX_PICTの値を増やしても改善されませんでした・・・



cats

リンク

2015/12/5(Sat) 20:29:03|NO.73454

> buffer 700前後のところからtexture error(-1)が出てしまうようです
MAX_PICTも正しく設定しているなら、モジュールが原因でエラーが起こっているとは思えません。
もしかしたらhgimgの方に管理できる上限があるのかもしれません。
具体的にどの関数でエラーが起こりますか。
エラーメッセージや変数の様子などを書いていただけると何か分かるかもしれません。



暇人

リンク

2015/12/5(Sat) 20:41:13|NO.73455

テクスチャ最大数も設定する必要がある
> #define global hgini_ hgini : dim link, MAX_PICT : LAST = -1


#define global hgini_ hgsetreq SYSREQ_MAXTEX,MAX_PICT : hgini : dim link, MAX_PICT : LAST = -1
に変更



さーす

リンク

2015/12/5(Sat) 20:50:11|NO.73456

試したところ、チャクスチャID 590までは読み込めているようです
buffer 591のあとのpicload命令で、「texture error(-1)」とエラーダイアログが出て停止します
MAX_PICTの値は1000にしてあります。



さーす

リンク

2015/12/5(Sat) 20:58:09|NO.73458

かぶってしまいました申し訳ないです
暇人さんのとおり記述を変更した場合、buffer 1 :picload の時点で同様のエラーになってしまうようです



暇人

リンク

2015/12/5(Sat) 21:15:21|NO.73459

あぁ、MAX_PICTがグローバル指定されてない
てか、hgini_マクロがグローバルだから配列や変数がグローバルに・・・

MAX_PICTはグローバル指定はしないままhgini_行を変更

#define global hgini_ hgsetreq SYSREQ_MAXTEX,MAX_PICT@alternative : hgini : dim link@alternative, MAX_PICT@alternative : LAST@alternative = -1



さーす

リンク

2015/12/5(Sat) 22:23:26|NO.73465

ありがとうございます!
無事エラー無くテクスチャ表示までできました
gzoomの置き換えやposのずれの問題等なんとかがんばってみようと思います
本当に助かりました



ONION software Copyright 1997-2023(c) All rights reserved.