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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1010
ひじきmes命令で大きめの文字列を表示したときの強制アンチエリアスについて9解決


ひじき

リンク

2011/10/10(Mon) 00:00:47|NO.42169

環境によりは少し異なるようですが
当方では Windows 7 home 64bit を使用しております。
それ以外の環境も必要でしたら明記いたします。
font命令で大きめの文字サイズ(当方では23以上)を指定した場合に、
font命令の第2パラメータ(フォントスタイル)に16を指定しなくても、
mes命令で表示される文字列に強制的にアンチエイリアスがかかってしまいます。
これを解決する方法はないでしょうか?

もしmes命令では不可能でも、
他の命令などでこれが実現できる方法があればそれを教えて頂ければ幸いです。

以下参考スクリプトです。


boxf , , 640, 240 font msgothic, 72 color 255,255,255 mes "HSP あいうえお 塵" gmode 2 , ginfo_mesx , ginfo_mesy pos ,240 gcopy ;----- pos 200,150 sysfont color 255,255,255 mes "gmode2 で0,0,0を透過してコピー\n ↓  ↓  ↓  ↓  ↓" pos 50,360 color mes "255,255,255で描画した文字列をコピーしているのに、ゴミが残っている。\nこれを指定した1色のみでクッキリ描画したい。"

私が使おうとしている用途の都合上、透過してコピーする必要があるため
「最初から"最終的に描画したい背景色"の上に描画すれば、ゴミは出ないよ。」
というのは無しでお願いします。



この記事に返信する


ひじき

リンク

2011/10/10(Mon) 00:12:08|NO.42172

冒頭3行あたりの文章が日本語としてかなりおかしなことになっていますが、
どういう文章を書こうと何度も試行錯誤して書き直している内に
誤字や文節のおかしさに気づかずそのまま投稿してしまいました。
意味は通じると思いますが一応訂正しておきます。

訂正前
---------------------------------------------
環境によりは少し異なるようですが
当方では Windows 7 home 64bit を使用しております。
それ以外の環境も必要でしたら明記いたします。
---------------------------------------------

訂正後
---------------------------------------------
当方では Windows 7 home 64bit を使用しております。
OS以外の環境も必要でしたら明記いたします。
さて、これは環境により少し異なるようですが、
---------------------------------------------

結果的にログを汚すことになってしまい、申し訳ありません。



ひらまる

リンク

2011/10/10(Mon) 00:14:06|NO.42173

それ前に自分も経験した気がします…
解決方法は覚えてませんが、というか解決したかどうかさえ定かではありませんが、
フォントサイズ16くらいで作ってgzoomというのはだめですよね…ん?
今fontの説明を見ていて気づいたのですが、
>スタイル16を指定すると、文字の縁にあるギザギザが消えて滑らかな表示になります。ただし、画面モードがフルカラーで初期化されている必要があるほか、Windows9X環境はサポートされないのでご注意下さい。
フルカラーである必要がある……?
ためしに1行目にscreen 0, 640, 480, 1を追加して……
きれいに消えた!!!

でもま、これってかなりごり押しの策ですよね。まともな解決策をお待ちください。
力に慣れなくて申し訳ない…;



inovia

リンク

2011/10/10(Mon) 01:33:30|NO.42179

モジュールを作ってみました。
font_naを使うと強制的にアンチエイリアスがかかりません。
font_naの第1パラがフォント名、第2パラがフォントサイズです。


#module _font_na_ #uselib "gdi32" #cfunc f2_CreateFont "CreateFontA" int,int,int,int,int,int,int,int,int,int,int,int,int,str #func f2_DeleteObject "DeleteObject" int #func f2_SelectObject "SelectObject" int,int #deffunc font_na str f, int s hFont = f2_CreateFont(s,0,0,0,0,0,0,0,0x80,0,0,0x03/*NONANTIALIASED_QUALITY*/,0,f) f2_SelectObject hdc, hFont return // 終了時に呼び出し #deffunc _font_exit onexit f2_DeleteObject hFont return #global font_na msgothic, 72 mes "abcdefghijklmnopqrstuvwxyz"



