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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0720
空気(HSP3dish)端末解像度に合わせつつ縦横比固定23解決


空気

リンク

2015/7/20(Mon) 04:06:48|NO.70167

HSP3dishのサンプルプログラム、block3のように
端末の画面サイズに合わせて、描画するようにしたいのですが、
その際に縦横比を固定したいのです。
具体的には4:3に固定したいです。(16:9等の端末の場合は縁が出るようにしたい。)
そのような事は可能なのでしょうか?



この記事に返信する


窓月らら

リンク

2015/7/20(Mon) 04:22:46|NO.70168

それは Androidなどの端末上の話でしょうか?
その場合なら、スケーリングを使ってください。
具体的には main.c の hgio_autoscale を有効にします。
このあたりは「HSP3Dish android(NDK)版プログラミングガイド」を
読んでみてください。(iOS版は触ってないので分かりません)

ヘルプ→HSPキーワード検索で「hsp3dish」で検索すれば関連マニュアルが出てきます。



kanamaru

リンク

2015/7/20(Mon) 13:32:35|NO.70169

スケーリングはiosでは使えないので、独自で擬似スケーリングをしたらどうでしょう。
明日サンプルを提示します。



kanamaru

リンク

2015/7/20(Mon) 22:19:18|NO.70170

よく考えたら少し言葉を間違えました。
iosではなく、正確にはios版hsp3dishでした。



空気

リンク

2015/7/21(Tue) 01:23:08|NO.70171

早速、プログラミングガイドを見てきたのですが、
HSP3Dish android(NDK)版プログラミングガイドの
12.画面サイズのスケーリングについてに書いてありました。
絶対的なスケーリングの方は知っていたのですが、(960x720等)
相対的なスケーリングについては見逃していました。(0.75fx1f等)
AndroidManifest.xmlを書き換えることで横画面に固定できるようですね。

ご親切な返信ありがとうございました。

現在の開発環境はAndroidです。今後は表記します。
iOSも環境が構築できれば開発したいと思っているので、
iOSのスケーリングについても教えていただければ幸いです。



空気

リンク

2015/7/21(Tue) 01:44:47|NO.70172

main.c内のhgio_scale( 0.75f, 1.00f )に縦横比を設定してみましたが、
画像の縦横比が正常に表示されず、痩せたようになってしまいました。
HSP側にginfo_winx,ginfo_winyに画面サイズを4:3と認識させる等して
解決する事はできるのでしょうか?



kanamaru

リンク

2015/7/21(Tue) 12:05:11|NO.70173

すべての環境下で使えるスケーリングモジュールをつくりました。
サンプルつきです。

#module hspscale //スケーリングします。スケール後、カレントポジションがスケール後の左上座標に自動でなります。 #deffunc scaling r=ginfo_r:g=ginfo_g:b=ginfo_b color 0,0,0 boxf color 255,255,255 boxf ginfo(12)/2-ginfo(13)*3/4/2,0,ginfo(12)/2+ginfo(13)*3/4/2,ginfo(13) spos 0,0 color r,g,b return //スケーリングした後の相対座標でカレントポジションを設定します。 #deffunc spos int x,int y scalex=ginfo(12)/2-ginfo(13)*3/4/2 pos x+scalex,y return //スケーリング後のスクリーンサイズを取得できます。 #define global ginfo_scalex scalex@hspscale #define global ginfo_scaley ginfo(13) #global //以下サンプル scaling spos 0,0 mes "test"



kanamaru

リンク

2015/7/21(Tue) 12:07:43|NO.70174

少し見た目の問題から修正です。
3/4/2を0.375に変えてください。
(スケーリングのスペルあっているかな?)



窓月らら

リンク

2015/7/21(Tue) 23:04:44|NO.70180

空気さん>

私の場合はこう書いてあります。

hgio_view( 320, 480 ); // screen size //hgio_scale( 1.0f, 1.0f ); // scale value hgio_autoscale( 0 ); // auto scale value hgio_uvfix( 1 );
hgio_view で解像度を指定(アス比もこのとおり)して
hgio_autoscale を有効。
hgio_uvfix は描画内容によっては必須。



窓月らら

