FC2ブログ

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

前回、32ビットカラーについて 詳しく解説したので、今回は V-RAM のアドレス等について詳しく書きます。
PSPの画面解像度は、横:480ピクセル×縦:272ピクセルですが、V-RAM構成横:512ピクセル×縦:272ピクセルとなっています。
中途半端な数値ですねwwwwww

でも、512(10進数)は 0x200(16進数)、272(10進数)は 0x110(16進数)なので、コンピュータにとっては都合の良い数値なのですよ。ふふふ(笑)。

で、実際に V-RAM は どういう構成か書くと、32ビットカラーモードの場合、画面左上(0,0)がV-RAM先頭で、順に右端へ+4(色のバイト数だけプラス)で座標(1,0)のV-RAMアドレスになり、1ラインは512x4(色のバイト数) = 2048バイトです、(0,1)は 先頭V-RAM に2048を足した値です、PSP の V-RAM は2メガ(2,228,224)バイトです(0x220000)、となります。

これを踏まえて、32ビットカラーモードでの、(X,Y)座標から V-RAMのアドレス(オフセット値)を求める計算式を書きます。

     こたえ = ( X + ( Y x 512 )) x 4
      展開して   Xx4 + Yx2048


Xはそのまま足して、Yは単純に512倍すれば良いのです。それらを色のバイト数(32ビットカラーは4バイト)分の数値だけ掛けてやれば良い、という事。
つまり、X を 4倍して、Y を 2048倍する。

が しかし、人間もコンピュータも、掛け算 割り算 は足し算 引き算の繰り返しで答えを求めている、という事実。文字の表示処理の度に、毎回 2048倍 などしていたら処理速度が遅くなります(2048回 足している、という罠)。

そこで、C言語 C++言語 にある シフト演算というのを使ってみます。

   書き方の例
        a=a<<n      b=b>>n

シフト演算というのは、値を 2進数で考えて上位方向(左)や下位方向(右)へ nビット ずらす(移動させる)、という演算です。
シフト演算は 演算を行なう変数のキャストにより、算術演算になったり論理演算になったりします。
下位(右)方向への算術シフト演算では符号ビットの値は複写されます。


よって、下位(右)方向への算術シフト演算の場合は、一番左(最上位ビット)が 1(マイナス)の場合は右に1ビット シフトすると、全部のビットが右に1ビットずれて 最上位ビットに 符号ビットである 1(マイナス)が複写されます。

例1:
int x = 0x80000000;
x=x>>1;

  x の値(実行結果)
   2進数:10000000 00000000 00000000 00000000 16進数:0x80000000
              ↓
       下位(右)方向に1ビット分シフト
              ↓
   2進数:11000000 00000000 00000000 00000000 16進数:0xC0000000

  ◆ x の値は 0xC0000000 になりました。

例2:
int x = 0xA0000000;
x=x>>1;

  x の値(実行結果)
   2進数:10100000 00000000 00000000 00000000 16進数:0xA0000000
              ↓
       下位(右)方向に1ビット分シフト
              ↓
   2進数:11010000 00000000 00000000 00000000 16進数:0xD0000000

  ◆ x の値は 0xd0000000 になりました。


一方、上位(左)方向へのシフト演算の場合は、符号ビットに関係なく、そのまま全部のビットがずれます。空いたビット(右側から順に、のビット)には0が入ります。符号の変化に気をつけて下さい。

例3:
int x = 0x80000000;
x=x<<1;

  x の値(実行結果)
   2進数:10000000 00000000 00000000 00000000 16進数:0x80000000
              ↓
       上位(左)方向に1ビット分シフト
              ↓
   2進数:00000000 00000000 00000000 00000000 16進数:0x00000000

  ◆ x の値は 0 になりました。これはオーバーフロー(桁あふれエラー)です。


アセンブラ言語では、左にシフトしてハミ出たビットが右から順に入る、という 輪っか みたいな概念の ローテート演算というのがありますが、シフト演算は 輪っかという概念が無く、ハミ出たらそれまで! 空いた部分は0 か符号ビットの複写を入れとけ! という演算です。

(シフト演算の演算結果同士を 論理和 でくっつけて、ローテート演算が実現できたりします)

算術シフトの場合、
上位方向(左)へ n ビットシフト演算すると、値が 2のn乗倍になります。
下位方向(右)へ n ビットシフト演算すると、値が 2のn乗分の1倍になります。

  例 1  6<<5
       6を5ビット分、左へ算術シフト演算

   (1ビット分、左へシフト)  6の 2倍 =  12
   (2ビット分、左へシフト)  6の 4倍 =  24
   (3ビット分、左へシフト)  6の 8倍 =  48
   (4ビット分、左へシフト)  6の16倍 =  96
   (5ビット分、左へシフト)  6の32倍 = 192
    答え   192

  例 2  4096>>7
       4096を7ビット分、右へ算術シフト演算

   (1ビット分、右へシフト)  4096の 2分の1 =  2048
   (2ビット分、右へシフト)  4096の 4分の1 =  1024
   (3ビット分、右へシフト)  4096の 8分の1 =  512
   (4ビット分、右へシフト)  4096の 16分の1 =  256
   (5ビット分、右へシフト)  4096の 32分の1 =  128
   (6ビット分、右へシフト)  4096の 64分の1 =  64
   (7ビット分、右へシフト)  4096の128分の1 =  32
    答え    32



そんな訳で、シフト演算を用いて、座標の計算を書くと、下記の様になります。

                 (X + ( Y x 512 )) x 4
               = ( X + ( Y<< 9 ))<<2
               = X<<2 + Y<<11

                 ↑↑ すっきりしました(笑)


PSP画面の V-RAMアドレス は、0x04000000 からで、オフセット値が 0x40000000 で、フレームサイズは 0x88000 バイト あるので、コレを考慮して V-RAMアドレス を求めると、

define FRAMESIZE 0x88000 //in byte
char *pg_vramtop=(char *)0x04000000;

pg_vramtop+(pg_drawframe?FRAMESIZE:0)+(x<<2)+(y<<11)+0x40000000


という計算でおっけーです。
途中の演算 pg_drawframe?FRAMESIZE:0 というのは、
pg_drawframeなら FRAMESIZE つまり、0x88000
pg_drawframeなら
という値を取得する式です。こういう使い方をするモノだと覚えておけば良いでしょう。



『画面を青く塗りつぶすプログラム』 実行画面
FILL_BLUE_sample00.png



『画面を青く塗りつぶすプログラムソース』の一部抜粋を見たい方は続きを読んで下さい。
画面を青く塗りつぶすプログラムのダウンロード
Fill_Blue.zip  123 KB (126,854 バイト)
DOWNLOAD
(ソースのコンパイルには、全角文字表示ライブラリが必要)
(ソースコード付き / CFW用の実行ファイル付き)


-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

さて、グラフィックの概念を勉強したので、画面に点を打ってみる事にします。ワーイ!

点を打つ、という処理は、(X,Y)座標から V-RAM アドレスを求めて、そのアドレスに long キャストのカラーコードを代入する事で、出来ます。

unsigned char *vptr0; // V-RAM へのポインター
vptr0 = pgGetVramAddr(x,y); // (x,y)座標から、V-RAMアドレスを取得(自作サブルーチン)
*(unsigned long *)vptr0 = 0xFFFFFF; // 白色でドット打ち

          ↑↑ こういう処理で、可能 wwwwwwwww

簡単なのでツマラナイかも知れませんね。
そこで、ドットを十字キーで動くようにしてみます。
1ドット単位で動かすと めっちゃ遅いので、可変ドット単位で移動できるようにしてみます。

      カタカタカタ…………(タイピング音)

ハイ、出来ました(続きを読むでソースの一部が読めます)。


『ドット打ち&ドット移動プログラムのサンプル』実行画面
MOVE_DOT.png

『ドット打ち&ドット移動プログラムのサンプル』のダウンロード
MOVE_DOT.zip  239 KB (244,915 バイト)
ダウンロード
(ソースのコンパイルには、全角文字表示ライブラリが必要)
(ソースコード / CFW用の実行ファイル)
ユーザーモード版EBOOT.PBPです。


-- 続きを読む --
関連記事

[edit]

CM: 1
TB: 0

page top

グラフィック画面に点が打てましたので、線を引いたり図形を描画しようかと考えたんですが、そういう作業は、グラフィック機能を見せつけるゲームとかでないとお目見えしない様です。
そいうのんは、PSPSDKの sceGuDrawArray( )関数 を使えば実現できます。GPUを使います。その件は各自で、勉強して下さい。

今回は、Windows標準のビットマップ画像をPSPで表示する、という事を勉強します。

まずは、Windows標準のビットマップ画像のファイル構造を調べてみましょう。
以下。


Windows bitmap - Wikipedia
ビットマップ画像 - Wikipedia
Bitmapファイルフォーマットの資料
-- BMP形式入門 - BMPファイルの中身をちょっと覗いてみる --


ビットマップ画像ファイルは、基本的には、先頭のヘッダー部分と、ビットマップ画像部分の定められたデータ長(1ピクセルあたりのビット数)で構成されており、表示されている画像の画素情報を 非圧縮で そのまま データにしている、という事実。
つまり、24ビットカラーのビットマップ画像の場合、画像データ本体を3バイトづつ(RGB)読んでV-RAM に貼り付ける事で、ビットマップ画像上の1ドットが打てる、という事です(ヘッダー部分は無視するものとします)。
(32ビットカラーのビットマップ画像の場合は4バイトづつ読み込み)

そうそう、PSPとWindowsでは、RGBとBGRの様に、V-RAMの構成が 赤と青の配置が逆ですので そこら辺 注意のこと。


では、完成したプログラムをどうぞ([ 続きを読む ] でプログラムの一部が見れます)。

今回の見どころ

・ファイル操作(BITMAPファイルのオープン、読み込み、クローズ)
・全角文字ライブラリへの機能追加(文字背景色を指定できる様になりました / 透明色も指定可能)


サンプル画像として、私の製作したシュワちゃんPSP壁紙を 24ビットカラーBITMAP画像に変換したのんを同梱しました。


『PSP画面に ビットマップ画像を描画するプログラム』実行画面
SS20090617A.png

↓↓ このBITMAP画像をPSP画面へ表示するッッ!!
SS20090617B.jpg


