PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[edit]

CM: --
TB: --

page top

2011年05月13日更新

システムソフトウェア6.xx以降では、どうやらUNICODE文字のみのサポートになったらしく、DXライブラリPortableが採用していたシフトJIS文字コードでの描画が出来ません。よって、このブログで配布しているDXライブラリPortable v0.5.7 UTF-8版 を使用して文字描画を行うことを推奨します。


PSPは世界中に販売されている訳で、当然 世界中のフォントが入っています。
PSPが標準で持っている、その内蔵フォントを扱えるライブラリをイントラフォントと呼び、DXライブラリPortable には、そのイントラフォントが組み込まれているので、PSP内蔵フォントで文字列表示(描画)が出来ます。


PSP内蔵フォントで描画するライブラリ = イントラフォント

● フォントサイズを設定する(本家互換)
int SetFontSize( int size );

サイズは、縦のピクセル数値です。
縦=10ピクセルのフォントは、フォントサイズ10です。
縦=24ピクセルのフォントは、フォントサイズ24です。
20100604135322.jpg
↑↑ スクリーンショット prx で撮影した画像(実寸 480x272)


● 文字列描画関数その1
そのままの文字列を描画します。
int DrawString(X座標, Y座標, 文字列, 色コード, エッジの色コード);

[ 使用例 ]
DrawString(150, 100, "Hello", DXP_COLOR_GREEN, 0);

エッジの色コードを有効にするには、フォントのタイプを変更する関数(int ChangeFontType(int FontType);) で DX_FONTTYPE_EDGE を指定しておく必要があります(デフォルト)。
20100604185202.jpg
↑上から順に、エッジの色に 黒色、灰色、黄緑 を適用してみました。
フォントのタイプを「ノーマルフォント」にするとエッジは目立たなくなります。
> ChangeFontType(DX_FONTTYPE_NORMAL);


● 文字列描画関数その2
数値変数の値や文字列変数の文字列なども描画できます。
int DrawFormatString(X座標, Y座標, 色コード, 書式付き文字列,…);

[ 使用例 ]
int  NEDAN=15;
char *STR="パソコン\0x00";
DrawFormatString(100, 120, DXP_COLOR_WHITE, "この%sは%d万円です。",STR ,NEDAN);

この関数の前に、フォントのタイプを「エッジつきフォント」にするとエッジが有効になります。
> ChangeFontType(DX_FONTTYPE_EDGE);
20100604191527.jpg


● フォントのタイプを変更する(フォントにエッジを添えたりする)
int ChangeFontType( int FontType );

フォントのタイプ
・DX_FONTTYPE_NORMAL       : ノーマルフォント
・DX_FONTTYPE_EDGE        : エッジつきフォント
・DX_FONTTYPE_ANTIALIASING    : アンチエイリアスフォント
・DX_FONTTYPE_ANTIALIASING_EDGE : アンチエイリアス&エッジ付きフォント

「エッジ」…… 端(はし)、縁(へり)のこと
「アンチエイリアス」…… ピクセルのギザギザが目立たなく加工する為の処理
DXライブラリPortable では、アンチエイリアス処理は されません。


● イントラフォントのフォントを変更する
int ChangeFont(フォント名, 文字コード);

フォント名の詳細
DXライブラリPortable には font.h で2つだけ定義されています
#define DXP_FONTNAME_JPN  "flash0:/font/jpn0.pgf"
#define DXP_FONTNAME_DEFAULT DXP_FONTNAME_JPN

