2008年12月31日水曜日

バージョン0.00をリリースしました^^

というわけでバージョン0.00をリリースしました。
結局音楽再生機能はまだついていません…
とりあえずサンプルコードを


#include "dxlibp.h"
PSP_MODULE_INFO("DX LIB TEST", 0, 1, 1); //この二行はおまじない
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER); //PSPプログラミングには必須なので我慢してくださいー
int main()
{
int x = 0,y = 0;
int gh = -1;
DxLib_Init();
gh = LoadGraph("test.png");
while(ProcessMessage() != -1)
{
ClearDrawScreen();
if(GetInputState() & DXP_INPUT_UP)y -= 3;
if(GetInputState() & DXP_INPUT_DOWN)y += 3;
if(GetInputState() & DXP_INPUT_LEFT)x -= 3;
if(GetInputState() & DXP_INPUT_RIGHT)x += 3;
if(x < 0)x = 0;
if(x > 480)x = 480;
if(y < 0)y = 0;
if(y > 272)y = 272;
DrawGraph(x,y,gh,1);
ScreenFlip();
}
DxLib_End();
return 0;
}


こんなかんじです。
ちょっと入力受付の仕方が本家ライブラリと違います。本家でいうGetJoypadInputState関数を使うような感覚になります。
それと、Draw系関数の最後の引数はまだ実装できていません。すいませんm(_ _)m
あ、ダウンロードはこちらになります。肝心なの忘れるとこだったw
あー、それともうみっつかよっつ
このライブラリを使ったことで発生した損害などに関して私は一切関知しません。というかPSPのCFW関連は全て自己責任ですからね!たぶんPSPがぶっこわれたりすることも無いと思います。カーネルモードは使わない方針ですし。
また、私はこのライブラリにバグがあっても修正の義務を負いません。可能な限り対処しますけどw
私はこのライブラリの著作権を放棄しません。が、バイナリであればこのライブラリを無連絡で使用してもいいです。
最後に、ソースコードを含めてどこかに公開する場合は以下の一行を添えてください。
DX Library Portable Copyright (C) 2008 Kawai Yuichi.
といってもまだソースコード公開してませんがww
要するに権利関係はDXライブラリとほぼ同じです。
そのうちまとめページとか作ります。
追記
PSPプログラムの作り方やこのライブラリの使い方のページを作りました。著作権関係もページを作りました。
配布サイトにリンクがありますのでご活用ください。
不具合、苦情、はげましなどはどんどんレスしていただければ助かります。

2008年12月30日火曜日

コミケ行って来ました。

コミケ行って来ました。優曇華院の本ばかり大量に仕入れましたw
で、丁度良い機会だったのでPSPで開発している方々と少しばかり情報交換をしてきました。
出水さんには感謝です。色々と意見を伺えたお陰で大きなバグが一つ消滅しました。pspDebugScreenめ…誰だこんな関数つくったのは!
ちょっと進展
音楽再生に使えそうなコードの情報とかPC動作のPSPエミュレータとかRTCカウンタの取得時間とか
色々と分かりました。DXライブラリPortableは順調(?)に形を成しています。
でも音はまだならないorz
明日あたり音のならないバージョンをアップしようと思います。サンプルプログラムはDXライブラリのものを…使えるようにしたいなぁ

2008年12月27日土曜日

音が鳴らないなー

未だに音がなりません。なんだか音楽の情報取得で固まってます。
それと、画像管理に不具合があったので対処中。
疲れて東方風神録やったらNormalノーコンクリアできました^^
エクストラは初見だったので見事なまでに蛙に叩きのめされました。まあ「ネイティブフェイス」が聞けたので良しとします。一度プレイして時間がかなり経っていることに気づき、現在この記事書いてます。
画像管理の不具合は再現できたりできなかったりなのですが、時々画像読み込みで別の番号が上書きされてるみたいです。おそらくどこかでバッファオーバーランしてますorz
こうして冬休みはふけていく・・・

2008年12月25日木曜日

クリスマスイウですね