『PSP画面に ビットマップ画像を描画するプログラム』のダウンロード
DISP_BITMAP_src.zip  363 KB (371,749 バイト)
ダウンロード
(ソースのコンパイルには、全角文字表示ライブラリが必要)
(ソースコード / CFW用の実行ファイル)
ユーザーモード版EBOOT.PBPです。

PSP壁紙(480x272)を、24Bitカラー・ビットマップ画像に変換した画像
(~.BMP)を、このソフトで表示する事が可能でっす!
但し、ファイルは "ms0:/PICTURE/TEST.bmp" 限定。


-- 続きを読む --
関連記事

[edit]

CM: 2
TB: 0

page top

※※※※※  重要事項  ※※※※※

ある 神プログラマー様にご意見を伺ったところ、「シフト演算の部分に誤りがあるよん」と指摘されました。ついポカミスしそうなのでよーく考えてみました。で、修正しましたので気になる方は読み返して下さい。
ご指摘ありがとうなのです、神プログラマー様!!


神プログラマー様 に 頂いたURL ↓↓
http://ja.wikipedia.org/wiki/ビット演算
ココを見ると、ビット操作について詳しく書かれています。ナイスですっ!神プログラマー様 !!


私はまたもや ポカミス をしてしまったのです……………。
今度こそ、正しい事を書きます。


今回使った物 ↓↓
Minimalist PSPSDK v0.8.10 (PSPソフト開発キット / C++コンパイラ)

MAKEFILE のコンパイルオプション ↓↓
CFLAGS = -Wall -G0 -O2 -fomit-frame-pointer -mgp32 -mlong32