ひじき

リンク

2011/10/10(Mon) 01:42:30|NO.42181

>>ひらまる様
とても早い回答ありがとうございます!

力になれないなんてとんでもないです。
gzoomは私も考えたんですが、文字があまりにも荒くなってしまうため理想的ではないです。
パレットモードにする方法ですが、こんな解決方法があるとは思っておりませんでした。
仰る通り確かに少しゴリ押しな方法かもしれませんが、
私が今回想定している用途はこの方法で解決できそうです。
今更ですが、どのような用途にこれが必要だったかというのを、
スクリプトでのせておきます。
ご回答頂き誠にありがとうございました。

スクリプトは非常に長くなってしまいます。申し訳ありません。
自分用に作ったものなので、コメントも無い上に書き方も雑です。

#module gradation_mes #deffunc gmes_init int win_x , int win_y gmes_tmp = ginfo_sel screen 100 , win_x , win_y screen 101 , win_x , win_y , 1 gsel gmes_tmp return #deffunc gmes_set str fontname , int fontsize , int fontstyle , int s_col , int e_col gmes_tmp = ginfo_sel gsel 101 font fontname , fontsize , fontstyle mes "hoge" mesx = ginfo_mesx mesy = ginfo_mesy gsel 100 gradf 0 , 0 , ginfo_winx , mesy , 1 , s_col , e_col gsel gmes_tmp return #deffunc gmes str m r = ginfo_r : g = ginfo_g : b = ginfo_b gmes_tmp = ginfo_sel gsel 101 color 255 , 255 , 255 : boxf : color pos 0 , 0 mes "" + m mesx = ginfo_mesx mesy = ginfo_mesy gsel 100 gmode 0 , ginfo_winx , mesy pos 0 , mesy : gcopy 100 pos 0 , mesy * 2: gcopy 101 gmode 2 , ginfo_winx , mesy pos 0 , mesy : gcopy 100 , 0 , mesy * 2 gsel gmes_tmp color 255 , 255 , 255 gmode 4 , mesx , mesy , 256 gcopy 100 , 0 , mesy color r , g , b pos ginfo_cx , ginfo_cy + mesy gmesx@ = mesx gmesy@ = mesy return #global ; -------------------------------------------------------------------------------------------------- ; モジュールここまで ; -------------------------------------------------------------------------------------------------- ; -------------------------------------------------------------------------------------------------- ; gmes_mod グラデーション文字列モジュール ; ヘルプ + サンプルスクリプト ; -------------------------------------------------------------------------------------------------- ; gmes命令の初期化 ; ; gmes_init p1 , p2 ; ; p1 = gmes作業用ウィンドウ初期化Xサイズ ; p2 = gmes作業用ウィンドウ初期化Yサイズ ; ; 描画したい文字列が作業用ウィンドウのサイズを超える場合、超えた部分は表示されない。 ; そのため、表示する可能性のある最大サイズを初期化時に設定しておくこと。 ; Yサイズは都合上表示する可能性のある最大サイズを*3した数値以上にしておくこと。 ; -------------------------------------------------------------------------------------------------- ; gmes命令の設定を行う ; ; gmes_set "fontname" , p1 , p2 , p3 , p4 ; ; p1 = フォントの大きさ ; p2 = フォントのスタイル ; p3 = グラデーション開始色の指定 ; p4 = グラデーション終了色の指定 ; ; "fontname" , p1 , p2 に関しては[font]命令のものと同じです。 ; p3,p4パラメータは $RRGGBB の形式で指定します。(16進数) ; (例) ; 赤 = $FF0000 ; 青 = $00FF00 ; 緑 = $0000FF ; -------------------------------------------------------------------------------------------------- ; グラデーション文字を表示 ; ; gmes "strings" ; ; "strings" : 表示するメッセージ、または変数 ; ; 基本的な使い方は[mes]命令と同じです。 ; \nによる複数行には対応しておりません。 ; [gmes_init]および[gmes_set]を先に実行しておく必要があります。 ; -------------------------------------------------------------------------------------------------- ; -------------------------------------------------------------------------------------------------- ; 以下サンプルスクリプト ; -------------------------------------------------------------------------------------------------- gmes_init 640 , 480 screen 0 , 640 , 480 pos 50,80 gmes_set "MS Pゴシック" , 64 , 0 , $00FFFF , $0000FF gmes "Hot Soup Processor" gmes_set "MS P明朝" , 32 , 0 , $00FFFF , $0000FF gmes "Hot Soup Processor" pos 50,280 gmes_set "MS Pゴシック" , 96 , 0 , $FF0000 , $FFFF00 gmes "おにたま万歳"