いまだに音楽再生がうまくいっていません。←オイ
とりあえずPNGのバグが修正できました。現在JPEGとPNGの画像に対応してますー。
ただ、DXライブラリの隠し機能(?)のアルファ画像自動ロード機能はまだつけてません。
PSPのリソース的に一度標準グラフィックとして読み込んでから適用…といった方式になりそうです。メモリがたりないーw

2008年12月21日日曜日

ちょっとサーバーを強化してみる つもりだった。

自宅運用のサーバーが容量不足になっていたのでちょっとHDDを買ってきました。
1TByteのHDDが7000円台だったのと2000円弱のSATA-USB変換器が売っていたので同時買い。
で、帰ってきて気が付いたのですが…家庭内専用の玄箱サーバーはこれ以上USB繋ぐと処理が間に合わない。
かといって余力のあるWEBサーバーはOSがWinXPのHomeなので共有フォルダにパスワードがかけられない。ルーターを介さずインターネットに直結しているのでパスワードかけないわけにいかない。
…どうしようorz
そうだ!WindowsXPのProをWEBサーバーに入れればいいんだ!とか思いましたが
嗚呼、HDD買っちゃったからそんなお金ないよorz
どうしたもんですかねぇ…

2008年12月16日火曜日

音声関連

とりあえずJPEGの読み込みが正常にできるようになりました。ぱちぱちぱち
で、PNG読み込みを再度挑戦中です。フリーズはしなくなりましたが、表示が明らかにおかしいw
音声再生機能。サンプルコードを改造したものを組み込んでみたのですが、動きません。
みょんだなと思ってサンプルコードをそのまま実行してみたらエラーが…
試行錯誤した挙句判明したことは、サンプルコードはPSPのバージョンが3.XX世代でないと動かないということでした。
…にょろーん
現在気を取り直してlibmadというライブラリを組み込む作業中です。
課題として、MediaEngine使うにはどうすればいいのだらうか?というのも残ってます。なかなか思うようには運びませんね。
それから~
現在一部の関数名をDXライブラリと微妙に変更しているのですが、意味が無い気がするのでやめようかと思います。
つまりDxLibP_InitとかになっていたのをDxLib_Initにしちゃおうかと。
コレに関してはもう少し考えたうえでDXライブラリの管理人様と相談ですかね…
目指せ!ほとんど完全互換!
追記 12/16
Media Engineを使う再生方式だと同時に一つしか再生できないようです。
PlaySoundFileでMediaEngineを使うようにして、PlaySoundMemではソフトウェア処理をすることにしました。
あと、ハードウェアの制約から同時に再生できる音楽は8つまでになります。充分ですよね?

2008年12月15日月曜日

GetNowCountの実装

なんだか変です。
JPEGを読み込んで表示する際にU座標がうまく合いません。ちょっと縦長です。
原因候補。怪しい順
①読み込みの時点でバグがある。
②描画ルーチンにバグがある。
③SDKの不具合。
急いで解析しますね。
それからー、GetNowCountを実装しました。
ただ、RTCを使っているので多分重いです。もっと軽くてミリ秒程度の精度のあるタイマーは無いものだろうか…
U座標:UV座標で調べるとわかると思います。
RTC:リアルタイムクロックのこと。PCの電源を落としても次に起動したとき時計あわせをせずに済むのはこいつのお陰。主電源が切られても内部のバッテリの電力で刻々と時間を刻む時計。
GetNowCount関数:DXライブラリを使う上で非常に役に立つ関数のひとつ。ミリ秒精度のタイマー。
GetNowHiPerformanceCount関数:GetNowCount関数の上位版。マイクロ秒精度のタイマー。ちょっと重い。

2008年12月14日日曜日

よーやくJPEGが読めるようになったぞー!