■■■■■ 右へシフト ■■■■■
main() // 論理シフト
{
unsigned int i; // 符号無し

i = 0xC0000000;
printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>1; // 下位(右)方向へ1ビット分シフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:C0000000 10進数:-1073741824
16進数:60000000 10進数:1610612736

解説
論理演算なので、最上位ビットには 0 が入る(基本パターン)
算術演算ではありません!!
2進数:11000000 00000000 00000000 00000000 b = 16進数:0xC00000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ1ビット分シフト
2進数:01100000 00000000 00000000 00000000 b = 16進数:0x600000000


main() // 算術シフト
{
int i; // 符号あり

i = 0xC0000000;
printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>1; // 2分の1倍
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:C00000000 10進数:-1073741824
16進数:E00000000 10進数:-536870912

解説
算術演算なので、最上位ビットには符号ビットがコピーされて入る(ちょっと考えさせられるパターン)
10進数で見ると、ちゃんと2分の1倍になっています
2進数:11000000 00000000 00000000 00000000 b = 16進数:0xC00000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   2分の1倍
2進数:11100000 00000000 00000000 00000000 b = 16進数:0xE00000000


main() // 論理シフト
{
unsigned int i; // 符号無し

i = 0xC0000000;

printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>2; // 下位(右)方向へ2ビット分シフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:C00000000 10進数:-1073741824
16進数:300000000 10進数:805306368

解説
論理演算なので、最上位ビットには 0 が入る(基本パターーン)
4分の1倍ではありません!(符号注意)
2進数:11000000 00000000 00000000 00000000 b = 16進数:0xC00000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ2ビット分シフト
2進数:00110000 00000000 00000000 00000000 b = 16進数:0x300000000


main() // 算術シフト
{
int i; // 符号あり

i = 0xC0000000;
printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>2; // 4分の1倍
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:C00000000 10進数:-1073741824
16進数:F00000000 10進数:-268435456

解説
算術演算なので、最上位ビットには符号ビットがコピーされて入る
ちゃんと4分の1倍になっています
2進数:11000000 00000000 00000000 00000000 b = 16進数:0xC00000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   4分の1倍
2進数:11110000 00000000 00000000 00000000 b = 16進数:0xF00000000


main() // 論理シフト
{
unsigned int i; // 符号無し

i = 0xFFFFFFFF;
printf("10進数:%d 16進数:%8X \n",i,i);
i=i>>31; // 下位(右)方向へ31ビットシフト
printf("10進数:%d 16進数:%8X \n",i,i);
}
実行結果
10進数:-1 16進数:FFFFFFFF
10進数:1  16進数:1

解説
31ビット分 シフトして、最上位ビット の 1 だけが残って移動し、値 = 1 になりました
2進数:11111111 11111111 11111111 11111111 b = 16進数:0xFFFFFFFF
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ31ビットシフト
2進数:00000000 00000000 00000000 00000001 b = 16進数:0x00000001


main() // 論理シフト
{
unsigned int i; // 符号無し

i = 0xFA8759E5;
printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>32; // 下位(右)方向へ32ビットシフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:FA8759E5 10進数:-91792923
16進数:FA8759E5 10進数:-91792923

解説
おや?変化がない??(値が変わってませんよ??)
2進数:11111010 10000111 01011001 11100101 b = 16進数:0xFA8759E5
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ32ビット分 シフト??
2進数:11111010 10000111 01011001 11100101 b = 16進数:0xFA8759E5


main() // 0 ビット右シフトはどうなるか?(実験1)
{
unsigned int i; // 符号無し

i = 0x4E5D7A05; // 適当な数値(何でも可能)
printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>0; // 下位(右)方向へ 0ビットシフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:4E5D7A05 10進数:1314748933
16進数:4E5D7A05 10進数:1314748933

解説
変化がありません(0 ビットシフトは、2の0乗倍なので1倍です。変化なしは当然)。
ビット移動してませんから、ね。
2進数:01001110 01011101 01111010 00000101 b = 16進数:0x4E5D7A05
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ 0ビットシフト
2進数:01001110 01011101 01111010 00000101 b = 16進数:0x4E5D7A05


main() // 0 ビット左シフトはどうなるか?(実験2)
{
unsigned int i; // 符号無し

i = 0x12345678; // 適当な数値(何でも可能)
printf("16進数:%8X 10進数:%d \n",i,i);
i=i<<0; // 上位(左)方向へ 0ビットシフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:12345678 10進数:305419896
16進数:12345678 10進数:305419896

解説
変化がありません(0 ビットシフトは、2の0乗倍なので1倍です。変化なしは当然)。
下位(右)方向へ 0ビットシフトと同じ結果でした。
2進数:00010010 00110100 01010110 01111000 b = 16進数:0x12345678
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   上位(左)方向へ 0ビットシフト
2進数:00010010 00110100 01010110 01111000 b = 16進数:0x12345678


main() // 32ビットを越えるビットシフト(実験)
{
unsigned int i; // 符号無し

i = 0xFFFFFFFF;
printf("10進数:%d 16進数:%8X \n",i,i);
i=i>>49; // 下位(右)方向へ49ビットシフト
printf("10進数:%d 16進数:%8X \n",i,i);
}
実行結果
10進数:-1  16進数:FFFFFFFF
10進数:32767 16進数:00007FFF

解説
17ビット分だけ下位(右)方向へシフトしているッ!!!!
ひょっとして、49 を 32 で割った余り = 17 ビット分だけ論理シフトしているのかな?
2進数:11111111 11111111 11111111 11111111 b = 16進数:0xFFFFFFFF
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(右)方向へ17ビット分だけシフト
2進数:00000000 00000000 01111111 11111111 b = 16進数:0x00007FFF


■■■■■ 左へシフト ■■■■■
main() // 算術演算 [正の数の場合]

int i = 123; // 正の値で 123

printf("10進数:%d 16進数:%8X \n",i,i);
i=i<<4; // 16倍
printf("10進数:%d 16進数:%8X \n",i,i);
}
実行結果
10進数: 123  16進数: 7B
10進数:1968  16進数: 7B0

解説
ちゃんと16倍されている
2進数:00000000 00000000 00000000 01111011 b = 16進数:0x00000007B
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   16倍
2進数:00000000 00000000 00000111 10110000 b = 16進数:0x0000007B0


main() // 算術演算 [負の数の場合]
{
int i = -10; // 負の値で -10

printf("10進数:%d 16進数:%8X \n",i,i);
i=i<<2; // 4倍
printf("10進数:%d 16進数:%8X \n",i,i);
}
実行結果
10進数:-10 16進数:FFFFFFF6
10進数:-40 16進数:FFFFFFD8

解説
ちゃんと4倍になっている
2進数:11111111 11111111 11111111 11110110 b = 16進数:0xFFFFFFF6
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   4倍
2進数:11111111 11111111 11111111 11011000 b = 16進数:0xFFFFFFD8


main() // 算術演算 [負の数の場合] 桁あふれ例1
{
int i = 0x90000000;

printf("10進数:%d 16進数:%8X \n",i,i);
i=i<<1; // 2倍
printf("10進数:%d 16進数:%8X \n",i,i);
}
実行結果
10進数:-1879048192 16進数:900000000
10進数:536870912  16進数:200000000

解説
これは、演算結果が 桁あふれ になった為。エラーです。
2進数:10010000 00000000 00000000 00000000 b = 16進数:0x90000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   2倍
2進数:00100000 00000000 00000000 00000000 b = 16進数:0x20000000


main() // 算術演算 [負の数の場合] 桁あふれ例2
{
int i = 0x80000000;

printf("16進数:%8X 10進数:%d \n",i,i);
i=i<<1; // 2倍
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:800000000 10進数:-2147483648
16進数:0  10進数:0

解説
これも、演算結果が 桁あふれ になった為。エラーです。
2進数:10000000 00000000 00000000 00000000 b = 16進数:0x80000000
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   2倍
2進数:00000000 00000000 00000000 00000000 b = 16進数:0x00000000


main() // 32ビットを越えるビットシフト(実験1)
{
unsigned int i = 0xFFFFFFFF;

printf("16進数:%8X 10進数:%d \n",i,i);
i=i<<50; // 上位(左)方向へ 50ビット分シフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:FFFFFFFF 10進数:-1
16進数:FFFC0000 10進数:-262144

解説
これも、50 を 32 で割った余り = 18 ビット分だけ シフトしています
2進数:11111111 11111111 11111111 11111111 b = 16進数:0xFFFFFFFF
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   上位(左)方向へ18ビット分だけシフト
2進数:11111111 11111100 00000000 00000000 b = 16進数:0xFFFC0000


main() // 負の数ビット分シフト(実験1)
{
unsigned int i = 0xFF39E421;

printf("16進数:%8X 10進数:%d \n",i,i);
i=i>>(-3); // 下位(右)方向へ、-3ビット分シフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:FF39E421 10進数:-12983263
16進数:F9CF2108 10進数:-103866104

解説
負の数ビット分のシフトは、逆方向への正の数ビット分のシフトになる様です
2進数:11111111 00111001 11100100 00100001 b = 16進数:0xFF39E421
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   上位(左)方向へ 3ビット分シフト
2進数:11111001 11001111 00100001 00001000 b = 16進数:0xF9CF2108


main() // 負の数ビット分シフト(実験2)
{
unsigned int i = 0xFA47D8B1;

printf("16進数:%8X 10進数:%d \n",i,i);
i=i<<(-8); // 上位(左)方向へ、-8ビット分シフト
printf("16進数:%8X 10進数:%d \n",i,i);
}
実行結果
16進数:FA47D8B1 10進数:-95954767
16進数:0FA47D8B 10進数:16402392

解説
負の数ビット分のシフトは、逆方向への正の数ビット分のシフトになる様です
2進数:11111010 01000111 11011000 10110001 b = 16進数:0xFA47D8B1
↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓   下位(左)方向へ 8ビット分シフト
2進数:00001111 10100100 01111101 10001011 b = 16進数:0x0FA47D8B


32ビット以上のシフト演算についての参考文献(神プログラマー様 から頂いたURL)
http://www.cpptalk.net/shifting-bits-shift-32-bits-on-32-bit-int-vt35538.html
抜粋すると、こう書いてあります。
> uint32_t x = 5;
> uint32_t y = x << 32;
> uint32_t z = x << 32;
> 
> In the above example y and z are both still 5. Why is this?

  翻訳 : シフト演算の結果、値が変化しないのは何故?

32ビット長の値(変数)を 32ビット左にシフトして 0 にしたかったんでしょうね、気持ちは解かります。
でも、そういう規則(?)はコンパイラーの設計側での問題なので、プログラマーにはコーディングで頑張るしかないですよ。
こまめにデバッグして調べるしか無いようですね。
コンパイラの変な動作を発見したら、原始的な方法で対処するとかした方が良いかもです。
それと、変テコなプログラムは書かないことが鉄則です!



念の為、もう一回 書いておきます 。
今回使った物 ↓↓
Minimalist PSPSDK v0.8.10 (Win32アプリ / PSPソフト開発キット)

MAKEFILE のコンパイルオプション ↓↓
CFLAGS = -Wall -G0 -O2 -fomit-frame-pointer -mgp32 -mlong32

ちょっと一言

今回、こういう結果になりましたが、他のC++コンパイラでも必ずしもこういう結果になるとは限りません。
更に、同じコンパイラでも、コンパイルオプションが違うと 微妙に異なる実行ファイル(EBOOT.PBPや****.prx)が出来上がるので要注意です。



◆◆◆◆◆  まとめ  ◆◆◆◆◆

・キャスト(型宣言)は正しく記述しましょう。

・シフト演算には、論理演算と算術演算があります。
・論理演算は、符号を無視します。nビットシフト。
・算術演算は、符号を有視します。上位(左)方向へは2のn乗倍。下位(左)方向へは2のn乗分の1倍。
・論理演算か、算術演算かは、指定した 変数のキャストを見れば解かります。

・PSPSDKでの ビットシフト演算の処理は、どうやらシフトするビット数を 32 で割った余りの値だけシフトするっぽいです(多分)。
・32ビット分シフトの場合は、0ビット分シフトという事で変化がありません(PSPSDKで検証)。

・負の数ビット(-n)分のシフトは、逆方向への正の数ビット(n) 分のシフトになる様です
 (例1) num>>(-5) は num<<5 の様に処理される
 (例2) num<<(-7) は num>>7 の様に処理される

値は 32ビット長なので、桁あふれする場合があります。警告!!
 が、しかし、桁あふれしても、PSPはエラーだと気付かないのです。
 桁あふれしたらエラー処理をする、というプログラムにての値チェックをするしか無いようです。

 (シフト演算に桁あふれエラー処理を記述するって、聞いた事ありませんが………)


■■■ コンパイル中のメッセージは良く見て下さい ■■■
32ビットを越えるシフト演算を記述したプログラムソースをコンパイルすると、
warning: left shift count >= width of type
warning: right shift count >= width of type
↑↑のような ウォーニング(警告) が表示されます。

負の数ビット分のシフト演算を記述したプログラムソースをコンパイルすると、
warning: left shift count is negative
↑↑のような ウォーニング(警告)が表示されます。

WARNING は、警告でありまして、エラーではありません。その証拠に、コンパイルが継続します。
神プログラマー様によると、"WARNING"は正しくは ウォーニング と発音するのだそうです。

うーーん、勉強になりました。サンキューですぞ。ウホ。

関連記事

[edit]

CM: 2
TB: 0

page top

PSPプログラミング講座です。

さて、次に行く前に、ちょっと脱線しますよ。

mediumgauge氏 製作 の 『全角文字表示ライブラリ』が、何故 こんなに たくさんの文字群を描画できるかについての謎を紐解くために、
ここに パソコンの日本語文字 & コード 一覧表(ASCII & SHIFT-JIS) [Windows版] というテキストファイルを配布します。

日本語文字 & コード 一覧表 [Windows版]
83.2 KB (85,206 バイト)
ALL_MOJI_[JPN].zip
ダウンロード

PASS:窓辺ななみ


特別付録として、WindowsXP の 文字のスクリーンショット(一部抜粋)が収録されています。

各自ダウンロードしてから解凍して閲覧してチョ。

印刷する場合は、不要部分をデリートしてからで お願いしますよ。

ブログをお持ちの方で、『所有の端末にて このテキストを表示させてみると、面白い文字が表示されたっ』とかありましたら、ブログの記事にしてみて下さい。

今の狙い目は、PSPファイラーです。どこかに絵文字が隠れています。
発見したら、あなたのブログの記事にして下さい(スクリーンショット写真も添えてねん)。

添え忘れましたが、このテキストは PDS(著作権放棄のフリーウェア)です。転載、改変、削除、再配布許可。


このテキストは、『Windowsパソコン & Turbo C++コンパイラ』 にて作成しました。


【 関連記事 】
PSPプログラミング 全角文字表示ライブラリをダウンロード
PSPプログラミング [ 番外編 ] 日本語の文字 一覧表(ASCII & SHIFT-JIS) 完全版
PSPプログラミング 東雲フォント文字を全部表示しちゃうプログラム
PSPプログラミング 東雲フォントのデータ構造を調べました
PSPプログラミング 全角文字表示ライブラリ公開停止中のお知らせ
PSPプログラミング 『東雲フォント』が動画になった

関連記事

[edit]

CM: 0
TB: 0

page top

全角文字表示ライブラリの解析。

ビットマップ描画の解説の前にやっておくべき事でした。ごめんなさい。

  ( プログラムの一部を見たい人の為に、「続きを読む」 に追加しました 。 7/14 )

まず、東雲フォント(しののめふぉんと)の文字を全部表示するプログラムの公開から始めます。
実行してみて、絵文字が存在する事を確認しました。ナイス!

図1  絵文字 その1 は、コード : 0xF89F to 0xF8FC にかけて存在。
絵文字 その1

図2  絵文字 その2 は、コード : 0xF940 to 0xF97E と、コード : 0xF980 to 0xF9FC にかけて存在。
絵文字 その2

図3  EU文字 なども存在します。
EU文字とか。


こういう絵文字などを表示させたい場合は、下記のように記述すると可能です。

例:自動車(コード=0xF8C0)、おにぎり(コード=0xF9EE)

       mh_print( x, y, "\xF8\xC0 \xF9\xEE", colo1, col2);

「自動車」の絵文字のコードは、0xF8C0 なので、"\xF8\xC0"が本体。
「おにぎり」の絵文字のコードは、0xF9EE なので、"\xF9\xEE"が本体。




『東雲フォント文字を全部表示しちゃうプログラム』のダウンロード
ALL_Shinonome_Moji.zip  309 KB (316,475 バイト)
ダウンロード
ソース付き / 実行ファイル付き / PSP-1000&PSP-2000対応)
(ソースのコンパイルには、全角文字表示ライブラリが必要)
ユーザーモードのEBOOT.PBPです
暗号化はしてないので、正規PSPでは実行不可能!(ぐは


今回のプログラムは手抜き作成です、ごめんなさい。

プログラムの一部を見たい人の為に、「続きを読む」 に追加しました。


【 関連記事 】
PSPプログラミング 全角文字表示ライブラリをダウンロード
PSPプログラミング [ 番外編 ] 日本語の文字 一覧表(ASCII & SHIFT-JIS) 完全版
PSPプログラミング 東雲フォント文字を全部表示しちゃうプログラム
PSPプログラミング 東雲フォントのデータ構造を調べました
PSPプログラミング 全角文字表示ライブラリ公開停止中のお知らせ
PSPプログラミング 『東雲フォント』が動画になった

-- 続きを読む --
関連記事

[edit]

CM: 8
TB: 0

page top

全角文字表示ライブラリの解析。

大雑把ですが、解析してみました。

この記事は、知らなくても良い事を記述していますので、深く考えて混乱しないようにお願いします。
mh_print( );関数で 文字が書ける、という事だけ知っていればおっけーです。



東雲フォントのデータ構造は 至って単純で、文字の形があれば「1」、文字の形が無ければ「0」、という点の情報の連続で、この「1」と「0」を並べると、モノクロのビットマップの図形でした。

つまり、東雲フォントのデータ = 2色ビットマップ。

サイズは、
半角文字=ヨコ:6ピクセル×高さ:12ピクセル
全角文字=(左側半分)ヨコ:6ピクセル×高さ:12ピクセル、(右側半分)ヨコ:6ピクセル×高さ:12ピクセル

でした。

これを図におこすと、このようになります。


SHINONOME_SHARP.png

SHINONOME_NEKO.png

ここで、mediumgauge氏 製作の 全角文字表示ライブラリから「shinonomefont.c」というファイル(C言語のソース)を開いて見て頂きたいです。

まず、5行目。ここは、半角文字で「#」のデータが格納されています。16進数ですね。何でしょう?機械語でしょうか? 謎の9バイト・データ。

いえいえ、これは、文字のビットマップデータ:( )なのです。

ひも解く手段として、まず、2進数に置き換えます。

16進数 0x01,0x45,0x3E,0x51,0x45,0x3E,0x51,0x40,0x00
     ↓↓↓↓↓↓↓↓↓↓↓↓
2進数 0000 0001 0100 0101 0011 1110 0101 0001 0100 0101 0011 1110 0101 0001 0100 0000 0000 0000

んー、ますます解かりませんね(汗)。
でも、この2進数データを分解して 6ビットづつ並べると・・・。

2進数 000000 010100 010100 111110 010100 010100 010100 111110 010100 000000 000000 000000

↑↑ これですよ、これ。この2進数は、上の図の左側の数値列と同じですね。
この数値列の「1」を青色に、「0」を白色で、塗りつぶすと上の図の「#」の左側の絵になります。

解かりましたね。(^o^)ノ
「#」を構成する点の情報(ビットマップ)が、左から右へ、上から下へ、の順番に並んでいます。
この9バイト・データは、ヨコ:6ピクセル×高さ:12ピクセル=72ピクセル=9バイト・データ長だったのです。謎は解けたっっ(笑)。
これで、「#」についての解析は おしまいです。

次に、全角文字の場合。( )=シフトJISコードで 0x944C なので、3438行目を見て下さい。

>3438行目:/*944C*/0x95,0x72,0x59,0xAC,0xA3,0x9B,0xA8,0xA2,0xF0,
0x13,0xE2,0x08,0xF9,0x24,0xBE,0x49,0x2F,0x80,

まず、9バイト単位に分割します。
何故かと言うと、mh_print( ); という関数は、全角文字を書く作業の実態は、左側 ヨコ:6ピクセル×高さ:12ピクセル を書いてから、右側 ヨコ:6ピクセル×高さ:12ピクセル を書いている、という事実だからです。

だから、データも、
前半の9バイト=ヨコ:6ピクセル×高さ:12ピクセル → 全角文字の、左側半分
前半の9バイト=ヨコ:6ピクセル×高さ:12ピクセル → 全角文字の、右側半分
のように分割されている、という事なのです。

ゆえに、この18バイト・データを2進数に変換すると・・・。

前半:2進数 1001 0101 0111 0010 0101 1001 1010 1100 0101 0011 1001 1011 1010 1000 1010 0010 1111 0000
後半:2進数 0001 0011 1110 0010 0000 1000 1111 1001 0010 0100 1011 1110 0100 1001 0010 1111 1000 0000

これらも、モノクロのビットマップ画像なので、6ピクセル単位に区切って並べると・・・
前半:2進数 100101 010111 001001 011001 101011 000101 001110 011011 101010 001010 001011 110000
後半:2進数 000100 111110 001000 001000 111110 010010 010010 111110 010010 010010 111110 000000

これは、「猫」の図の右側の数値列と同一ですね、ねっ。
縦長で見づらいですね、ごめんなさい。

「猫」を構成する点の情報(ビットマップ)が、左右6ピクセルづつに分割されて、左から右へ、上から下へ、の順番に並んでいます。
この18バイト・データは、左側半分 ヨコ:6ピクセル×高さ:12ピクセル、右側半分 ヨコ:6ピクセル×高さ:12ピクセル=144ピクセル=18バイト・データ長だったのです。



で、文字データってナニ?という方の為に、解説します。
簡単に言うと、文字群の情報を、少ない情報量で分かりやすく表現したデータです。
つまり、半角文字は1バイトで、全角文字は2バイト、と、簡単に分類できます。
(ただし、2バイト長の半角文字もあったようですが、Windowsには2バイト半角文字は存在せず)

詳しく知りたい方は、「文字コード(完全版)」の一覧表をダウンロードして 解凍して 見てください。

それには、文字一覧表の左側に 2桁 or 4桁 の16進数が記載されていますね?
それは、該当の文字が 1バイト、もしくは2バイト、で表現できるデータである、という事を表し、ACIIコード(アスキーコード)や、シフトJISコード(シフトジスコード)等の文字一覧表として表現されます。

その一覧表を見ると、半角文字で「A」は 0x41(16進数) というアスキーコード番号である事が分かるかと存じます。同様に、全角文字で「亜」は 0x889F(16進数) というシフトJISコード番号である事が分かるハズ。

更に、バイナリエディター(テキストエディターに対抗して、文字以外の16進数データも全て扱える数値エディター)で、テキスト文書(拡張子.TXT)を覗いてみると、半角文字=1バイト長、全角文字=2バイト長、で延々と書き連ねられている、という事が分かるかと存じます。

昔のパソコンでは、テキストV-RAMというメモリが存在して、そのテキストV-RAMに、例えば1バイトの 0x42(16進数) というデータを書き込めば、画面に「B」という半角文字が表示されました。
昔のパソコンでは、文字のフォントは、ROMで用意されていましたので、フォントの事を気にせずに文字をバンバン書き込めたのです。しかも、1文字が1バイト。
その1バイトの情報が、ASCIIコード であり、テキストデータの原理(?)であったのです。
同様に、全角文字は、2バイトの情報で、シフトJISコードが一般的でした。

これ以上、つまらないハナシをしても無駄なので要約すると、文字は、1バイト長、もしくは2バイト長、のデータとして扱える、という事を覚えておいて下さい。


全角文字表示ライブラリは、東雲フォントの文字を描画する事が目的です。

している事は、簡単に解説しますと、文字のコード番号を読み取って、その文字に対応するフォントデータのアドレス(番地)を割り出して、フォントのビットマップ情報に従って、指定された色で 点を打ったり点を打たなかったりして1文字ずつ文字を描画しています。

Windows や PSP にはテキストV-RAM が存在しないので、グラフィック画面に絵を描く原理で文字を描画しないと、文字が書けない、という事実も覚えておいて下さい。
その為の、全角文字表示ライブラリなのです。解かりましたか?

それでは、これで、東雲フォントのデータ解析についての講釈を終わります。

上にも書きましたが、もう一回書いておきます。
この記事の内容は、知らなくても良い事なので深く考えて混乱しないようにお願いします。
mh_print( );関数で 文字が書ける、という事だけ分かってもらえればおっけーです。



さあ、つぎに行こう!今回はダウンロード物は ありません。


【 関連記事 】
PSPプログラミング 全角文字表示ライブラリをダウンロード
PSPプログラミング [ 番外編 ] 日本語の文字 一覧表(ASCII & SHIFT-JIS) 完全版
PSPプログラミング 東雲フォント文字を全部表示しちゃうプログラム
PSPプログラミング 東雲フォントのデータ構造を調べました
PSPプログラミング 全角文字表示ライブラリ公開停止中のお知らせ
PSPプログラミング 『東雲フォント』が動画になった

関連記事

[edit]

CM: 2
TB: 0

page top

PSPプログラミング AA(アスキーアート)を考察 

2009/07/15
Wed. 08:14

【アスキーアート】
                            やつを追う前に言っておくッ!
                    おれは今やつのスタンドをほんのちょっぴりだが体験した
                  い…いや…体験したというよりはまったく理解を超えていたのだが……
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれは奴の前で階段を登っていたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにか降りていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -―一ァ‐゙T´ '"´ /::::/-‐  \    催眠術だとか超スピードだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…

【 イラスト 】
Porunaref.png

いきなり何ですか?あなた2ちゃんねらーですか?と突っ込まれるような、有名なAA(アスキーアート)を貼り付けてみました。

全角文字表示ライブラリは、半角文字=よこ:6ピクセル×高さ:12ピクセル、全角文字=よこ:12ピクセル×高さ:12ピクセル、
の構成で、等倍フォントなので、AA作成には不向きです。

しかし、等倍フォントでもAAは出来るのです。
以下。



      Жж
       |
       |<)゜] ョ)))))))))))))) ))))))) 彡
       |
       |
       |<)゜] ョ))))))))) )))) ミ
       |
       |
       |< ))] ミミミミミミ 丶        彡彡
       |            ゞミ彡彡彡彡彡
       |
       | ____
  __   |/    \_
     \/|       \
      \|        \        ===============○
       |         \      ∠∠∠∠∠∠∠∠∠∠∠∠∠∠∠/ \\
       |                ∠∠∠∠∠∠∠∠∠∠∠∠∠∠∠/   \\
       |              ∠∠∠∠∠∠∠∠∠∠∠∠∠∠∠/     |\
       |               |             |      |