リンク

2015/7/21(Tue) 23:15:52|NO.70181

hgio_autoscale() について、マニュアルより引用。

0 : 画面全体に収まる最適な大きさ(縦横比は維持)  ←アス比固定ならコレ
1 : X方向のサイズを基準に拡大縮小(縦横比は維持)
2 : Y方向のサイズを基準に拡大縮小(縦横比は維持)
3 : 縦横比は無視して画面全体に表示



窓月らら

リンク

2015/7/21(Tue) 23:36:36|NO.70182

ついでだから hgio_uvfix についても軽く解説。
マニュアルにも書いてない気がするからね。

これは、スケーリングの拡大縮小や gzoom grotate 等でコピーする際に
範囲外の上下左右1ピクセルを拾って表示してしまう不具合を改善するもの。
つまり等倍表示なら問題は現れないが、
スケーリングをすれば内部的には拡大縮小と同じ事なので不具合が現れる。

で、hgio_uvfix を有効にすると、コピー範囲の上下左右の端っこ1ピクセルだけ
半ピクセルくらいで処理される。描画結果をよーく見れば分かります。
これはこれで問題なケースもあるが、そこは仕様とにらめっこしてサジ加減。



空気

リンク

2015/7/22(Wed) 11:16:13|NO.70188

窓月ららさん>
マニュアルを見た感じではファミコンとかのドット絵を
綺麗に拡大処理する描画設定かと思っていましたがそんな風に使えるんですか。
hgio_uvfix( 1 )の仕様について教えて下さり、ありがとうございます。

hgio_viewについては
hgio_view( 320, 480 )等を設定すると、
高解像度の端末で綺麗に描画できないと思うので、あえて使用しない予定です。

kanamaruさん>
素晴らしいスケーリングモジュールをありがとうございます。
スケーリングのスペルはScalingで問題ないと思います。(Googleで確認しました。)
ginfo(13)*3/4/2をginfo(13)*0.375に変更した所、何故か正常に描画出来ないようです。
下記に画像を載せますので、ご覧下さい。

ginfo(13)*3/4/2
http://s2.gazo.cc/up/31951.png
ginfo(13)*3/4/2をginfo(13)*0.375に変更
http://s2.gazo.cc/up/31952.png

一応、ソースコードも、*0.375に変更しただけですが。
#module hspscale
//スケーリングします。スケール後、カレントポジションがスケール後の左上座標に自動でなります。 #deffunc scaling r=ginfo_r:g=ginfo_g:b=ginfo_b color 0,0,0 boxf color 255,255,255 boxf ginfo(12)/2-ginfo(13)*0.375,0,ginfo(12)/2+ginfo(13)*0.375,ginfo(13) spos 0,0 color r,g,b return //スケーリングした後の相対座標でカレントポジションを設定します。 #deffunc spos int x,int y scalex=ginfo(12)/2-ginfo(13)*0.375 pos x+scalex,y return //スケーリング後のスクリーンサイズを取得できます。 #define global ginfo_scalex scalex@hspscale #define global ginfo_scaley ginfo(13) #global //以下サンプル scaling spos 0,0 mes "test"



窓月らら

リンク

2015/7/22(Wed) 13:43:38|NO.70193

空気さん>

ginfo(13)*3を割ってるんだと思いますが・・
ginfo(13)*3/8 とか (ginfo(13)*3)/8 と同じだけど。
そもそも ginfo(13)*0.375 と書くなら先頭を実数にしないといけない。

あとAndroid環境のhsp3dishでは、画像を縮小する方向で調整すれば
hgio_view( 320, 480 ) とかの解像度設定とは無関係に端末解像度が生かせます。
↑これはあくまで 座標解像度 です。
別スレで書いたことがあるのですが、どこだったかな・・



空気

リンク

2015/7/23(Thu) 08:50:40|NO.70203

窓月ららさん>
ginfo(13)はこちらの初歩的なミスのようですね。
教えていただきありがとうございます。
hgio_view( 320, 480 )は絶対解像度ではないのは知りませんでした。
検証してみましたが、綺麗に描画出来ました。
教えていただきありがとうございます。



空気

リンク