タイトルそのままです。ようやくJPEGが読み出せるようになりました。
081213ss
あ、ちなみにPSPのスクリーンショットはRemoteJoyLiteというソフトで撮っています。PSPとPCをUSBで繋いで画面を転送するソフトです。開発で重宝してます。
…なんだか縦に色のスジが入ってますね。原因を探さねば…
画像の読み込み処理に手間取っているせいで音楽の再生機能をいまだに組み込んでません。ごめんなさーい
jpeglibを組み込んだだけで一気にファイルサイズが上がりました。大体200KByte弱くらい。
どうにかしてprxモジュールに分割したいんですけど…リファレンスが英語orz

2008年12月12日金曜日

画像の読み込み処理

各種形式の画像をいかに読み出すか?というあたりでいろいろと躓いています。
現在まだRAWデータしか読めないですorz BMPの読み込みの書き直し中です。
しかもRAWデータの読み込みも若干バグってることが判明して…あうあうあう~
グッドニュース?
とりあえず頂点データに色を含めなくてもDXライブラリとの互換性がとれる事が判明したので若干高速に…なるのかな?
音楽再生はテストコードがだいぶ形になってきたので明後日あたり組み込めそうです。
動画関連は情報が少なくて正直厳しいです。もしかしたら最初のリリースでは動画再生機能自体が存在しないかもです。
息抜きにソースコードの行数をチェックしたら1500行ってとこでした。この分でいくと全体で5000前後になるかなー?と安易な皮算用をしてみたり。

2008年12月10日水曜日

期末考査終了のお知らせ(いろんな意味で)

今日で学期末考査が終了します。
これでゆっくりはやくしていけるね!!!
現在の進度状況報告
通常のテクスチャ周りは大方組あがりました。次はイントラフォントライブラリというモノを組み込んで文字列描画を実装する予定です。
なんかテクスチャを使わない関数の描画結果が不可思議なことになってます。少女究明中…
あ、それから…音楽再生の機能はmp3形式とATRAC3形式にまず対応します。両者はソニー公式のHWアクセラレーションが使えるらしいのと、サンプルプログラムが存在するからです。

2008年12月9日火曜日

ちょっとソースコード開示

少しずつソースコードを開示したいと思います。
とりあえずVRAMの管理部分から…


/*VRAM上のアドレスを管理するための構造体*/
#define VRAMCTRLFLAGS_EXIST 0x01
#define VRAMCTRLFLAGS_STATIC 0x02
typedef struct tagDXPVRAMCTRL
{
union
{
u32 offset;
void* address;
};
u32 size;
u8 flags;
}DXPVRAMCTRL;


