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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0407
初心者謎のシステムエラーが出ます・・・5解決


初心者

リンク

2021/4/7(Wed) 14:45:12|NO.92574

始めまして、プログラミング初心者です。
力技で実行ファイルにフォントを埋め込もうと、
pset命令でフォントを描画する関数を自動生成するスクリプトを書いたんですが、
何故か92行でエラーが出ます。
何が問題なのでしょうか・・・
全く見当がつかず困っております・・・(HSP3のバージョンは3.5.1です)
;マクロ定義----------------------------------------------------
;==バッファの設定== #define buff_info_id 0 ;情報などを表示するウィンドウのID #define buff_font_id 1 ;フォントを描画するバッファID #define buff_font_x 16 ;フォントを描画するバッファのサイズ #define buff_font_y 16 ;==フォントの設定== #define font_name msgothic ;使用するフォント #define font_size 12 ;フォントのサイズ #define color_white color 255,255,255 ;色指定(白) #define color_black color 0,0,0 ;色指定(黒) ;初期化----------------------------------------------------- ;バッファを作成する buffer buff_font_id,buff_font_x,buff_font_y ;フォントテーブル(仮) font_table={"!\"#$%&'()*+,-./0123456789:;<=>?@ ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_` abcdefghijklmnopqrstuvwxyz{|}~ ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞ ただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽ まみむめもゃやゅゆょよらりるれろゎわゐゑをん ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾ タダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポ マミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ "} ;テーブルから改行を取り除く font_table=strtrim(font_table,0,13) font_table=strtrim(font_table,0,10) ;現在描画するキャラクタ(仮) font_table_currentchar="" ;スクリプト生成用中間データ保存用変数 font_script_out="" ;最終出力データ font_script_bitmap="" ;ビットマップ font_script_size="" ;フォントサイズ temp="" ;一時変数 flag=0 ;一時フラグ ;フォントスクリプト生成処理-------------------------------- for font_table_index,0,varsize(font_table),font_table_currentchar_size ;キャラクタが全角か半角か調べて文字コードを取得 font_table_currentchar="" if peek(font_table,font_table_index) >=129 and peek(font_table,font_table_index) <= 159 or peek(font_table,font_table_index) >= 224 and peek(font_table,font_table_index) <= 252 { ;全角 font_table_currentchar_size=2 font_table_currentchar_code=wpeek(font_table,font_table_index) }else{ ;半角 font_table_currentchar_size=1 font_table_currentchar_code=peek(font_table,font_table_index) } wpoke font_table_currentchar,0,font_table_currentchar_code ;wpoke get_str,0,get_int ;バッファにフォントを描画する gsel buff_font_id color_black:boxf color_white:font font_name,font_size:pos 0,0:mes font_table_currentchar ;中間データに書き込み(フォントサイズ) notesel font_script_size noteadd "case "+font_table_currentchar_code noteadd "return "+ginfo_mesx ;描画されたフォントを解析してスクリプトに変換 temp="" for y,0,buff_font_y,1 flag=0 for x,0,buff_font_x,1 pget x,y if ginfo_r!0 or ginfo_g!0 or ginfo_b!0 { if flag=1 : temp+":" ;同じ行に続けて書き込む場合はダブルクォーテーション追加 temp+"pset x+"+x+",y+"+y+"" flag=1 } next ;あまりにも1行が長いとスクリプトエディタが落ちるので改行を追加 if flag=1 { temp+"\n" } next ;中間データに書き込み(ビットマップ) notesel font_script_bitmap noteadd "case "+font_table_currentchar_code noteadd temp noteadd "return" next ;中間データをもとに最終的なスクリプトを生成 notesel font_script_out noteadd "#module \"sub_fontdrawscript\"" ;文字列描画 noteadd "#deffunc pfontdraw var code,int x,int y" noteadd "switch code" noteadd font_script_bitmap noteadd "swend" noteadd "return" ;文字サイズ取得 noteadd "#deffunc pfontxsize var code" noteadd "switch code" noteadd font_script_size noteadd "swend" noteadd "return" noteadd "#global" ;処理結果(仮)---------------------------------------------- gsel buff_info_id mesbox font_script_out,640,480,0 notesave "font.hsp"



この記事に返信する


沢渡

リンク

2021/4/7(Wed) 16:56:08|NO.92575