フォントを全部書き出してみます
flash0:/font/arib.pgf シンボル
flash0:/font/imagefont.bin 何だろう?
flash0:/font/jpn0.pgf  日本語
flash0:/font/gb3s1518.bwfon 中国語
flash0:/font/kr0.pgf  韓国語
flash0:/font/ltn0.pgf  ラテン語 ゴシック体(ニューロダン Pro)
flash0:/font/ltn1.pgf  ラテン語 明朝体(マティス Pro)
flash0:/font/ltn2.pgf  ラテン語 ゴシック体(ニューロダン Pro)斜体
flash0:/font/ltn3.pgf  ラテン語 明朝体(マティス Pro)斜体
flash0:/font/ltn4.pgf  ラテン語 ゴシック体(ニューロダン Pro)太字
flash0:/font/ltn5.pgf  ラテン語 明朝体(マティス Pro)太字
flash0:/font/ltn6.pgf  ラテン語 ゴシック体(ニューロダン Pro)太字斜体
flash0:/font/ltn7.pgf  ラテン語 明朝体(マティス Pro)太字斜体
flash0:/font/ltn8.pgf  ラテン語 ゴシック体(ニューロダン Pro)
flash0:/font/ltn9.pgf  ラテン語 明朝体(マティス Pro)
flash0:/font/ltn10.pgf ラテン語 ゴシック体(ニューロダン Pro)斜体
flash0:/font/ltn11.pgf ラテン語 明朝体(マティス Pro)斜体
flash0:/font/ltn12.pgf ラテン語 ゴシック体(ニューロダン Pro)太字
flash0:/font/ltn13.pgf ラテン語 明朝体(マティス Pro)太字
flash0:/font/ltn14.pgf ラテン語 ゴシック体(ニューロダン Pro)太字斜体
flash0:/font/ltn15.pgf ラテン語 明朝体(マティス Pro)太字斜体

文字コード全種類
INTRAFONT_STRING_ASCII  アスキー
INTRAFONT_STRING_CP437
INTRAFONT_STRING_CP850
INTRAFONT_STRING_CP866
INTRAFONT_STRING_SJIS  シフトJIS
INTRAFONT_STRING_GBK
INTRAFONT_STRING_KOR
INTRAFONT_STRING_BIG5
INTRAFONT_STRING_CP1251
INTRAFONT_STRING_CP1252
INTRAFONT_STRING_UTF8  UTF-8



スポンサーサイト

[edit]

CM: 5
TB: 0

page top

2011年2月21日更新
このページのプログラムコードはカスタムファームウェアPSPでのみ正常実行できます

● 文字列を描画した時の横幅を取得する(本家互換)
int GetDrawStringWidth( const char *文字列, int 文字数 );

この関数は、描画予定の文字列の「行はみだしチェック」が出来たり、センタリングで文字列を描画したい時の計算などに使います。右寄せも可能

[サンプルコード]
このソースコードから生成される実行ファイルには、以下の著作物の著作権が適用されます
DXライブラリPortable  DX Library Portable Copyright (C) 2008-2010 Kawai Yuichi.
intraFont   Uses intraFont by BenHur
ソースコード自体はBSDライセンスでいいかも知れません

#include <dxlibp.h>
#include <string.h>
#include <pspgu.h>

// 32ビットカラーの16進数コードを RGBから作成する計算式(マクロ)
#define RGB(r,g,b) ((((long)b<<16)|((long)g<<8)|((long)r))|0xFF000000)

#define MOJIRETSU "フォントサイズ12 日本語フォント シフトJIS"
#define FONTSIZE 12

PSP_MODULE_INFO("intraFont TEST", 0, 0, 0);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

int main()
{
int yokohaba, x_ichi; // 横幅ピクセル数, X位置

if(DxLib_Init() == -1) { // もしライブラリの初期化に失敗したら
goto OWARI; // ラベル:OWARI へ飛びます
}
//=================================================================================
SetDisplayFormat(DXP_FMT_8888); // 32ビット色モード
ClearDrawScreen();
DrawBox(0,0,480,272,RGB(0,58,10),TRUE); // 画面を濃緑色で塗りつぶし

SetFontSize(FONTSIZE); // フォントサイズ設定
ChangeFontType(DX_FONTTYPE_NORMAL); // エッジ無しフォント
DrawFormatString(0,0,RGB(0,255,255),MOJIRETSU); // printf();相当
yokohaba=GetDrawStringWidth(MOJIRETSU,strlen(MOJIRETSU)); // ← これです!
DrawFormatString(0,FONTSIZE*1,DXP_COLOR_WHITE,"全部で半角%d文字分で、長さは%dピクセル"
,strlen(MOJIRETSU),yokohaba);
DrawFormatString(0,FONTSIZE*2,DXP_COLOR_WHITE,"上の文字列を行の中央に描画させます。");

x_ichi=(int)((480-yokohaba)/2)-1; // 計算w
DrawFormatString(x_ichi,FONTSIZE*3,RGB(0,38,255),MOJIRETSU); // printf();相当

ScreenFlip(); // 画面表示

do { // 何かボタンが押されるまで待つ処理
ProcessMessage();
}while(CheckHitKeyAll() == 0);
//=================================================================================
OWARI:;

DxLib_End(); // 終了します
return 0;
}