2015/7/23(Thu) 09:17:45|NO.70204

hsp3dishで画像と背景を表示してみたのですが、
スケーリングの上に描画されてしまうようです。

boxfを削除して、モジュールの背景色を変更しても
画像が上に書かれてしまいます。
記述に問題があるのなら、教えて下さい。

#include "hspscale.as"はスケーリングモジュールを
.asのモジュール化し使ってみた物です。
ginfo(13)*3を変更して、そのまま.asでHSPのcommonフォルダに保存した物です。

背景の塗りつぶしの2重表記しなくてもいいように
スケーリングモジュールの背景色を
モジュール外で変更できるようにしたいのですが、
ヘルプを見ても、モジュールの知識が0の私では難しいようです・・・

ソースコードは下記です。
#include "hsp3dish.as"
#include "hspscale.as" x1=0:y1=0 ;画面左上の座標 x2=ginfo_winx:y2=ginfo_winy ;画面右下の座標 screen 0,x2,y2 title "β" gfilter 2;画像補完_最高品質 setcls 1,$ffffff;書きかえ時背景白 gmode 2 *var_set ZX = 1.0;拡大率X ZY = 1.0;拡大率Y *pic_load celload "title.png",1 celdiv 1,1781,599,809,299 *pic_draw repeat redraw 0 scaling color 0,0,128;青背景 boxf spos x2/8,y2/2 celput 1,0,ZX,ZY;画像を表示 redraw 1 ZX /= 1.03;X縮小 ZY /= 1.03;Y縮小 if (cnt\3)=0 : await 16 : else : await 17 ; 60fps wait if ZX < 0.002 && ZY < 0.002 : break;拡大率が0.002を下回った時にループを抜ける loop repeat redraw 0 scaling color 0,0,128;青背景 boxf spos x2/8,y2/2 celput 1,0,ZX,ZY;画像を表示 redraw 1 ZX *= 1.03;X拡大 ZY *= 1.03;Y拡大 if (cnt\3)=0 : await 16 : else : await 17 ; 60fps wait if ZX >= 1 && ZY >= 1 : break;拡大率が1以上の時にループを抜ける loop goto *pic_draw;縮小描画に戻る

スケーリングモジュールは下記です。(一応です。)
#module hspscale
//スケーリングします。スケール後、カレントポジションがスケール後の左上座標に自動でなります。 #deffunc scaling r=ginfo_r:g=ginfo_g:b=ginfo_b color 0,0,0 boxf color 255,255,255 boxf ginfo(12)/2-(ginfo(13)*3)/8,0,ginfo(12)/2+(ginfo(13)*3)/8,ginfo(13) spos 0,0 color r,g,b return //スケーリングした後の相対座標でカレントポジションを設定します。 #deffunc spos int x,int y scalex=ginfo(12)/2-(ginfo(13)*3)/8 pos x+scalex,y return //スケーリング後のスクリーンサイズを取得できます。 #define global ginfo_scalex scalex@hspscale #define global ginfo_scaley ginfo(13) #global



kanamaru

リンク

2015/7/23(Thu) 22:25:47|NO.70210

5行目かもしれません。ginfo_scalexとかを使うようにしてみたらどうでしょう。
この場合、画面サイズはスケーリングした後のを取得するべきなので。



空気

リンク

2015/8/8(Sat) 21:06:16|NO.70559

kanamaruさん>
個人的な用事で遠方へ行っていた事で
返信出来ずに申し訳ありません。

ginfo_scalex等に変更して試してみたいと思います。



kanamaru

リンク

2015/8/8(Sat) 22:12:08|NO.70561

スケーリング外に描画できるのは実は他にも理由が考えられます。
例えば、座標指定に範囲外を指定できたり。
こちらの事情でしばらくhspが使えないので、使えるようになったら
モジュールを作り直します。
今のところは、標準のスケーリングを使うか、ご自分でモジュールの改造を試みてください。



空気

リンク

2015/8/8(Sat) 22:42:35|NO.70563

kanamaruさん>
今の所はAndroidでのみ開発をしているので、標準のスケーリングを使用しようと思います。
モジュールの改造はまだ苦手なので、出来る範囲を弄ってみようかと思います。
気軽に待っていますので、事情を優先なさってください。



