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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0724
バッファ画像を並べる6解決


バッファ

リンク

2015/7/24(Fri) 19:01:10|NO.70219

ひとつのバッファ内に画像を並べたいです。
これを関数化して setBuffer 仮id,画像名
とすることで例えばbuffer 1に配置され さらにidと画像位置を配列に記憶しgetBufferで表示みたいなことをしたいです。
(celdivを使う画像みたいなものを生成したい)

構造は考えられるのですがなかなか実行できません..

ソースっぽいもの

#deffunc 並べた画像作成関数 int ID,str 画像名 buffer 一時バッファ picloaad 画像名 gsel 並べ画像用バッファ(あらかじめ初期化) pos 画像最終X ,画像最終Y(XはYが限界になった時に画像の最大の大きさXを記憶しておいてそこからX+最大数,0に) gcopy ああーだこーだ IDに対応するboxfと同じ画像XYXYを配列として記憶しておく。 return #deffunc 表示 int id,int スクリーンId IDに対応するBoxfXYXYを取り出し 表示 return

ここまでできているのにできないです..



この記事に返信する


バッファ

リンク

2015/7/24(Fri) 19:03:31|NO.70220

最初のほうなんか文法がおかしくなっていました

正:
これを関数化して setBuffer 仮id,画像名のようにし、
並べ画像用バッファに画像が配置され さらにidと画像位置を配列に記憶しgetBufferで表示みたいなことをしたいです。



窓月らら

リンク

2015/7/24(Fri) 22:10:15|NO.70224

その並べる処理を実行時にする必要があるかどうかを先に考えるべきかと。
ふつう、ゲームなんかのパターン画像は予め並べた1枚の画像を用意しておき
それをプログラムからロードし、あるサイズごと(16x16とか32x32とか)に区切り
それぞれのパターンに対し内部番号を割り当てるということをします。

celdivがまさにコレですが、私はceldivは使わず自分で実装しています。
(パターンサイズが可変だったりするため)

実行時にわざわざ並べるのは効率的にどうかと思いますので
その場合は、まず並べるプログラム(ツール)を別に作り、
画像と関連データをファイルに保存します。
あとは、そのデータをゲーム等のプログラムから読んで処理します。

いちばん簡単なのは、左上から若い番号を割り当てる方法(パターンサイズ固定)。
左上が 0 番。以下のように画像に対して番号を割り当てる
折り返し位置は任意ですが、うちの場合は横16パターン。

0 1 2 3 4 5 6 7 8 9 A B C D E F
10,11,12 ...以下続く

または座標そのものを番号で管理する方法。
変数をそのぶん食いますが、パターン可変ではこっちのが有効。必要なのは以下

座標(左上)X,Y 横縦幅 W,H

これを配列で管理するだけだと思います。0番なら x(0) y(0) w(0) h(0)
あとはこれらの情報を元に、gcopy 等で転送してやるだけ。



窓月らら

リンク

2015/7/24(Fri) 22:32:21|NO.70225

あ、勘違いしたかな、パターン画像のような物を作りたいわけじゃなくて
並べた画像を表示したい? でも考え方は同じ事です。
問題は読み込む画像サイズが固定なのか、可変なのかってところ。
いちおう

buffer 1
picload "ファイル名"

等とすれば直後に ginfo_winx ginfo_winy で画像サイズは取得できるので
これを利用すればいいと思います。



暇人

リンク

2015/7/25(Sat) 02:41:03|NO.70226

これが理解できれば難しくは無いと思う

dirlist fnames,dir_exe+"\\hsptv\\*.jpg",1 screen 1,2048,2048 width 800,600,0,0 boxf font "MS ゴシック",24 notesel fnames buffer 2 repeat notemax noteget fname,cnt picload dir_exe+"\\hsptv\\"+fname gsx=ginfo_sx gsy=ginfo_sy //下の処理は用意できる画像サイズが大きいため縮小処理してるだけなので通常はm=1.0で良い if gsx>256 or gsy>256 {//256超えるなら縮小処理 if gsx > gsy { m=256.0/gsx //256になるように倍率計算 }else{ m=256.0/gsy } }else{ m=1.0 //256以下なら等倍 } gsel 1 if (px+m*gsx)>ginfo_sx {px=0:py+sy_max:sy_max=0.0}//今回の画像を描画する範囲が残ってないから左に戻し下に移動 pos px,py celput 2,0,m,m rect_left_list(id_cnt)=px //画像左座標 rect_top_list(id_cnt)=py ///画像上座標 rect_right_list(id_cnt)=ginfo_cx //画像右座標 (celputはカレントポジションが描画画像分右に移動する) rect_bottom_list(id_cnt)=py+m*gsy //画像下座標 px=ginfo_cx if (m*gsy)>sy_max {sy_max=m*gsy} //横並びで一番縦サイズが大きいのを下に移動するときに使用(画像のサイズが一定なら必要無い) color 255,255,255 pos rect_left_list(id_cnt),rect_top_list(id_cnt) mes "ID="+id_cnt+" ["+fname+"]" mes "PX="+rect_left_list(id_cnt)+" PY="+rect_top_list(id_cnt) mes "SX="+(rect_right_list(id_cnt)-rect_left_list(id_cnt))+" SY="+(rect_bottom_list(id_cnt)-rect_top_list(id_cnt)) id_cnt++ //次のID gsel 2 loop gsel 0,1 font "MS ゴシック",24 await 0 repeat color boxf id=cnt\id_cnt pos 0,0 color 255 //デバッグ用データ表示 mes "ID="+id mes "PX="+rect_left_list(id)+" PY="+rect_top_list(id) mes "SX="+(rect_right_list(id)-rect_left_list(id))+" SY="+(rect_bottom_list(id)-rect_top_list(id)) gcopy 1,rect_left_list(id), rect_top_list(id), rect_right_list(id)-rect_left_list(id), rect_bottom_list(id)-rect_top_list(id) await 1000 loop
座標はboxf形式じゃなくgcopy形式にしといた方が描画時に利用しやすいんじゃ?



バッファ

リンク

2015/7/25(Sat) 23:39:28|NO.70235

ありがとうございました。解決です。
もう一つ質問ナノですが、メモリ指定等でbufferは使えないのでしょうか?
例えば暇人さんのコードを関数化してそれをどうにかしてgcopyやobjimageの指定に使えませんか?
bufferは増やしたくないです。



バッファ

リンク

2015/7/26(Sun) 20:46:12|NO.70245

とりあえず解決にしておきます



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