原因はよくわかりませんが、短かい間にあまりにも大量のnoteaddを実行しているせいで
処理が追いつかないのかもしれません。
私の環境では"noteadd font_script_bitmap"の次に"wait 10"を挟んだら上手くいきました。

…しかし、それはそれとして、フォントの表示を「自動生成される大量のpset文」で行うというのは
いささか力技が過ぎるように思います。
(psetはやや重い命令なので、処理速度の面でも問題がありそう)
使用する文字はASCII文字とカナ文字に限定しているようですから、
文字を並べた画像ファイルを作ってそれを実行ファイルに内蔵し、
celdivとcelputなどを使って表示した方が良いのではないでしょうか。
(gmode 2やgmode 4なら透過表示も可能ですし、gmode 7を応用すれば好きな色での表示も可能)

もしくは、配布可能なフリーのフォントを同梱するという方法もあります。
以下、以前作成した「フォントをインストールなしで使用するモジュール」です。

//フォントをインストールせずに使用するモジュール #include "gdi32.as" #module #const use_fonts 10 //登録できるフォントの最大数 #const global FR_PRIVATE 0x10 //「登録したフォントをこのプログラムだけで使用する」オプション #const global FR_NOT_ENUM 0x20 //「登録したフォントがフォント選択ダイアログ等で表示されないようにする」オプション #deffunc font_file_init l_flag=0 dim l_opt,use_fonts sdim l_name,64,use_fonts return //font_file p1,p2,p3 //指定したファイル名のフォントを一時的に使えるように登録する。 //p1はフォントのファイル名。 //p2を1にした場合はこれまでの登録を解除。(省略時は0) //p3はFR_PRIVATEかFR_NOT_ENUMか、もしくは0かを指定。(省略時はFR_PRIVATEとFR_NOT_ENUMの両方とも有効) #define global font_file(%1,%2=0,%3=0x30) _font_file %1,%2,%3 #deffunc _font_file str file,int cl_flag,int opt if cl_flag : font_clean l_opt(l_flag)=opt l_name(l_flag)=file l_flag++ AddFontResourceEx file,opt,0 return #deffunc font_clean onexit repeat if l_flag<=0 : break l_flag-- RemoveFontResourceEx l_name(l_flag),l_opt(l_flag),0 loop return #global font_file_init //←最初に実行する //以下、IPAフォントを使った例 //ipag.ttf(IPAゴシック)とipam.ttf(IPA明朝)をスクリプトor実行ファイルと同じフォルダに入れておく //https://ipafont.ipa.go.jp/old/ipafont/download.html font_file "ipag.ttf" //IPAゴシックのファイル font_file "ipam.ttf" //IPA明朝のファイル font "IPAゴシック",10,0 mes "東京特許許可局" font "IPA明朝",10,0 mes "バスガス爆発"



沢渡

リンク

2021/4/7(Wed) 17:14:34|NO.92576

すみません、IPAフォントのDL先はこちらで。
https://moji.or.jp/ipafont/ipa00303/



初心者

リンク

2021/4/7(Wed) 19:06:41|NO.92578

>沢渡さん

助言ありがとうございます。
gmode7で色変更できるの知らなかった・・・

フォントファイルを同梱するのも考えたんですけど、
それだとライセンス的に使えるフォントが限られてしまうのと、
環境によって表示が変わってしまうという問題があり、(mactypeを導入している環境やLinuxなど)
他の表示方法を模索してます。
普段メッセージを表示するときは一旦メッセージ用バッファに文字列を描画してから、
gcopyでメインの画面に描画するという方法を使っているので、
処理速度に関してはそれほど問題にならないかなと思っています。

謎のエラーに関してですが、
確かにwait入れるとエラー吐かずに実行できる場合がありますね。
(何度か実行すると今度は違う行でエラーが出たりする・・・)
おっしゃるとおりnoteaddを連続で実行しているせいかもしれないので、
複数noteaddが連続している部分を一つのnoteaddにまとめてみます。

ありがとうございました。



zakki

リンク

2021/4/7(Wed) 19:50:27|NO.92579

たぶんこれで、hsp側の問題です。

http://hsp.tv/play/pforum.php?mode=pastwch&num=85786



初心者

リンク

2021/4/7(Wed) 20:18:34|NO.92580

>zakkiさん

ありがとうございます。
HSP側の問題ですか・・・
とりあえず、複数行に渡って呼ばれていたnoteaddを一つにまとめたらエラーが出なくなったので、
このまま様子を見てみることにします。



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