もしこのモジュールを使いたい方がいらっしゃいましたら、
どうぞご自由にご利用下さい。
作者名の明記なども一切必要ありません。
いないとは思いますが、念のため。



ひじき

リンク

2011/10/10(Mon) 01:56:54|NO.42183

>>inovia様
ご回答ありがとうございます!
そしてわざわざモジュールまで作成して頂き、頭があがりません。

今後、inovia様が作って下さったモジュールを使って
何かゲームを作ったりアプリを作る機会があるかもしれませんが、
その点は問題ありませんか?

すばらしいモジュールなので是非利用していきたいのですが、
念のために許可だけ頂きたいと思います。よろしくお願いします。



inovia

リンク

2011/10/10(Mon) 01:57:43|NO.42184

>念のために許可だけ頂きたいと思います。よろしくお願いします。

組み込み・改造等ご自由にどうぞです!



info

リンク

2011/10/10(Mon) 11:46:12|NO.42197

解決しているようですが、一応、GDI+ を使う方法も提示しておきます。
半透明から、gradationまで、全て一つの命令がやってくれます。


#include "a2d.hsp" alCreateImage 0 alGradientColor 0,0,10,0,RGBA(255,0,0,255), RGBA(,,,255) alfillrect 0,0,ginfo_winx,ginfo_winy alfont msGothic , 32 , 1 alGradientColor 0,0,ginfo_winx,ginfo_winy,RGBA(255,0,0,200), RGBA(255,255,255,200) aldrawtext "隣の客はよく柿食う客だ\n東京特許許可局\nfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",0,0,ginfo_winx,ginfo_winy,1,1 alcopyimagetoscreen 0,0 redraw



ひじき

リンク

2011/10/10(Mon) 16:09:10|NO.42214

>>inovia様
>組み込み・改造等ご自由にどうぞです!

ありがとうございます!是非使わせて頂きます。

>>info様
>半透明から、gradationまで、全て一つの命令がやってくれます。

なんと!?
そのような便利な命令があるとは知りもしませんでした。
それもhspの標準ヘルプに載っているようですね・・・;
確認を怠ってしまって申し訳ありません。
今回作りたかったのはアンチエイリアスのないグラデーション文字だったので、
a2dを使用することができませんが、描画がかなりキレイなので、
今後かなり多彩な方面で使っていきたいと思います。
教えていただき、誠にありがとうございました。

図々しいようですが、もしまだお返事を下さるお暇があれば
以下にもお答え頂ければ幸いです。
A2Dのリファレンスには目を通したつもりですが、また見逃していたらすみません。
A2Dでグラデーション文字を描画する際に、「縁取り」を付けるような機能はありますか?
自前でモジュールなどを組んで縁取りを実装してあげるしかないのでしょうか・・・?



ひじき

リンク

2011/10/10(Mon) 17:48:55|NO.42225

使う方がいるとは思いませんが、どうぞお使い下さいと書いた手前
放置しておくわけにもいかないので・・・;

上記のグラデーション文字モジュールですが、
動作テストをするバージョンのまま貼り付けてしまったのでこのままでは使えません。

4〜5行目の


screen 100 , win_x , win_y screen 101 , win_x , win_y , 1

をそれぞれ


buffer 100 , win_x , win_y buffer 101 , win_x , win_y , 1

に変えて下さい。



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