#define VRAMARRAYNUM (2*1024) /*確保できるVRAM領域の最大数(≒テクスチャの最大数)*/
static u8 vramdata[2*1024*64 + 1]; /*VRAMの使われている場所を記憶する16byte単位。最後のは番兵*/
static DXPVRAMCTRL vramarray[VRAMARRAYNUM + 1];/*確保済みVRAMの情報保持*/
static u32 vramfree; /*あとどれくらい空いているのか*/
void InitVRAM();
DXPVRAMCTRL* AllocVRAM(int Size,int StaticFlag);
void FreeVRAM(DXPVRAMCTRL *VRamCtrl);
//static void DeflagVRAM(){}
void InitVRAM()
{
int i;
for(i = 0;i < 2 * 1024 * 64;++i)vramdata[i] = 0x00;
vramdata[2 * 1024 * 64] = 0x01;
for(i = 0;i < VRAMARRAYNUM;++i)
{
vramarray[i].address= 0;
vramarray[i].flags = 0;
vramarray[i].size = 0;
}
vramarray[VRAMARRAYNUM].flags = VRAMCTRLFLAGS_EXIST;
}
DXPVRAMCTRL* AllocVRAM(int Size,int StaticFlag)
/*静的フラグが立っている場合は逆方向から検索する。若干の改良(?)*/
{
int i,j,df;
if(Size > vramfree)return NULL;
if(Size % 16)Size += 16 - Size % 16;/*確保するサイズが16で割り切れない場合は補正*/
df = 0;
if(!StaticFlag)
{
i = 0;
FREEAREASERCH:
while(vramdata[i])++i; /*使われていない場所を検索*/
if(i >= 2 * 1024 * 64)return NULL;/*番兵にぶつかったか、みょんな力が働いたかのどちらか*/
for(j = 0;i + j < 2 * 1024 * 64 && j < (Size >> 4);++j);/*連続して空いているのか確認*/
if(i + j >= 2 * 1024 * 64)return NULL;
if(j < (Size >> 4))goto FREEAREASERCH;/*連続してなかったら検索しなおす*/
}
else
{
i = 2 * 1024 * 64;
FREEAREASERCH_STATIC:
while(vramdata[i])
{
--i; /*使われていない場所を検索*/
if(i < 0)return NULL;
}
for(j = 0;i - j >= 0 && j < (Size >> 4);++j);/*連続して空いているのか確認*/
if(i - j < 0)return NULL;
if(j < (Size >> 4))goto FREEAREASERCH_STATIC;/*連続してなかったら検索しなおす*/
i = i + 1 - j; /*iを場所の先頭にもってくる*/
}
/*ここまでで空き領域検索終了。データ検索に入ります*/
j = 0;
while(!(vramarray[j].flags & VRAMCTRLFLAGS_EXIST))++j;
if(j == VRAMARRAYNUM)return NULL;
/*検索終了♪*/
for(k = 0;k < Size;++k)vramdata[i + k] = 0x01;
vramarray[j].offset = i * 16;/*16バイト境界前提なのでw*/
vramarray[j].size = Size;
vramarray[j].flags = VRAMCTRLFLAGS_EXIST |
(StaticFlag ? VRAMCTRLFLAGS_STATIC : 0)
;
return vramarray + j;
}
void FreeVRAM(DXPVRAMCTRL *ptr)
{
int i;
if(ptr == NULL)return;
if(!(ptr->flags & VRAMCTRLFLAGS_EXIST))return;
if(ptr < vramarray || ptr >= vramarray + VRAMARRAYNUM)return;
for(i = (ptr->offset >> 4);i < (ptr->size >> 4);++i)vramdata[i] = 0x00;
ptr->address = 0;
ptr->flags = 0;
ptr->size = 0;
}



ちょっとみょんな仕様になっています。
AllocVRAMを呼ぶとDXPVRAMCTRLへのポインタを返す仕様です。
えー、なんでこんな仕様で作ったかというと、VRAMの内部でデフラグみたいなことができるようにするためです。ポインタで渡しておけば大本の場所の情報の変更ですむので。
まだデフラグのルーチン組んでませんがねwwww
なんでVRAMをデフラグしたいかというと、兎にも角にもPSPのVRAMがちっちゃいからです。2MByteしかありません。
画面用のバッファが二枚必要なのですが、16bitカラーで確保した場合でも512*272*2*2=544Kbyte必要になります。既にVRAMの1/4も使われてます。
当然のごとく32bitカラーの場合VRAMの1/2が画面バッファになってしまうという…仕様です。
これで無駄な領域ができたりしたらもう…考えたくありません。
そこで、VRAMのデフラグです。テクスチャなんて一度作ったら消すまでサイズは変わりませんからWindowsのアレみたいな弊害も出ないです。
ですが、間違って画面バッファを移動したりしたら…最低な事態になります。なにが表示されるんでしょうか… あ、気になる。今度実験でもしますw
そこで移動不可なものにはVRAMCTRLFLAGS_STATICフラグを立てることにしてます。
多分これで大丈夫だと思います。多分ね…
追記
ああああ・・・・タブが無視されてソースコードの表示がひどいことに…orz FC2ブログのばかやろぅー
さらに追記(081209)
このソースコードちょっとバグってます。修正は完了していますが、更新がめんどうなので来週あたりに全コードとバイナリを公開する予定なのでそれを待ってください。

2008年12月8日月曜日

テクスチャブレンディング

