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

2009年10月25日、ようやく間違いを訂正。 下の RGB( ) の計算式の閉じカッコが一文字抜けてました。
2010年01月10日、また間違いを訂正。 PSPSDK での int は、32ビット値(固定)です。今まで放置していてご迷惑をおかけしました。


さて、いよいよ お楽しみのグラフィック描画にチャレンジします。
まず今回は、PSPのグラフィック・ビデオRAM(V-RAMとも呼ばれます)を 32ビットカラーモードで点を打つ際の基礎からレッスンです。
これを理解すれば、V-RAMに線を引いたり四角枠や円を描いたり、塗りつぶし長方形や塗りつぶし円を描いたりする事が出来ます
(円を描く際は、数学のSin・Cos等の関数を用いて演算処理をして描画します→CPUでV-RAMに描画する場合であり、GPU描画を行なわない場合)。

 まず、32ビットカラーとは4バイトの値です。実際には現在のパソコンと同じく 24ビットカラー(最大1677万7216色)の表現が出来ますね。
 24ビットカラーと32ビットカラーの違いは、本当は24ビットカラーであり32ビット中 上位8ビットがカラッポの正味24ビットの値でありPSPのような32ビットCPU系では32ビット単位で扱うと楽チンな値でもあります。

 で、32ビットは4バイトなのでキャスト(型宣言)は long を使うと良いでしょう。 int でも良いのです。


 以下、PSPにおける、32ビットカラー(本質24ビットカラー)の割り当て配分表を書いてみます。

ビット  桁

 32 : 8    ↑
 31 : 7    |
 30 : 6    |
 29 : 5    |
 28 : 4 無効なビット(常にゼロ) +3バイト目 (オフセット値3)
 27 : 3    |
 26 : 2    |
 25 : 1    ↓

 24 : 8       
 23 : 7    
 22 : 6    
 21 : 5    
 20 : 4   青成分  +2バイト目 (オフセット値2)
 19 : 3    
 18 : 2    
 17 : 1       

 16 : 8       
 15 : 7    
 14 : 6    
 13 : 5    
 12 : 4   緑成分  +1バイト目 (オフセット値1)
 11 : 3    
 10 : 2    
 09 : 1       

 08 : 8       
 07 : 7    
 06 : 6    
 05 : 5    
 04 : 4   赤成分  +0バイト目 (オフセット値0)
 03 : 3    
 02 : 2    
 01 : 1       


↑↑ 縦長で見づらいかも知れません。ごめんなさい。

青、緑、赤は、それぞれ 8ビット長(1バイト)です。
値は、10進数で 0~255、16進数で 0x00~0xFF の範囲です。

これは、とても計算しやすいかと思いますが、どうですか?

例を挙げると、
青色を指定する際は、コード 0x00FF0000 を渡します。
緑色を指定する際は、コード 0x0000FF00 を渡します。
赤色を指定する際は、コード 0x000000FF を渡します。
と なります。

この時、良く考えてみると、
点を打つ V-RAMアドレスからの距離 赤は+0   (オフセット値==0)
点を打つ V-RAMアドレスからの距離 緑は+1   (オフセット値==1)
点を打つ V-RAMアドレスからの距離 青は+2   (オフセット値==2)
点を打つ V-RAMアドレスからの距離 ダミーは+3 (オフセット値==3)

となるので、仮にPSPの 左上( 0, 0) のV-RAMアドレスの先頭は 0x44000000 なので

0x44000000: 赤成分
0x44000001: 緑成分  (x,y)=(0,0)
0x44000002: 青成分
0x44000003: カラッポ
0x44000004: 赤成分
0x44000005: 緑成分  (x,y)=(1,0)
0x44000006: 青成分
0x44000007: カラッポ
0x44000008: 赤成分
0x44000009: 緑成分  (x,y)=(2,0)
0x4400000A: 青成分
0x4400000B: カラッポ

となるのですが、キャスト(型宣言)long 若しくは int で定義した値で座標(0,0)に色の点を 打つなら、

0x44000000: (long) 空青緑赤

の構成で点が打たれます。まぁ、こういう難しい事は考えずに、long 定義の値で そのままV-RAM書き込みしてやれば良いとだけ記憶しておいて下さい。 ノシ


色のコード対応表とかは、続きに記載する事にします。興味ある人は読んで下さい。
#define でカラーコードを定義して、プログラム中で使えるようにしています(コピペ対応)。

→ PSPプログラミング - 32ビットカラーで描画しよう!その1(後編 / 座標) へ続きます。
今回はダウンロード物はありません。
コピペできる物だけ あります。


-- 続きを読む --
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

前回、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

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

ダイアログ画面というのは、ユーザーに対話形式でどうするか決めてもらうのが目的です。
システムが持っているダイアログ機能をPSPSDKで利用できたので公開します。

【気をつけること】
このソースコードのファイル保存方法は、従来のシフトJISコードではなくてUTF-8コードになっています。
日本語メッセージ表示は、シフトJIS文字列ではなくUTF-8文字列を使っています

ダイアログ画面




『 ダイアログ画面表示サンプル 』のダウンロード
DIALOG_SAMPLE.zip  32.1 KB (32,905 バイト)
ダウンロード
(ソースコード / 実行ファイル)
ユーザーモードのEBOOT.PBPです。




ソースコードを読みたい方は、続きに貼り付けたので見てください

-- 続きを読む --

[edit]

CM: 0
TB: 0

page top


h o m e |


 

2017-03