お題を付けるなら、『鯉のぼりのある風景』でしょうか。

全角文字表示ライブラリでは、こういう文字のアートが可能なのです。
更に、文字の描画位置は、よこ:6ピクセル単位、高さ:12ピクセル単位、でなくて、PSP画面(0,0)-(479,271) の範囲で自由に文字を描画できますから、固定文字枠ではない、という事です。
1ピクセル単位での描画座標の位置指定が可能なので、文字を重ねての描画も出来る。

↓↓ こんな描画が可能
DODODO.png
どうです?吹きましたか? 名付けて、「デスクトップ ドドド!」ジョジョネタ分かる人、限定。

ソースは書かなくても、想像できるっしょ。(^^;;;;;;;
次は、この「デスクトップ ドドド!」プログラムを作ってみる事にします。

関連記事

[edit]

CM: 0
TB: 0

page top

2012 06-10 新アップローダーに引越しました。
7/17(金) [ 続きを読む ] に、ソースコード(一部抜粋)を追加しました。
7/18(土) 今まで、プログラムの流れが下から上、という解かり難いモノだったので、上から下へ変更しました。


さて、役に立たないゲームプログラミング初作品として、ここに『 PSPデスクトップ ドドド v0.1』 お試し版をリリースしますwwwww

うん、役に立たないソフトウェアなんだ。ジョジョウェアですが?

まずは実行画面のスクリーンショットからどうぞ。
DoDoDo_v01_SS.png

なにが起こっているか説明すると、PSP画面(デスクトップ)に、めちゃくちゃに『ド』が書き込まれる、というシロモノ。だって、ジョジョウェアだし。(^^;;;;


遊び方
1.PSP Desktop DoDoDo v0.1 のゲームアイコンを起動させます。
2.すると、画面が深緑色に塗りつぶされ、「ド」が うごめきまわります。
3.×ボタンを押すと、画面が深緑色に塗りつぶされます(リフレッシュ)。
4.終了したい場合は、Rトリガー押しで一発終了できます。
5.HOMEボタンからでも終了できます。


その他については、付属テキスト(!!_読んでね.txt)を参照してください。

このソフトウェアは、近日中にヴァージョンアップ予定です。
 ・ ジョジョのPSP壁紙が付きますwwww
 ・ 「ド」が更に ジョジョ風になります。




ソースの解説は、以下の記事で行なっています。
PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 ソース解説



『 PSPデスクトップ ドドド v0.1』 お試し版 のダウンロード
DoDoDo_v01.zip  270 KB (277,382 バイト)
ダウンロード
ソース付き / 実行ファイル付き
(ソースのコンパイルには、全角文字表示ライブラリが必要)
PSP-1000&PSP-2000&PSP-3000[HEN必須] 対応
ユーザーモードのEBOOT.PBPです。
正規PSPでは Half-Byte Loader で実行可能!




( 全角文字表示ライブラリを、勝手に改造中………。 )
   今後、XVIprint関数が %s とか %d とか %X とかにも対応するかも(^^;;;

【 関数名を大きく変更しました 】
  → DXライブラリPortable との共存が可能です!

【 背景色設定用の関数を新しく用意しました 】
  → XVISetTextBGcolor( ); という関数で、文字の背景色を指定可能。
  → mh_print( )関数のパラメータの数は、標準のモノと同じです。

【 mh_print関数の機能を拡張したので関数名を変更しました 】
  → XVIprint( ); と改名しました。
  → 文字の色のキャストを、int へ戻しました。
  → 垂直同期待ち処理の際の、フレーム設定のバグを修正しました。


【 関連記事 】
PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 リリース
PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 ソース解説
今、つくりかけのん………PSPデスクトップ ドドド 改
PSP Homebrew : 『PSPデスクトップ ドドド 改』 何気にリリース

-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

ハイ、 『 PSPデスクトップ ドドド v0.1』 お試し版 の プログラムの解説です。

ソース&実行ファイルは、以下にあるので欲しい人はダウンロードしてチョ。
>> PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 リリース


処理の流れを簡単に述べますと、画面を深緑色に塗りつぶしてから、「ドドド」を書きまくっているのです。

では、詳しく解説します。

> //  関数の宣言をする
> int main(int argc,char *argv[]); // メイン
> void disp_DoDoDo(void); // ドドドのサブルーチン
> void Draw_Do(void); // 「ド」を書くサブルーチン
> int _rand(void); // 乱数生成サブルーチン

   ↑↑↑↑↑
この部分ですが、今まで記述しなかったのです。
CやC++では、使用する関数は、宣言をしてから書くのですが、使用している関数(サブルーチン)を、使われる逆順に ソースに記述してゆくと、関数の宣言をしなくても良い(省略できる)ので、今まで書かなかったのです。
今まで読みにくいプログラムを書いていてゴメンナサイ………。

//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//■ メイン
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

int main(int argc,char *argv[])
{
   XVISetHOMEbutton();
// [HOME]ボタンのコールバック , [HOME]ボタンで終了可能
この関数の本体は、XVIpg.c に記述しています(見やすいように配慮)。
以降、【 [ HOME ] ボタンで終了を可能にする処理 】は、この関数で設定する事にします。

   XVIScrnInit(); // Gu初期化
この関数の本体も、XVIpg.c に記述してあります。
内容は、画面の初期化と 32ビットカラーモード に設定している、など、です。

   XVIScreenFrame(1,0); // 表示画面と描画画面を同じにする , XVIpg.c にあります
                 // 今回は、画面フレームは一つのみ、です
表示されている画面に落書きをするので、描画するフレームと表示するフレームを同じ(1枚のみ)にしています。

   disp_DoDoDo(); // PSP画面に「ドドド」描画 / 抜けるにはRトリガー押し
この関数を呼び出すと、Rトリガーが押されるまで、画面上に「ドドド」が落書きされ続けます(笑)。

   return 0; // この return命令 は実行されませんが、念の為に記述してあります。
}
何故 記述しているかというと、main の返り値を、int キャスト にしている為です。
int なので return 1 とか何か値を返す記述をしないと、コンパイル時に WARNING(警告) か、エラーのドッチか が出ます


/*****************************************************************************
* サブルーチン ドドドを書く&Rトリガー判定
*****************************************************************************/

void disp_DoDoDo(void)
{

   (略)
       Draw_Do();    //  'ド'を一文字 描画
この関数にて、ようやく一文字の「ド」が描画されます。

        XVIWaitVn(6);   // 6/60秒 = 0.1秒ほど 待ちます
PSPの画面に色々書いて速攻で表示させるプログラムを作ると、画面がチラつきますね?
チラつく理由は、画面表示のタイミングがとれていないからです。

テレビやパソコンの画面やPSPの液晶画面は、1/60秒ごとに1回、更新されます。その際、垂直同期信号という信号が発生します。
垂直同期信号というのを待つとタイミングがとれますので、垂直同期信号を待ってから画面を切り替えるとチラつかずに画面が切り替わります。

更に、垂直同期信号を一回待つと、1/60秒待たされるので、ここでは6回待って 6/60秒 = 0.1秒の待ちをしています。

       XVIreadpad(); // ← パッド状態取得 , XVIpg.c にあります
この関数は、NesterJ のソースから拝借しました。けっこう使えますよ。

     if((now_pad & PSP_CTRL_CROSS) != 0) // もし×ボタンが押されたら
        XVIFillvram(DARKGREEN);    // 深緑色でPSP画面を塗りつぶし
この条件文は、マスターして下さい。各種ボタンの値は、mydef.h に書いておいたような?

   do
   {
       XVIreadpad();
   }while((now_pad & PSP_CTRL_RTRIGGER) == 0);
// Rトリガーが押されるまでループ
こういうループも覚えておくと便利ですよ。

   XVIFillvram(BLACK);  // 黒色でPSP画面を塗りつぶし
   XVIScreenFlipV();    // PSP画面表示
}
この辺はテキトーに(笑)。

/*****************************************************************************
* サブルーチン 「ド」を描く
*****************************************************************************/

void Draw_Do(void)
{
   int x,y,color_Do;
 // 使用する変数の定義

   color_Do = ((int)(_rand() % 256)<<16)|((int)(rand() % 256)<<8)|((int)(rand() % 256));
「ド」を書く文字の色を、乱数を使って設定しています。乱数については 下の方 参照の事。
乱数を256で割った余り(8ビット長)を R、G、B の値にして、24ビットカラーに変換して設定しています。

   color_Do &= 0xFFFFFF;
念の為に、シモ 24ビットカラー の値にしています(32ビット値の 上位8ビットをカット)

   x=(int)(_rand()%453)+20; //  この数値は適当につけました。今後変更の予定
   y=(int)(_rand()%235)+20; // この数値は適当につけました。今後変更の予定
「ド」を描画する位置をランダムにする為に、乱数を使います。座標(x,y)

   if(x<5) x=10;   // この辺は
   if(x>460) x=450; // 念の為に
   if(y<12)  y=18;  // 記述して
   if(y>250) y=240; // いるのさっ
画面からの はみ出しチェック(笑)。

   XVISetTextBGcolor(COLOR_TOUMEI);  // 文字の背景色を透明にします
初登場関数。全角文字表示ライブラリに追加した関数です。描画する文字の背景の色を設定する関数です。以前は、mh_print( ); の色2パラメータで指定していましたね。

   XVIprint( x ,y ,"┣",color_Do);    // ドの ト 部分
   XVIprint( x+8,y-6,"‥",color_Do);  // ドの 点々部分
}
「ド」を構成する文字。合わせる調整がめんどかったwwww

/*****************************************************************************
* サブルーチン 乱数生成
*****************************************************************************/

int _rand(void)
// ここで新しく、乱数を使います。乱数とは予想できない不規則な数値の事。
// でたらめな数値が欲しい時に使用します。
// _rand()を呼び出すたびに、色んな数値を返してきます。
{
この関数は、PSPにて乱数を生成する為のアルゴリズムを採用しています。
PSPSDK にある乱数 rand( ); は、float キャストでして、intキャストに変換出来なかったようなので、記述して使用しています。

   int xf; // 乱数更新用の変数
   rnd_seed+=xf+sceKernelLibcTime((void *) 0);
どうやら、PSPの時刻を参照して、乱数をいじるようだ。

   xf = rnd_seed / 45309;  // ← この数値が乱数生成に重要な役割です(テキトーな値だが)
割り算ですね。この【 割る値 】によって、ナイスな乱数になったり、チョンボな乱数になったりします。

   return xf;
}

はい、返り値は 32ビット長の乱数 です!



何か質問とかありましたら、カキコするがよろし。

つ……、疲れた…………。

ソース&実行ファイルは、以下にあるので欲しい人はダウンロードしてチョ。
>> PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 リリース


【 関連記事 】
PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 リリース
PSPプログラミング 『 PSPデスクトップ ドドド v0.1』 お試し版 ソース解説
今、つくりかけのん………PSPデスクトップ ドドド 改
PSP Homebrew : 『PSPデスクトップ ドドド 改』 何気にリリース

関連記事

[edit]

CM: 0
TB: 0

page top

今回は、便利なテキストエディターを ご紹介します。


PSP Homebrew開発をしていて、

      「あっ、エラー発生? 詳細は…??」

なんて時に、エラーメッセージがコンソール出力なので、テキストエディターを開いて 書き写してからブラウザで意味を検索…なんてしておられる方もいらっしゃるかと存じます。

そういう時に便利なのが、IDE などと言われる 「統合開発環境」 です(ちょっと意味が違うけど)。

PSPソフトの開発には、 【 外部コマンド実行機能付きでコンソール出力メッセージを取り込めるテキストエディター 】 で十分なので、今回はソレに合ったソフトウェアをご紹介。



Apsaly(無料ソフトウェア)
軽快な高多機能の本格的汎用テキストエディタ( 2007年 窓の杜大賞 編集部賞)

ダウンロード
 apsaly300.zip ( Filesize: 1,926,551Bytes )
  http://www.vector.co.jp/soft/win95/writing/se423509.html

インストール方法
1.インストール先にフォルダを作って解凍します。
2.Apsaly.exe をダブルクリックで起動して、[ 設定 ] → [ 環境設定 ]をクリックします。
3.「設定対象(Q):」の下の[+外部インターフェイス]をダブルクリックして、「ショートカットの登録/削除」のチェックボックス部分にチェックマークを入れます。
4.[ 登録更新(U) ]ボタンを押すと反映されます。
5.作ったショートカットの名前を「PSPかいはつ」とか(覚えやすい名前)にすると おけ。
   ショートカット

  拡張子の関連付け以外には、レジストリは使っていません、との事。

使い方
1.ショートカットをダブルクリックで起動します。
2.[ ファイル ] → [ 開く ] で、ソースの在り処へ移動してからソ-スを開きます。
3.編集後、上書きして保存。
 (細かい事については README.TXTを読みましょう)

ビルドとは?
EBOOT.PBP を作成する事を、「ビルドする」、と呼ぶらしいです。
コンパイルとは、オブジェクトファイルを作成する作業です。
リンクとは、オブジェクトファイルを結合して、EBOOT.PBP を作成する作業です。

ですから、コンパイルからリンクまで通して作業させる事を、ビルドと言いましょう。

ビルド方法
Apsaly の [ ツール ] → [ 外部プログラムの実行 ] をクリックします。
↓↓ こんな風に設定して下さい。

[実行コマンド]には、make.exe を起動するためのバッチファイルを指定します。
ここでは、!__ビルド.bat というファイルです。

設定し終えたら、[ 実行 ] ボタンを押してください。ビルドが始まります。

今まではコンソール出力の画面でしたが、Apsaly が(標準出力)というタブを作り、そこへ内容が出力されます。
↓↓ こんな風に (クリック拡大して見てください)。
ビルドとメッセージ


ビルドまで試して下さい。
便利でしょ?今まで書き写していたエラーメッセージが、コピペ可能になりました。

再度ビルドする作業は、 [ ツール ] → [ 外部プログラムの実行 ] → [ 実行 ] で出来ます。ラクチンです♪

こういう機能があって、フリーウェアな Apsaly は、是非お勧めしたいソフトウェアです。
是非、導入してみて下さい。


このテキストエディターは、Windows用 Borland C++ Compiler などにも利用可能です。

関連記事

[edit]

CM: 0
TB: 0

page top

PSP の Hack本 

2009/08/04
Tue. 17:23

古い本ですが、PSP についての解析をしているので、ご紹介。
PSPをハックしたい人向けの教科書らしいのですが・・・・・・。

誰か、買ってみますか?


PSP Hacks, Mods, and ExpansionsPSP Hacks, Mods, and Expansions
(2005/12/08)
Dave Prochnow

商品詳細を見る



Hacking the PSP: Cool Hacks, Mods, and Customizations for the Sony Playstation Portable (ExtremeTech)Hacking the PSP: Cool Hacks, Mods, and Customizations for the Sony Playstation Portable (ExtremeTech)
(2006/01/11)
Auri Rahimzadeh

商品詳細を見る


PSP HacksPSP Hacks
(2006/03/25)
C. K. Sample

商品詳細を見る


Hacking the PSP: Cool Hacks, Mods, and Customizations for the SonyPlayStationPortable (ExtremeTech)Hacking the PSP: Cool Hacks, Mods, and Customizations for the SonyPlayStationPortable (ExtremeTech)
(2006/10/30)
Auri Rahimzadeh

商品詳細を見る


関連記事

[edit]

CM: 0
TB: 0

page top

PSPプログラミング 家庭用ゲーム機の誕生秘話 

2009/08/14
Fri. 11:30

今回から しばらく、お勉強です。

テレビ画面に表示される画素の最小単位の「点」を専門用語で「ドット」や「ピクセル」と呼びます。両者は、ほぼ同じ意味を持ちます。

テレビで使われる信号は、日本のテレビ放送の場合 NTSCと呼ばれる信号方式が使われています。
テレビ画面の横方向に関する解像度は、NTSC信号が利用できる周波数帯域によって変化します。NTSCでは、テレビ電波という狭い帯域に収める必要があるため、水平解像度は336本程度になります。
テレビ画面の縦方向に関する解像度は、NTSC方式のテレビでは486ライン、すなわち縦方向に表示できるドット数は486ドットと決まっています(但し、インターレースです)。

テレビ画面は、『1/60秒単位』 で描画(更新)され続けます。
パソコンの画面も PSPの画面も 同じです。


パソコンの画面表示には、一番左上から順に、左→右の1ラインを描画し、1ドット下げて、左→右の1ラインを描画し、1ドット下げて…の繰り返しで 一番下まで描画する、「ノンインターレース」という方式が採用されています。

一方、テレビの画面表示には、1つの画面を「偶数ラインだけ描画」と「奇数ラインだけ描画」の画面に分け、1ラインごとに飛び飛びで表示する「インターレース」という方式が採用されています。


で、実際に、テレビ画面に表示可能な解像度というのは450×350ドット程度らしいです。
では何故、テレビが綺麗に見えるかというと、表現可能な色解像度が高いからです。
昔のパソコンのモニター(画面)は、単色(緑+黒 や、白+黒)から始まりました。

それが、純8色になり、4096色中 16色になり、中略で、現在の 1677万 7216色 同時発色 に至ります。デジタルテレビでは、更に上に いっているようですね。

画面に表示できる縦横のドットの数(画面解像度)が荒くても(低くても)、色解像度が高いと、点の荒さが誤魔化せると聞きます。
例を挙げるなら、『画面解像度640×480ピクセルで、色解像度4096色中16色の画面』 VS 『画面解像度320×240ピクセルで、色解像度65536色同時発色の画面』を比べてみると、後者の画面の方が綺麗だと感じるのです(過去に行われた調査報告書参照)。

PSPの画面は、メーカーが頑張ってくれた お陰で、画面解像度480×272ピクセルで 1677万 7216色 同時発色、という素晴らしいモノになっています。
ちょっと小画面のモニタは 26万色 同時発色ですし、現在のパソコンは 1677万 7216色 同時発色という部分はPSPと同じですので、メーカーの気合度が伝わってきますね。

話を戻しますが、昔の家庭用ゲーム機は、家庭用テレビに、RF出力やビデオ出力の映像を映し出す事が前提だったので、ファミコンの場合では、画面解像度は 横:256×縦:240(実質224)ピクセルで、64色同時発色でした(理論値であり、有効な色については52色だとか)。
色については、家庭用テレビにRF出力できた結果を調べて厳選して決め、色数は、CPU(6502MPU)で扱える、区切りの良い16進数値、という事らしいです。それ以上の色数は、にじんで区別がつかないという調査結果。

今では、ビデオ端子やSビデオ端子やD端子などがありますが、ファミコン全盛時はテレビアンテナのVHF部分(RF端子)にお邪魔してファミコンを繋いでいたのです。


ゲームセンター用のゲーム機の開発当時は、ゲーム機に「高価なグラフィック機能を搭載したCPU」の導入はコスト的にも喜ばれませんでした。

ゲームセンター用ゲーム機を製作する過程で研究した結果、

1.ゲーム画面のグラフィック構成は、簡単にまとめると、『背景+キャラクター+点数』で済む。
2.動かすキャラクターの大きさは、テレビ画面の縦横 1/15位の大きさが妥当。
3.点数は、テレビ画面の縦横1/30位で1文字表示が妥当。
4.ゲーム機も基本はコンピュータ。

の点から、ゲーム画面を、8×8ピクセルの要素を横に 32個&縦に 30個並べて表現する方式が考案されました。「スプライトとBG」の誕生です。
BGとは、背景に使われる、簡易グラフィック(バック・グラウンド)の事です。>BG画面

8×8ピクセルの要素を横に 32個&縦に 30個、を計算すると、

横=8ピクセル×32個=256ピクセル
縦=8ピクセル×30個=240ピクセル(実質 224ピクセル位までしか映らない様です)

となり、テレビ画面を使用するゲーム機の画面解像度が導き出されます。

スプライトとBGは、ゲームセンター用ゲーム機の開発時に発明され、のち、家庭用ゲーム機などにも使用されたそうです。


ファミコンのグラフィックについてのウンチクは、下記URLで勉強されたし
スプライトとBGについての解説

RP2C02
http://www.geocities.jp/r8ctiny/doc/rp2c02.html

スプライト (映像技術)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
http://ja.wikipedia.org/wiki/スプライト_(映像技術)


次回はスプライトについての講釈をしたいと思います。

【 関連記事 】
PSPプログラミング 家庭用ゲーム機の誕生秘話
PSPプログラミング スプライトについての講釈
PSPプログラミング キャラクタの描画について
PSPプログラミング 背景の描画について
PSPプログラミング 32ビットカラーで描画しよう!その1(前編 / 色)
PSPプログラミング 32ビットカラーで描画しよう!その1(後編 / 座標)
PSPプログラミング 32ビットカラーで描画しよう!その2 [ 点を打つ ]
PSPプログラミング 32ビットカラーで描画しよう!その3 [ ビットマップ画像 ]

関連記事

[edit]

CM: 0
TB: 0

page top

PSPプログラミング スプライトについての講釈 

2009/08/14
Fri. 22:52

昔と今とでは、「スプライト」の意味が違っていますので、順を追って、昔の場合から説明します。

本来のスプライトとは、『一辺が 8の倍数ピクセル からなる 四角形の小さな簡易グラフィック画面』であり、個数は最低64個から256個 または それ以上、絵のパターンデータを色違いで表示可能、しかもグラフィック画面に描画するのとは違い、1ドット単位での表示座標指定が可能です。

更に、スプライトの強みは、絵のパターンデータを縦方向に反転して表示したり、横方向に反転して表示したり、縦横方向に反転して表示したりする事も可能という事です。

通常、スプライトとBGはセットで搭載され(例外として、FM-TOWNSにはスプライトしか搭載されなかったそうです)、区画割り当てされた領域に 要素(絵のパターンデータ)を配置して表示する方式のBG画面、要素(絵のパターンデータ)を1ドット単位で自由に配置が出来る(重ねる事も可能)のがスプライト(スプライト画面)、と呼ばれています。

スプライトは、初期では ラインバッファ方式というのが採用されていましたが、欠点を改良して フレームバッファ方式に変わりました。

参考資料
wapedia
http://wapedia.mobi/ja/スプライト_(映像技術)



以下、参考までに、資料を貼り付け。

『スプライトが存在する機種と その性能』一覧表


ファミリーコンピュータ(通称:ファミコン)

Wikipedia      http://ja.wikipedia.org/wiki/ファミリーコンピュータ
メ  ー  カ  ー   任天堂
最 大 登録可能個数   スプライト256個、BG画面用に256個
最 大 表示可能個数   スプライト64個、BG画面は256個 全部可能
 寸     法    縦8ピクセルx横8ピクセル(固定)
横方向への枚数制限   8枚まで(9枚以上並べると、チラつくか消える)
色   深   度    2ビット( = 実質 64色中 3色)
色 パ レ ッ ト 数   スプライト用に4パターン、BG画面用にも4パターン


PCエンジン

Wikipedia      http://ja.wikipedia.org/wiki/PCエンジン
メ  ー  カ  ー   NECホームエレクトロニクス
最 大 登録可能個数   資料無し
最 大 表示可能個数   スプライト64個、BG画面については資料無し
 寸     法    16x16ピクセル~32x64ピクセル(可変)
横方向への枚数制限   16枚まで(17枚以上並べると、チラつくか消える)
色   深   度    4ビット( = 実質 512色中 15色)   
色 パ レ ッ ト 数   資料無し


メガドライブ

Wikipedia      http://ja.wikipedia.org/wiki/メガドライブ
メ  ー  カ  ー   セガ・エンタープライゼス(現:セガ)
最 大 登録可能個数   資料無し
最 大 表示可能個数   スプライト80個、BG画面については資料無し
 寸     法    資料無し
横方向への枚数制限   16枚まで(17枚以上並べると、チラつくか消える)
色   深   度    4ビット( = 実質 512色中 15色)   
色 パ レ ッ ト 数   4パターン(スプライト用とBG用に別々なのか、詳細は不明)


スーパーファミコン

Wikipedia      http://ja.wikipedia.org/wiki/スーパーファミコン
メ  ー  カ  ー   任天堂
最 大 登録可能個数   資料無し
最 大 表示可能個数   スプライト128個、BG画面については資料無し
 寸     法    8x8 or 16x16 or 32x32 or 64x64
横方向への枚数制限   資料無し
色   深   度    4ビット( = 実質 32768色中 15色)   
色 パ レ ッ ト 数   資料無し


セガサターン

Wikipedia      http://ja.wikipedia.org/wiki/セガサターン
メ  ー  カ  ー   セガ・エンタープライゼス(現:セガ)
最 大 登録可能個数   資料無し
最 大 表示可能個数   資料無し(3000個以上は 表示できるかと推測)
 寸     法    資料無し
横方向への枚数制限   枚数制限なし
色   深   度    24ビット(最大、1677万 7216色 同時発色)
色 パ レ ッ ト 数   資料無し
  備  考      拡大縮小、回転、変形サポート
            スプライト同士やBG面との半透明合成表示が可能
ポ リ ゴ ン 機 能   フラット90万ポリゴン/秒、テクスチャ30万ポリゴン/秒(最大)


プレイステーション

Wikipedia      http://ja.wikipedia.org/wiki/プレイステーション
メ  ー  カ  ー   株式会社ソニー・コンピュータエンタテインメント(SCEI)
最 大 登録可能個数   ◆◆◆ スプライトは未実装 ◆◆◆
最 大 表示可能個数   4000個(1/60秒、SCEI公表値)
 寸     法    ◆◆◆ スプライトは未実装 ◆◆◆
横方向への枚数制限   枚数制限なし
色   深   度    24ビット(最大、1677万 7216色 同時発色)
色 パ レ ッ ト 数   ◆◆◆ スプライトは未実装 ◆◆◆



※※ この他にも、スプライトが搭載されていたパソコンがあります。名前だけ紹介しますので、興味ある方は調べてみて下さい ※※
  FM-X FM-TOWNS MSX MSX2 PC-8801VA X68000/X68030 (アルファベット順)


一方、現在でのスプライトの意味は、ゲームに使用されるキャラクターの絵(頻繁に描き換えが行われるグラフィック)の事を指すようです。
スプライトは、例えば、対戦格闘ゲームのプレイヤーや、シューティングゲームの戦闘機や弾丸などに使用されています(もしくは、『 それ 』の事を指しています)。

グラフィック機能を補うのが目的で開発されたスプライト&BGですが、現在はグラフィックCPU(グラフィックボードとかグラフィックチップとかいう呼び名もあり)の性能が向上してきたので、スプライトがあると かえって邪魔との事で、スプライト機能は廃止にされつつあります。
今後はスプライトやBGは無くなるでしょう、との一般論。

今はどうなっているかというと、CPUで全てが補えるに至っています。
CPUのメインメモリ内での複数グラフィック画面の合成や半透明処理を行なってからグラフィック画面に描き込みする事も可能なのです。

CPUの処理速度が速くなったのと、メモリ媒体のコストダウンなどのお陰です。

これだけ講釈しましたが、PSPにはスプライトというモノは実装されていません。高性能グラフィックCPU(=GPU)が実装されたので、廃止されたのでは なかろうかと……。


この講座では、新しい意味での『スプライト』の講釈をまだまだ続けます。
次は、背景とキャラクタについての云々、の予定です。

つづく。

【 関連記事 】
PSPプログラミング 家庭用ゲーム機の誕生秘話
PSPプログラミング スプライトについての講釈
PSPプログラミング キャラクタの描画について
PSPプログラミング 背景の描画について
PSPプログラミング 32ビットカラーで描画しよう!その1(前編 / 色)
PSPプログラミング 32ビットカラーで描画しよう!その1(後編 / 座標)
PSPプログラミング 32ビットカラーで描画しよう!その2 [ 点を打つ ]
PSPプログラミング 32ビットカラーで描画しよう!その3 [ ビットマップ画像 ]


関連記事

[edit]

CM: 0
TB: 0

page top

PSPプログラミング - キャラクタの描画について 

2009/08/21
Fri. 00:34

今回は、背景の上にキャラクタを描画する際の事についての云々を書きます。

ゲーム画面は、グラフィック画面を使うなら、背景画像を描いてからキャラクタの画像を描くのが一般的です。ほとんどこの方法です。

キャラクタは、そのゲームでの決まった寸法の絵のパターンデータを、いくつかの色パレットデータ(色割り当てデータ)で塗り分けて、細かい座標指定で描画するのが一般的です。

ファミコン版ドラゴンクエストシリーズ等では、色違いモンスターが登場しますが、その原理は、同一の絵のパターンデータを、色パレットデータを違わせて表示しているだけなのです。


MONSUTA_MONO.png
↑↑ 同じ数字の部分を好きな色で塗ろう!
♪自由なぁー色でぇー描いてぇーみーよぉうー (アイドルマスター 『Colorful Days』)

MONSUTA_SLIME.jpg



色を固定色にしてしまうと、ハードウェア(ゲーム機)依存のデータになってしまい、ハードウェアによって色深度も違いますから、使い回しが不便になります。スプライトで表示する場合は、絵のパターンデータと色パレットデータの構成なので、省メモリ化もできるのです。

ここで、背景とキャラクタの重なりについて考えてみてください。下の図を見て、ちょっと考えて下さい。

MARIO_A1.png

MARIO_A2.png

コレに気づきましたか?
スプライトの優れている点は、「透明部分」が ある、という点です。

透明があると、最大表示可能色から1色を失うのですが、背景を気にせずキャラクタを乗せられる、という物凄い特典があります。

しかし、パソコンやPSPには「透明」という色はありません。

では、どうするか?というと、通常時は色を描画して、透明は、色を描画しない事で実現できます。

MARIO_A3.png

つまり、描画しなかったら透明、と覚えて下さい。

mediumgauge氏 製作の 『全角文字表示ライブラリ』は、点を描画したり点を描画しなかったりしています(擬似透明処理/上記と同じ理屈です)。

スプライト(機能)の欠点は、スプライトは寸法が決まっているので(8の倍数ピクセル)、でっかいキャラクタをスプライトを使って表示するには、沢山のスプライトをくっつけて、あたかも一枚の絵として表示するテクニックが要ります。
スプライトに、横に並べられる枚数制限がある場合、それを超える大きさのキャラクタは表示できないのです。

KONAMIのファミコン版グラディウスIIというシューティングゲームでは、大きめのボスキャラが飛んでいますが、それは、BG画面にボスキャラを描いて動かす事で実現しているのです。スプライトはプレイヤーの動かす戦闘機などに使用されています。

GRA_2_BOSS.png


昔(本来)のスプライトと、今(新しい意味)のスプイライトをごちゃ混ぜにして解説しましたので、混乱している方もいらっしゃるかと存じます。

なので、ハードウェアでスプライトを持たないゲーム機の利点を簡単に述べますと、でかキャラを自由に描画可能! キャラがチラつかない! などがあります。 まぁ、もっとも、プログラマの腕次第ではありますが。


次回は、背景の描き方やスクロールなどについて、です。
オラオラっ!

【 関連記事 】
PSPプログラミング 家庭用ゲーム機の誕生秘話
PSPプログラミング スプライトについての講釈
PSPプログラミング キャラクタの描画について
PSPプログラミング 背景の描画について
PSPプログラミング 32ビットカラーで描画しよう!その1(前編 / 色)
PSPプログラミング 32ビットカラーで描画しよう!その1(後編 / 座標)
PSPプログラミング 32ビットカラーで描画しよう!その2 [ 点を打つ ]
PSPプログラミング 32ビットカラーで描画しよう!その3 [ ビットマップ画像 ]

関連記事

[edit]

CM: 0
TB: 0

page top

PSPプログラミング 背景の描画について 

2009/08/22
Sat. 07:10

ゲーム画面に使われる絵(グラフィック)は、一見巨大な一枚絵に見えるかも知れませんが、実は、ある決まった寸法のパターン(絵の要素)を並べて表示している場合が多いのです。

背景のパターン(絵の要素)のデータ個数は、大抵 1バイト個数(256個まで)で、絵の番号(0~255の正数で扱われる)と、その配置図(マップデータ)から成り、ゲーム画面の背景を描く際は、そのマップデータから画面描画範囲分だけ拾い読みしながら描画します。


DRAQUE_00.png

上の絵のマップデータを分解してみると、下記の構成になります

DRA_MAP.png


上記理論が正しければ、マップデータの中身は数字の羅列という事になります。

00 00 00 00 00 00 00 00 01 01 01 01 01 01 01 01 01 01 01 02 02 02 02 02
00 00 00 00 00 01 01 01 01 01 01 01 01 02 02 02 02 02 02 02 02 00 00 00
01 01 01 01 00 00 00 00 00 00 00 01 01 01 03 00 03 03 03 03 00 00 00 01
00 01 01 01 01 00 00 00 00 00 00 01 02 02 03 00 03 03 03 03 00 00 01 01

RPGゲーム等では、小さい画面ながらも 『画面スクロール』を搭載しているので
上下左右から新しい地図が生えてくる、という錯覚を利用して、巨大な地図を
演出しています。

その他のスクロール(技法)

1.ラスタースクロール
画面に走査線を一本 描くたびに、画面を水平方向にスクロールする方法。走査線単位でのスクロールが出来ます。
ラスタースクロール機能を持つハードウェア(ファミコンなど)にて実現可能。
または、高速なCPUやGPUを装備しているハードウェアで擬似的に実現可能。

F-1_02.png

DARIUS2_H-SCROLL.jpg


2.ヴァーチカルスクロール
走査線の縦方向に対するラインごとのスクロール。垂直方向スクロール。とても高速なCPUもしくはGPUが必須です。

XEXEX_V-SCROLL.jpg



参考までに、水を表現するのに、「半透明」という処理(技法)が使われることもあります。

PHALANX_S1.jpg


次回は、実際に PSPプログラミング してみます。
絵とマップデータで 背景を描くことに挑戦!!

【 関連記事 】
PSPプログラミング 家庭用ゲーム機の誕生秘話
PSPプログラミング スプライトについての講釈
PSPプログラミング キャラクタの描画について
PSPプログラミング 背景の描画について
PSPプログラミング 32ビットカラーで描画しよう!その1(前編 / 色)
PSPプログラミング 32ビットカラーで描画しよう!その1(後編 / 座標)
PSPプログラミング 32ビットカラーで描画しよう!その2 [ 点を打つ ]
PSPプログラミング 32ビットカラーで描画しよう!その3 [ ビットマップ画像 ]


関連記事

[edit]

CM: 2
TB: 0

page top

ある心無いユーザーによる、著作権表示をしないでの使用による理由(?)で、ただ今、全角文字表示ライブラリが公開停止中になっております。

詳細
http://www.geocities.jp/mediumgauge/


困ったモノである…。


その後の 2011/10/30 現在では・・・迷惑かけてた首謀者のサイトが閉鎖してます



【 関連記事 】
PSPプログラミング 全角文字表示ライブラリをダウンロード
PSPプログラミング [ 番外編 ] 日本語の文字 一覧表(ASCII & SHIFT-JIS) 完全版
PSPプログラミング 東雲フォント文字を全部表示しちゃうプログラム
PSPプログラミング 東雲フォントのデータ構造を調べました
PSPプログラミング 全角文字表示ライブラリ公開停止中のお知らせ
PSPプログラミング 『東雲フォント』が動画になった

関連記事

[edit]

CM: 2
TB: 0

page top

2010年01月10日 更新


一般の C++言語におけるプログラムの記述は、main( ) 関数を

int main( int argc , char * argv[ ] )
{
    なるべく短く簡単に!
}

と記述するのが良い、とされています。

C++ 言語のプログラムは、標準では、まず、main( ) という関数から実行されます。
main 関数は、ソースコードのどの位置にあっても良いのです。main( )関数を一番最後に記述しても良いのですが、見づらい記述方法なので、私は 最初に main( ) 関数を書くように改めました。


  コマンドライン引数の変数には "argc", "argv" が使われます

    argc = argument count
    argv = argument vector

一般では、下記のようになります

    int argc ………… 引数の個数が入ってきます
    char *argv[] …… 引数の文字列が入ってきます


Windowsの場合では、コマンドライン上で 『ファイル名を指定して実行』 を行う際、実行するファイルに、引数(パラメータ類)を渡すことが可能です。


例:COPY コマンド

記述例:  C:> COPY OMAKE.TXT OMAKEDAYO.TXT
目的: OMAKE.TXT をコピーして OMAKEDAYO.TXT というファイルを作成(コピー)

こう記述した場合の 引数は、


引数1 = COPY
引数2 = OMAKE.TXT
引数3 = OMAKEDAYO.TXT
(これらの引数の末尾は、NULL文字 = 0x00 で終わっています)

引数の個数 = 3個


となります。引数の区切りは、半角の空白文字です。



この main( )関数の書き方は、PSPではどうなのでしょうか?

PSPにはコマンドラインは存在しないので、ゲームから EBOOT.PBP を起動させた時の引数を調べます


#include <pspkernel.h>
#include <pspdebug.h>

/* Define printf, just to make typing easier */
#define printf pspDebugScreenPrintf

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

int main(int argc , char * argv[ ])
{
pspDebugScreenInit();

printf("argc = %d\n",argc); // 引数の個数を表示
printf("argv[0] = %s\n",argv[0]); // 引数の1個目の文字列を表示

return 0;
}

↑↑ このプログラムを終了するには PSPの電源を切って下さい(手抜きです、ごめんなさい)。

↓↓実行結果(/GAME150/の下に、/Where/フォルダーを作って その中にEBOOT.PBP を貼り付けてみました)
実行結果サンプル.png

この結果、argc は常に 1 で、argv[0] には、EBOOT.PBP の在り処(フルPATH) が入る事が判明しました。

上記結果を参考にして、引数の 'EBOOT.PBP'文字 の手前(フォルダPATH)までを グローバル変数に退避しておく事により、下記のことが可能

ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP
ms0:/PSP/GAME150/HoeHoe/image/画像_0001.png

/HoeHoe/ は、使用者が勝手に作るフォルダで、製作者は まさか /HoeHoe/ フォルダに入れられるとは予想もしなかった。だが、image/画像_0001.pngファイル名は固定で分かっているので、image/画像_0001.png のフルPATH を突き止めたい!!

    'ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP'

(1) argv[0]の文字列情報から、EBOOT.PBP のフルPATH を取得します
(2) そのフルPATHから、EBOOT.PBPの文字列を削除します
(3) すると、EBOOT.PBP のあるフォルダPATHが判明するので、そのPATH以下に image/画像_0001.png 文字列を付け足します
(4) 完成!

'ms0:/PSP/GAME150/HoeHoe/EBOOT.PBP'
         ↓('EBOOT.PBP'文字列を削除)
'ms0:/PSP/GAME150/HoeHoe/'
         ↓('image/画像_0001.png'文字列を付け足す)
'ms0:/PSP/GAME150/HoeHoe/image/画像_0001.png'

作成した PATH へアクセスして、データを取得可能!!


main( ) の引数から 実行した EBOOT.PBP の入っているフォルダ(在り処)を突き止める関数が、既にRukaさま(NesterJ作者さま)により開発済みですので、紹介します。

NesterJ のソース内の、 pg.c中 の pgMain( ) という関数がそうです。

NesterJ 関連のダウンロード
http://rukapsp.hp.infoseek.co.jp/PSPSoftware/NesterJ.htm
↑↑ ここから、NesterJ for PSP Ver 1.11 source というのをダウンロードして下さい。

無許可ですが、続きに その関数を改変したソースを貼り付けておきます(Rukaさん、改変禁止でしたらご一報下さいませ)

-- 続きを読む --
関連記事

[edit]

CM: 5
TB: 1

page top

PSPのエラーコードを調べてみよう! 

2009/08/31
Mon. 23:51

ERROR_80020148.jpg

いきなり、こんな写真を載せて、「キサマァァッ!何様のつもりだァァッ!」と非難ゴーゴーなのは分らないでもないですが、この数字には意味があるんですよ。

先日、この数字で検索していて、見事解決しました。

ブログ : PSP万能改造さまの、『PSP エラーコード 解説』という記事がそうです。
http://pspbannoukaizou.blog50.fc2.com/
ブログ内検索にて、"PSP エラーコード 解説" などで検索して下さい。


今、起動できない ISO のトレンド・エラーコードが、80020148 だそうですな。意味は自分で調べてください。

【 ちゅうい 】
私は、NesterJとかをカーネル3.xx化しようとして、80020148 が出たのでメモっただけです。ISOなんて知りませんよ?



さて、寝るか。。。。。

関連記事

[edit]

CM: 11
TB: 0

page top

いきなりですがスーファミのソフトをEBOOT.PBPに変換してPSPに移植することは可能でしょうか?

なんか、こういう質問を受けたので、答えてみます。


変換するのは移植であるかどうか、議論をかましたい今日この頃(笑)

スーパーファミコンとPSPは、まず、プラットフォームが違います。

プラットフォーム (コンピューティング) - Wikipedia
スーパーファミコン - Wikipedia
プレイステーション・ポータブル - Wikipedia

PSPのエミュレータで、スーパーファミコンのROMを実機に近い動作で遊べますが、それはエミュレーションしているのであって、移植では無いですな。

エミュレーションとは、機械語で書かれた実行ファイルを 一語 一語 解析して、何をする命令か判断をして、更に BIOS やハードウェアなどに照らし合わせて、結局、『このような動作になるハズだッッッ』という処理を、絶えず やってのける作業です。人間にはとても出来ない作業でっす(^^;;;;;


日本には、エミュレータについて こんな法律があります。

原則として、ゲームエミュレータ本体に関しては、実物の動作をリバースエンジニアリングして開発する限りは違法性はないとされる。ただし、ハードウェアベンダから提供される、ハードウェア情報やソフトウェア開発キットなど、ベンダとの守秘義務契約に該当する情報を流用した場合は、守秘義務契約を違反した開発者に対して違法性を問われることになる。
リバースエンジニアリング -Wikipedia


EBOOT.PBP に変換というのは、PSP用の実行形式のファイルにするという事なので、スーパーファミコンのゲームソフトのプログラム・ソースを用意して、PSP用のコードに書き直してコンパイルして EBOOT.PBP を作成するのであれば、『可能です』という回答です。それを移植といいます。ええ。

オープンソースで頑張るしかっ!!



近況報告

リンクにある DXライブラリPortable を導入してみました。今後、お世話になりますよ~♪
画像表示プログラムを作っていたら、『画像インフォ』になった。
まず、画像を表示する前に、画像の情報が正しく読めているか確認しているのであった・・・・・。

関連記事

[edit]

CM: 8
TB: 0

page top


«  p r e v  | h o m e | n e x t  »


 

2020-07