やっぱりというか案の定というか…
テクスチャブレンディングが大変DEATH
テクスチャの色をブレンディングステージの前に実行するためには頂点カラーが必須になるんですが、
その処理がいらない場合は頂点カラーのデータが無駄になります。
PSPのスペックはそんなに高くないのでこういった無駄はすごく邪魔です。
そうすると、描画時に頂点を切り替えることになるんですが…すべての描画関数でその場合分けをしないといけないのでバグや修正のあったときが非常に不安です。
まぁ、組むんですけどねw

2008年12月7日日曜日

DXライブラリPortableの内部を大幅に変更しようかと考えています。

DXライブラリPortableを今までかなり闇雲に作っていたのですが、PSPの構造とか作法とかが大分つかめてきたので内部的な部分をいろいろ作り直す事にしました。
VRAMの管理にメインメモリが2MByteも持っていかれててもったいなさ過ぎるとかね…w
このページはいわば企画書みたいなものになります。時々変更することになるかもしれません。
表向きに搭載する機能一覧(製作予定順)
HOMEボタンでXMBに戻る機能
入力の受付
rawファイルへの対応
グラフィックスの描画機能
PSP専用形式のフォント描画
BMPファイルへの対応
音楽再生機能
MP3ファイルへの対応
PNGファイルへの対応
JPEGファイルへの対応
DXライブラリ形式のアーカイブへの対応
通信機能への対応
マスク効果
内部的に搭載する機能
VRAMの管理
テクスチャの管理
swizzleテクスチャの対応
DXライブラリに存在するけどPSPの仕様の都合で搭載できないと思う機能一覧
MIDIファイルの再生
ブレンドグラフィック機能

DXライブラリPortable 開発状況

えー、現在の状況なんですが…
libpngというライブラリの使い方で困ってます。
フリーズしちゃうんですよ…
原因がつかめなくて難儀しています。で、気分転換にBMPファイルの読み込みルーチンをPSP向けに作ってます。
今の段階でできること
GPUをフルに使える
rawファイルの読み込み
HOMEボタンで終了できる
DXライブラリと同様の入力受け取りができる
乱数生成
GetNowCountとか
できないこと
音楽の再生…未着手
JPEGの読み込み…未着手
PNGの読み込み…ハマってしまいました
BMPの読み込み…鋭意製作中
ネットワーク関連…未着手

PSPのプログラミングに必要な知識とか

前回の記事で一回くらいはコンパイルに成功していると思います。
えー、今回はPSPのプログラミングに必要最低限(だと思う)な知識をお送りします。
1、makefileの書き換え
2、VisualC++の便利技
①makefileの書き換え
makefileとはLINUXとかでよく使われるもので、VisualC++のプロジェクトみたいなものです。どのファイルをソースとして使うのか、どのようにプログラムを作るのか、といった内容です。
百聞は一見にしかず。中身を見てみましょう。あ、エクスプローラから開くときにプログラムの選択メッセージが毎回出ますけどメモ帳よりWordPadを使ったほうが吉です。理由はメモ帳で開けばわかります。


