ニンテンドーDSのプログラミングwith PAlib

PAlibとは

DS開発を簡単にするためのライブラリ。このライブラリが無いとメモリの何番地に値を格納して云々といったことをやらねばならい。このライブラリがあるおかげでずいぶんとDS開発は楽に進めることができます。ただ、日本語の資料は皆無と言ってもいいほどなのでハマってしまうとなかなか抜け出せない危険があります。

リンク

このページのPAlibのバージョンは 090801を使っています。またDevkitProは1.5.0を使っています。

画像の表示

画像の表示方法はspriteと3Dspriteがあります。

Spriteの表示

Spriteは表示のサイズが限られています。

8 16 32 64
8 8×8 16×8 32×8
16 8×16 16×16 32×16
32 8×32 16×32 32×32 64×32
64 32×64 64×64

「PAlib」->「tools」->「PAGfx」というソフトを使って、Cソースコードを吐き出します。これを使うと以下のようなファイル群を吐き出します。(このときタブはSpritesを選択してください)
 all_gfx.c  オブジェクトファイルにする時につかう  ソースを直接埋め込むときには使わない
 all_gfx.h  以下のファイルの宣言とサイズの定義  ソースを直接埋め込むなら、ソース中でこのファイルをインクルードする。
 <画像ファイル名>.c  画像データの本体データが入っている。  ソースを直接埋め込むなら、これを一緒にコンパイル・リンクする。
 <画像ファイル名>.pal.c  パレットデータが入っている   ソースを直接埋め込むなら、これを一緒にコンパイル・リンクする。

まず使いたいところで#include"all_gfx.h"します。(もちろんall_gfx.h等をプロジェクトと同じフォルダに移動させておいてください)そして、コンパイル・リンクするものに<画像ファイル名>.cと<画像ファイル名>.pal.cを追加します。

PA_LoadSpritePalを使ってパレットをロードする。

PA_LoadSpritePal(0, // スクリーン番号下のディスプレイなら0,上にのディスプレイなら1を表示
		0, //パレットの番号(スプライトの作成時に同じ番号を指定)
		(void*)sprite0_Pal);	// パレットへのポインタ

*パレットへのポインタはPAGfxでスプライを作成した場合は「スプライト名_Pal」となる。

PA_CreateSprite(0, //スクリーン番号
		0, //スプライト番号(すべてのスプライトに被らないように番号をつければ良い)
		(void*)sprite0_Sprite, // 画像本体へのポインタ
		OBJ_SIZE_32X32, // スプライトのサイズ
		1, // 16色なら0,256色なら1
		0, //パレット番号を指定
		50, 50); //スクリーン上の位置をx,yで指定(左上が0,0)

これらの関数が実際どのように使われるのかということは、PAlibのサンプルを見るとよりわかりやすいだろう。(PAlibでのこれらの関数のサンプル「examples」->「Sprites」->「basic」->「CreateSprite」)

3Dspriteの表示

大まかに見るとやることは通常のSpriteとほとんど同じです。 3DSprite上に貼る絵のことを「テクスチャ」と呼びます。PAGfxで3DSprite用の画像を作るときはTextureを選択してください。その後の生成されるファイルは同様なので.cファイルをコンパイル・リンクし、.hをインクルードしてください。

とりあえず初期化が必要です。

PA_Init3D(); //3Dspriteの初期化
PA_Reset3DSprites(); //3Dsprite達の初期化またはリセット

次にテクスチャのロード

u16 gfx = PA_3DCreateTex((void*)mollusk_Texture,  // テクスチャデータへのポインタ
			64, 64,		// 画像のサイズWidth, Height
			TEX_256COL );	// テクスチャのフォーマット

返値はテクスチャを貼りつけるときに必要なので保存しておく。

テクスチャのフォーマットの種類

 TEX_A3I5  アルファ8段階、32色
 TEX_A5I3  アルファ8段階、8色
 TEX_4COL  4色
 TEX_16COL  16色
 TEX_256COL  256色
 TEX_16BITS  16ビットカラー(65536)

次にテクスチャのパレットロード

PA_Load3DSpritePal(0, // パレットの番号
		(void*)mollusk_Pal); // パレットデータへのポインタ
テクスチャのフォーマット

実際に作る

PA_3DCreateSpriteFromTex(0, 	// スプライト番号(被らないように値をつければいい)
			gfx, 	// PA_3DCreateTexの返値(テクスチャの判別)
			64, 64, 	// スプライトのサイズWidth, Height
			0,   	// パレット番号
			32, 32); 	// スプライトの中心X,Y

更新する

PA_3DProcess();//これをループ内で実行する

wavファイルの再生

wavファイルを直接再生することはPAlibでは対応していないようなのでrawファイルというものに変換します。 rawファイルとは、wavファイルから余分な情報を取り除いたもので音の情報がそのまま配列のように格納されています。したがって、サンプリング周波数などがわからないので変換する際に揃えてやる必要があります。 ここでは以下のようにする

  • フォーマット:8bit signed
  • サンプリングレート: 11025Hz

    チャンネル: モノラル1チャンネル

    .rawファイルの作成にはどのようなソフトを使っても構いません。(Switch Sound File Converterを紹介しておきます。)その後、そのまま.rawファイルをリンクする方法もありますが、どうせなら画像と同様に.cファイルにしてほかと一緒にコンパイル・リンクできるようにしてしまいたいと思い、.rawから.cのコンバータを作りました。

    ダウンロード

    初期化

    AS_Init(AS_MODE_SURROUND | AS_MODE_16CH);//モード
    AS_SetDefaultSettings(AS_PCM_8BIT,//フォーマット
    11025,//サンプリング周波数(Hz)
    AS_SURROUND);//delay(遅れ)
    

    フォーマットの種類
     AS_PCM_8BIT  PCM方式の8bit
     AS_PCM_16BIT  PCM方式の16bit
     AS_ADPCM  ADPCM方式

    モードの種類(|(or)で重複可)
     AS_MODE_MP3  MP3を使う
     AS_MODE_SURROUND  サラウンドを使う
     AS_MODE_16CH  16chすべてを使う
     AS_MODE_8CH  8chだけを使う

    delay(遅れた波形と元の波形を合わせて音に立体感を出す手法)
     AS_NO_DELAY  遅れなし
     AS_SURROUND  遅れあり(16ms)
     AS_REVERB  リバーブ(66ms)

    実際に再生する(ただし、メモリ上にロードするのであまり長い音は再生できない)

    AS_SoundQuickPlay(sfx); //再生する波形データ

    返値はその時使用したチャンネル番号

    mp3ファイルの再生

    mp3も読み込みに関してはrawのときとほぼ同じです。

    同様に、.mp3から.cのコンバータを作りました。

    ダウンロード

    ソースの方も示します。まず、初期化

    fatInitDefault();//FATの初期化
    AS_Init(AS_MODE_MP3 | AS_MODE_SURROUND | AS_MODE_16CH);//モード
    AS_SetDefaultSettings(AS_PCM_8BIT,11025,AS_SURROUND);
    

    再生

    AS_MP3DirectPlay((u8*)out, (u32)out_size);//データ本体とデータのサイズを指定
    AS_MP3StreamPlay("/out.mp3");//ストリーム再生(これをしないとメモリが無くなったところで止まってしまう)
    

    停止

    AS_MP3Stop();

    (PAlibでのこれらの関数のサンプル「examples」->「Sound」->「ASlib」->「ASlib_General」)

     


    次へ