kanamaru

リンク

2015/8/11(Tue) 16:18:25|NO.70613

いまさら過ぎますが、
僕が作ったモジュール、解像度全く考えてなかった。
でも多分ただboxf使ってるだけだし解像度に影響してないとは思います。
もし、解像度無視してたとしても、標準のスケーリングを使うとのことですので
問題はないとこちらでは判断させてもらいます。



kanamaru

リンク

2015/8/18(Tue) 16:35:30|NO.70890

モジュールの機能追加しました。
(技術不足で引数省略できません。正確には省略すると黒が指定される。)

//スケーリングの縁を描画しなおします。これにより、はみ出て描画したのを消すことができます。 #deffunc rescaling int sr,int sg,int sb;引数省略できません。技術不足です。 r=ginfo_r:g=ginfo_g:b=ginfo_b color sr,sg,sb boxf 0,0,ginfo(12)-ginfo_scalex/2,ginfo(13) boxf ginfo(12)+ginfo_scalex/2,0,ginfo(12),ginfo(13) color r,g,b return //redrawに自動リスケーリング機能を追加しました。 #deffunc redraw2 int i if(i=1):rescaling redraw i return
差分だけとなっているので、自分で#module〜#globalの中に追加してください。



空気

リンク

2015/8/23(Sun) 23:31:31|NO.71011

返信遅れました、申し訳ありません。
更新ありがとうございます。
下記のような追加方法で問題ないでしょうか?
検証し次第、バグ等がありましたら、報告させていただきます。

#module hspscale
//スケーリングの縁を描画しなおします。これにより、はみ出て描画したのを消すことができます。 #deffunc rescaling int sr,int sg,int sb;引数省略できません。技術不足です。 r=ginfo_r:g=ginfo_g:b=ginfo_b color sr,sg,sb boxf 0,0,ginfo(12)-ginfo_scalex/2,ginfo(13) boxf ginfo(12)+ginfo_scalex/2,0,ginfo(12),ginfo(13) color r,g,b return //redrawに自動リスケーリング機能を追加しました。 #deffunc redraw2 int i if(i=1):rescaling redraw i return //スケーリングした後の相対座標でカレントポジションを設定します。 #deffunc spos int x,int y scalex=ginfo(12)/2-(ginfo(13)*3)/8 pos x+scalex,y return //スケーリング後のスクリーンサイズを取得できます。 #define global ginfo_scalex scalex@hspscale #define global ginfo_scaley ginfo(13) #global



kanamaru

リンク

2015/8/24(Mon) 07:04:57|NO.71021

scaling命令は残します。
完全版を後で投稿します。
scaling命令にも色指定機能つけときます。



kanamaru

リンク

2015/8/24(Mon) 07:46:04|NO.71022


#module hspscale //スケーリングします。スケール後、カレントポジションがスケール後の左上座標に自動でなります。 #deffunc scaling array back,array huti r=ginfo_r:g=ginfo_g:b=ginfo_b color huti(0),huti(1),huti(2) boxf color back(0),back(1),back(2) boxf ginfo(12)/2-(ginfo(13)*3)/8,0,ginfo(12)/2+(ginfo(13)*3)/8,ginfo(13) spos 0,0 color r,g,b return //スケーリングした後の相対座標でカレントポジションを設定します。 #deffunc spos int x,int y pos x+ginfo_scalex,y return #deffunc rescaling int sr,int sg,int sb;引数省略できません。技術不足です。 r=ginfo_r:g=ginfo_g:b=ginfo_b color sr,sg,sb boxf 0,0,ginfo(12)-ginfo_scalex/2,ginfo(13) boxf ginfo(12)+ginfo_scalex/2,0,ginfo(12),ginfo(13) color r,g,b return //redrawに自動リスケーリング機能を追加しました。 #deffunc redraw2 int i if(i=1):rescaling redraw i return //スケーリング後のスクリーンサイズを取得できます。 #define global ginfo_scalex ginfo(12)/2-(ginfo(13)*3)/8 #define global ginfo_scaley ginfo(13) #global
でいいと思います。



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