#PSPのアプリを作るためのmakefileのテンプレです。
#プロジェクト名。半角英数ならなんでもいいです。
TARGET = PSP_Project_Template
#オブジェクトファイル名 main.o def.oなど 半角スペース区切り
OBJS = main.o
#PSPに表示されるタイトル
PSP_EBOOT_TITLE = PSP_Project Template
#放置
YOURLIBS =
INCDIR =
CFLAGS = -G4 -Wall -O2
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBDIR =
LDFLAGS =
STDLIBS =
LIBS = $(STDLIBS)$(YOURLIBS)
EXTRA_TARGETS = EBOOT.PBP
PSPSDK = $(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak


中身はこんなかんじです。#がコメントアウト記号になっていて、#から行末までは無かった事になります。
で、一番大事なのがこの三行です。
TARGET = PSP_Project_Template
OBJS = main.o
PSP_EBOOT_TITLE = PSP_Project Template
大体のプログラムにはこの三行をいじるだけで対応できます。
TARGETにはプロジェクト名を指定します。そのままでも結構です。
OBJSにはソースコードを指定します。
ここで注意!拡張子はoです。C言語だろうとC++言語だろうと拡張子はoで記述してください。また、複数のソースコードがある場合は半角スペースで区切ってください。
たとえばmain.cとsub.cがある場合は
OBJS = main.o sub.o
このようになります。
PSP_EBOOT_TITLEにはプログラムのタイトルを書きます。これはPSPのXMBにゲーム名として表示されます。PSPSDKの仕様の関係で日本語が使えないのが残念です。
特にOBJSはソースファイルが増えたときには必ず弄る必要があります。必ず覚えてください。
後は…LIBSの項目も時々書き加えないといけない場合があります。このサイトでは扱うのはちょっと先になりそうなので放置することに…
②VisualC++の便利技
VisualC++の入力支援は通常は構造体やクラスの中のメンバを一覧表示するくらいしか働いてくれません。コメントアウトを一行一行していくのも面倒ですよね。
で、ショートカットキーを使えば色々楽になります。特によく使われるものをあげようと思います。
Ctrl+C        コピー
Ctrl+X        カット
Ctrl+V        貼り付け
この三つは知っている方も多いと思います。
Ctrl+K Ctrl+C   選択されている範囲をコメントアウト
Ctrl+K Ctrl+U   選択されている範囲のコメントアウトを解除
このコマンドはCtrl+Kを先に入力してからCtrl+○を入力してください。
Alt+→        入力支援
このコマンドが一番便利です。効果は実際に試してみれば判ります。すばらしいですよ!
ただ、時々動かなくなることがあります。そのときは一度VisualC++を終了してプロジェクトフォルダを開き、拡張子がncbになっているファイルを消してください。この方法はMicrosoft公式の方法なので安心してくださいね。

2008年12月6日土曜日

とりあえず工事現場を公開

えー、記念すべき記事第一号が書いてる途中で消えてしまって鬱になりました。
もう夜遅いのと若干アルコールが入っている(お酒じゃなくてチョコレートです)ので手短にいきます。
本日の記事内容:PSPのプログラミング環境を整える。
WindowsだろうとLinuxだろうとPSPだろうと、プログラムを組むには相応の開発環境が必要になります。
私のオススメのVisualC++2008×PSPSDKの組み合わせを紹介しようと思います。
そのまえに、一部の人にはちょっと残念なお知らせをお伝えします。
残念ながらVisualC++2008はWindows2000とかWindowsMEとかでは動きません。WindowsVistaかSP2以降が適用されたWindowsXPでないといけません。古いバージョンのVisualC++なら動くと思うのでがんばってください。
ではVisualC++のインストールからいきましょう。ここにフリーのVisualC++があります。サイトの指示に従ってダウンロードしましょう。
ダウンロードしたら起動しちゃいましょう。不安な方はその前にウイルススキャンにでもかけてください。インストールはインストーラーの指示に従ってください。
インストールが終わったらとりあえず一度起動しちゃいましょう。
「スタート」→「すべてのプログラム」→「Microsoft Visual C++ 2008 Express Edition」→「Microsoft Visual C++ 2008 Express Edition」
初回起動時の設定がどうとかいうダイアログが出ます。放置して次の作業に行きます。どうせ自動でおわりますから。
PSPSDK for Winをダウンロードします。リンク先の右上の緑のところに入って、「devpack」という行のDownloadをクリックしましょう。
インストールは適当にOKを押せばできます。できなかったらコメントください。多分対応します。
最後に、VisualC++でPSPSDKを利用するためのプロジェクトを作らねばいかんのですが…
説明する手間がめんどくさかったのでテンプレートを作っておきました。
ここにあります。
ダウンロードして解凍したら、PSP_Template.slnというファイルを開いてください。クリックするとVisualC++が立ち上がるはずです。F7キーを押すとコンパイラが働いてPSP用のプログラムが生成されます。
とりあえず今日はここまでです。テンプレートに入れてあるmain.cというソースコードはコンパイルに必要最低限の事しか書いていないので、ここに色々とプログラムを加えてみてください。コンパイルはF7ですよー♪