R u by 書いてます T yp e S cr ipt / C # / P er l / R u by あたりが好き その他: 伺か / 漫画読み描き / OP アニメ愛好家 / 鉄 T w itt er: @nar az aka G it hu b: @N ar az aka np m: @nar az aka CPAN : NARA Z AKA R u byG ems: N ar az aka P ix iv: 奈良阪 M edia M ar ker: nar az aka
indows 立ち上げる前に HP とか T hink P ad とか Z OT AC とかロゴ が出てるあそこ 2010年以降の PC (M ac込み)で旧来の BIOS から徐々 に置き換わって いる OS なし状態にもかかわらず結構高水準な API が存在する← ここ重要 例: キー ボー ド, マウス, ファイルシステム, 画面表示, ネットワー ク, et c.
e L ineとか), F ile S yst em(r ead, r eaddir 等) ゲー ムに要りそうなやつ 描画系(1dot、 矩形、 円形、 画像描画) 入力系( get c相当他、 on K eyP r ess、 on M ous e*) 簡易イベントルー プ ゲー ムに要りそうなやつで付随して必要になったもの p ng等一般画像形式読み込みライブラリの統合 st dlib.hとstr ing.hの一部(mallocとか) フォント ゲー ム本体 簡易シー ンマネー ジャー( 諸事情によりマクロ) ノベルゲー ムシナリオインター プリター マウスカー ソル描画
c h o o l . p n g ( 背景ファイル) : R 0 = s u r f a c e 0 . p n g ( 人物0 のファイルを右に描画) : L 1 = s u r f a c e 1 0 . p n g ( 人物1 のファイル左に描画) @ ねぷ ( 名前欄) > はろー ( セリフ) ‐ ( ここまでが1 セリフ) : R 0 = s u r f a c e 1 . p n g > にゅー わー るど ‐
dout とst derr の別はないが文字は出せるので普通にラッパを実装 op en, r ead, r eaddir, clos eの流れは大体一緒 op endir とop enの区別がなくて一緒くたに処理する なお文字列は w c h a r _ t * 相当の C H A R 1 6 * = E F I _ S T R I N G (UTF 16LE ) パス区切りは FA T っぽく \ \ ( E F I _ S T R I N G ) L " f o n t s \ \ 3 3 . p n g "
, f r e e , r e a l l o c , a b s , i t o a ( s t d l i b . h ) m e m s e t , m e m c p y , s t r n c p y , s t r c p y , s t r c a t , s t r l e n ( s t r i n g . h ) を自前で書くことに……。 / / 例: m a l l o c v o i d * m a l l o c ( U I N T N s i z e ) { v o i d * p t r ; E F I _ S T A T U S S t a t u s = l i b c : : B o o t S e r v i c e s ‐ > A l l o c a t e P o o l ( E f i L o a d e r D a t a , s i z e , & p t r ) ; r e t u r n S t a t u s = = E F I _ S U C C E S S ? p t r : n u l l p t r ; } フルスクラッチ風味とかこだわらず単に UEFI アプリケー ションを作りたいだけなら、 EDK II という SDK を使うとこの辺には困らないはず。
が必要になったが…… ネイティブ API は m a l l o c 相当の A l l o c a t e P o o l と f r e e 相当 の F r e e P o o l しかない この制約下での r e a l l o c は f r e e → m a l l o c か、 最初にメモリ位置 指定までできる A l l o c a t e P a g e s を使うしかなさそう。 どちらにしても、 現在どのポインタがどのサイズを持っているかとい う情報を保持せねばならない。 ↑ 大変 (EDK II では頑張って実装していた。) (st bにはサイズ情報を追加で渡すr ealloc_s iz edという拡張呼び出しが用 意されていたのでなんとか事なきを得た。)
クロスコ ンパイル環境だと実装がなさそう? 3. 「 mat h.h 実装」[検索] 4. どうやらfdlibmというライブラリがもとになっているらしい? 5. fdlibmは古く、W ebでファイルを配ってるだけなので導入しにくさ 6. ただし M akefileがめっちゃシンプルで良い 7. G it hu bにあるのだと J ulia L ang/openlibm が使いやすそう 8. 結局時間切れにより導入には至らず
フォントを用意 JF ドット K app a20‑0213 2. t ar lety/tt f2p ngがフォントが対応している文字ごとに1つずつテキス トファイルに出してくれるのでその部分だけ使う( 他部分は古くて 動かなかった) 3. テキストファイル全部をさらって I mage M agickでp ngにする c o n v e r t ‐ b a c k g r o u n d n o n e ‐ f i l l b l a c k + a n t i a l i a s ‐ f o n t J F ‐ D o t ‐ K a p p a 2 0 ‐ 0 2 1 3 . t t f ‐ p o i n t s i z e 2 0 l a b e l : @ # { t e x t _ f i l e } f s / f o n t s / 文字コー ド数値. p n g " 4. UEFI では FA T ファイルシステム上においたファイルが普通に読める ので頑張って1文字ごと表示時に画像読みまくって描画
2. 昔のコンピュー タの日本語フォント ROM よろしくデー タを全部 st at icに持ってしまうのはどうか? 3. p ngからむりやりデー タのcpp ファイルを生成↓ c o n s t p n g = P N G . s y n c . r e a d ( i m a g e . r e a d F i l e S y n c ( ) ) ; . . . f o n t s S t r + = ` s t a t i c U I N T 8 c f o n t _ $ { c h a r C o d e } _ a l p h a [ ] { ` ; f o r ( l e t i = 0 ; i < l e n g t h ; + + i ) { f o n t s S t r + = ` $ { p n g . d a t a [ i * 4 + 3 ] } , ` ; } f o n t s S t r + = ` } ; \ n ` ; バイナリが8MB くらいになって、 起動失敗したので断念
v o i d * o p e r a t o r n e w ( U I N T N s i z e ) { r e t u r n m a l l o c ( s i z e ) ; } など定義することで一応解決はできる v irtu al関係はlibc++が型解決を受け持っているらしく使えない → cxx abi.hで定義されててる__class_typ e_infoまたは __v mi_class_typ e_infoと言うクラスがないと実現できないっぽい。 C ++は言語組み込みでクラスの全挙動をサポー トしているわけではなく、 インター フェー スだけ用意して実装は本質的に自前でやる必要がある…… だと……ッ!?
e w 子クラス( ) S c e n e * s c e n e = n e w S t a r t S c e n e ( ) ; s c e n e ‐ > u p d a t e ( ) ; この u p d a t e ( ) が子クラス S t artS ceneのものを指せないので、 無理矢理 ダウンキャストするなどしかない……? 今回はマクロで定数定義してsw it chで分岐するなど無理矢理対応し た……。 # d e f i n e s c e n e I d ( C l a s s ) C l a s s # # I d # d e f i n e d e l r a r e S c e n e ( C l a s s ) s t a t i c C l a s s * C l a s s # # _ o b j # d e f i n e i n i t S c e n e ( C l a s s ) C l a s s # # _ o b j = n e w C l a s s ( ) # d e f i n e s c e n e C a s e ( C l a s s ) c a s e C l a s s # # I d : \ C l a s s # # _ o b j ‐ > u p d a t e ( ) ; + + C l a s s # # _ o b j ‐ > t i c k ; b r e a k ; # d e f i n e c h a n g e S c e n e ( C l a s s ) c u r r e n t S c e n e I d = C l a s s # # I d
t r u e ) ; ではなくタイマー で描画スピー ドを調整でき はするが……? C or e i7が載ってる PC の QEMU では元気に60fps 出してくれる Z BO X CI 320だと30fpsもでない → 早期に認識していたので、 その辺関係ないノベルゲー に絞った やり方が間違っていたりするだろうか……?