Makefile は、過去記事参照して下さい

[ 実行結果 ]
20100611221048.png
↑ほら、この通り。青色でセンタリングされて書かれたよ


[ちゅうい]
文字コードは、シフトJISのみ対応です。UTF-8系の文字コードは文字化けします
20100611235746.jpg
ソースコードの文字コードを UTF-8 にして、SetCodepoint(DXP_CP_UTF8);書いてみたんですが効きませんでした


ハンドルを扱う関数の解説は省略します。各自お勉強して下さい♪
InitFontToHandle
CreateFontToHandle
DrawStringToHandle
DrawFormatStringToHandle
GetDrawStringWidthToHandle
GetDrawFormatStringWidthToHandle
DeleteFontToHandle


[edit]

CM: 2
TB: 0

page top


http://www.nicovideo.jp/watch/sm14449799

はいはい、初歩のプログラミングですな
やっぱワイド大画面っていいわ~~(笑)
拡大コマ送りとかでも見れるしw

皆さん作ってると思いますが、基礎なので、このプログラムコードを配布します♪

こっちで配布



[edit]

CM: 2
TB: 0

page top

このブログは初心者さんも利用しているので、「これは初歩だから出来るよね?」じゃなくて「初歩だから徹底して教えます」というスタイルにすべきだと考えを改めました

そんな訳で、PSPSDK版しかなかった"Hello,World."を、DXライブラリPortable版へ移植してみたプログラムソースコードを配布します。

ここからダウンロードして下さい(拡張子を ZIP で保存・解凍お願いします)
DxLibP_HelloWorld2.txt

うっかり著作権表記が抜けていたので、中身のファイルのタイムスタンプが 22:00:00 じゃ無いのをDLされた方は お手数ですが再度ダウンロードして下さいませ


実行結果はこんなの



解説はこっちでやっています→ここ

[edit]

CM: 2
TB: 0

page top

DXライブラリPortable版 "Hello,World."の解説 

2011/05/30
Mon. 08:09

