|
|
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」で検索すれば関連マニュアルが出てきます。
|
|
2015/7/20(Mon) 13:32:35|NO.70169
スケーリングはiosでは使えないので、独自で擬似スケーリングをしたらどうでしょう。
明日サンプルを提示します。
|
|
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と認識させる等して
解決する事はできるのでしょうか?
|
|
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"
|
|
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
| |
|
2015/7/23(Thu) 22:25:47|NO.70210
5行目かもしれません。ginfo_scalexとかを使うようにしてみたらどうでしょう。
この場合、画面サイズはスケーリングした後のを取得するべきなので。
|
|
2015/8/8(Sat) 21:06:16|NO.70559
kanamaruさん>
個人的な用事で遠方へ行っていた事で
返信出来ずに申し訳ありません。
ginfo_scalex等に変更して試してみたいと思います。
|
|
2015/8/8(Sat) 22:12:08|NO.70561
スケーリング外に描画できるのは実は他にも理由が考えられます。
例えば、座標指定に範囲外を指定できたり。
こちらの事情でしばらくhspが使えないので、使えるようになったら
モジュールを作り直します。
今のところは、標準のスケーリングを使うか、ご自分でモジュールの改造を試みてください。
|
|
2015/8/8(Sat) 22:42:35|NO.70563
kanamaruさん>
今の所はAndroidでのみ開発をしているので、標準のスケーリングを使用しようと思います。
モジュールの改造はまだ苦手なので、出来る範囲を弄ってみようかと思います。
気軽に待っていますので、事情を優先なさってください。
|
|
2015/8/11(Tue) 16:18:25|NO.70613
いまさら過ぎますが、
僕が作ったモジュール、解像度全く考えてなかった。
でも多分ただboxf使ってるだけだし解像度に影響してないとは思います。
もし、解像度無視してたとしても、標準のスケーリングを使うとのことですので
問題はないとこちらでは判断させてもらいます。
|
|
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
|
|
2015/8/24(Mon) 07:04:57|NO.71021
scaling命令は残します。
完全版を後で投稿します。
scaling命令にも色指定機能つけときます。
|
|
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
でいいと思います。
|
|