遅刻しました。ごめんなさい(^^;;;

では本題。
前回配布したソースコード全文を貼り付けます。

main.c


  1. // 正規PSP開発も可能 DXライブラリPortable v0.5.7 UTF-8版
  2. //
  3. // 「はろー、わーるど!」簡易プログラムコード
  4. //
  5. // イントラフォントはUTF8コードのみ、みたいです。シフトJISは廃止っぽい(?)
  6. //
  7. // これは BSDライセンスとします
  8.  
  9. #include <dxlibp.h>
  10. #include "COLORS.H"
  11.  
  12. /*****************************************************************************
  13. * 関数の登録
  14. *****************************************************************************/
  15. int main(int argc, char *argp[]);
  16. void action(void);
  17.  
  18. /*****************************************************************************
  19. * もじゅ~る・いんふぉ / メインコードはユーザモード
  20. *****************************************************************************/
  21. PSP_MODULE_INFO("HelloWORLD", PSP_MODULE_USER, 1, 0);
  22. PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
  23. PSP_HEAP_SIZE_KB(16*1024); // 新規追加
  24. PSP_MAIN_THREAD_STACK_SIZE_KB(512); // 新規追加
  25.  
  26. /*****************************************************************************
  27. * main
  28. *****************************************************************************/
  29. int main(int argc, char *argp[])
  30. {
  31.   DxLib_Init();
  32.  
  33.   ClearDrawScreen(); // 描画先のグラフィックスをクリアする
  34.   action(); // アクション(実際のメイン処理)
  35.  
  36.   DxLib_End();
  37.   return(0);
  38. }
  39.  
  40. /*****************************************************************************
  41. * アクション(実際のメイン処理)
  42. *****************************************************************************/
  43. void action(void)
  44. {
  45.   DrawString( 100, 64, "DXライブラリPortable版",     GREEN, BLACK);
  46.   DrawString( 64, 96, "HELLO,WORLD はろー、わーるど!", WHITE, BLACK);
  47.   DrawString( 140,180, "何か押すと終了。",        YELLOW, BLACK);
  48.   ScreenFlip(); // 表示
  49.  
  50.   do  {             // 何か押されるまでループします
  51.     ProcessMessage();      // パッド入力
  52.   }while(CheckHitKeyAll() == 0);
  53.  
  54.   return;
  55. }




DXライブラリPortableを使うので、以下のようにインクルード記述を書きます
>  #include <dxlibp.h>


では、main( )関数から解説を始めます。

>  DxLib_Init();
ライブラリでプログラム開始の初期化手続きをします。まず最初のお約束記述です。
実行すると、

・PSP画面が32ビット色モードで初期化される
・mp3音声の発声準備が行われる
・パッド入力のスタンバイが行われる
・イントラフォントライブラリで文字を書く準備が行われる

・・・などが実行されて、即、色んなプログラムコードを実行できる状態に待機されるのです。
なんて俺得命令なんだっ!って思いますよ(笑)
ホントは返り値を確認して、エラーだったらプログラムを終了しないといけないのですが、そういう事は滅多にないと勝手に判断してエラーの場合の処理記述を省略しています

>  ClearDrawScreen(); // 描画先のグラフィックスをクリアする
PSP画面を黒色で初期化します(黒色で塗りつぶし)

>  action(); // アクション(実際のメイン処理)
関数 action(); を呼び出します

>  DxLib_End();
>  return(0);
ライブラリでプログラム終了手続きをする、お決まりの記述です



次、action( )関数の方
大雑把に解説すると、文字列を書いて、画面表示して、パッド入力待ち、ですよっ

DrawStringでの文字列の書き方は・・・
>  DrawString( X座標, Y座標, 文字列, 文字色, 文字背景色 );

PSPの画面サイズは、ヨコ480ピクセル×タテ272ピクセル です。
も一回、実行結果画像を貼ります

こんな文字列が描画されます。

DrawString( ~ ); で文字列を書いたら、ScreenFlip(); で画面表示させます
画面表示させないと反映できませんので重要事項ですよっ


>  do  {             // 何か押されるまでループします
>    ProcessMessage();      // パッド入力
>  }while(CheckHitKeyAll() == 0);
この3行もセットで覚えてください。
パッド入力待ち処理のお約束構文です。

何かパッド押されるまで処理が止まっているようにみえます。覚えておくと、役に立つと思います。


コンパイル・・・の前に
一旦、ソースコードを UTF-8文字コードでテキスト保存して下さい



いざ、コンパイル!
署名してコンパイル(ビルド)するには Makefile に次の2行を追加しておきます

BUILD_PRX = 1
ENCRYPT = 1


次回は、署名コンパイル用の Makefile 及び build.mak についての解説をします


[edit]

CM: 0
TB: 0

page top

これらのソースコードですが、ダウンロードして 比較してみた方はどれだけいるんだろうか?

どちらも、実行する作業は同じなのですが、最後だけ、やってる事が違います。

簡単に言うと、
・DXライブラリPortable版は、画面描画をした後で、ループでパッド入力のチェックだけをやっている
・旧OSLib版は、ループで 画面描画を行ないつつ、パッド入力チェックをやっている
という点です

で、DXライブラリPortable版は はっきり言って手抜き なのです
OSLib版のように、毎回画面描画をしつつ、パッド入力をやるのが好ましいプログラミング技術です

配布物はこのままにしておきます。
皆さんが好ましいと判断した "Hello,World." を作ってみてはいかがかな、と。

そろそろ、みなさんも実力を付けて来たと思うので、工作プログラミング(初級)をやってみようかな、と思います

[edit]

CM: 0
TB: 0

page top


h o m e |


 

2017-09