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

スポンサーサイト 

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

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

[edit]

CM: --
TB: --

page top

ICON3.png
ICON3.png


『ハローワールド!ひねくれ版』を作ったので、ご報告です。

これは、" Hello, World ! " とかを表示させます。
無限ループで、パッド情報を調べています。
もし、Rトリガーボタンが押されたら、即座に終了してXMBへ戻ってきます。
もちろん、[HOME]ボタンからでも終了可能ですよん。
な、何て親切なんだ(笑)。

全部まとめてココに! ↓↓
ダウンロード
PSP_HELLO_hinekure.zip


「Hello, world」は、エミュレーターとかを起動可能にするソフトウェアではないので勘違いしないで下さいね。
Hello world - ウィキペディア


[ インストール方法 ]

FW 1.00 の人 → /HELLO/ フォルダーを、ms0:/PSP/GAME/ 以下フォルダーへコピーする。

FW 1.50 の人 → /HELLO/ フォルダーをPBPmakerやEasyPBP InstallerやKxploit等で分割して、
         ms0:/PSP/GAME/ 以下フォルダーへコピーする。

CFW PSP-1000 の人 → /HELLO/ フォルダーを、ms0:/PSP/GAME150/ 以下フォルダーへコピーする。

CFW PSP-2000 の人 → /HELLO/ フォルダーを、ms0:/PSP/GAME/ 以下フォルダーへコピーする。

以下、プログラム・ソースとか(文中の、緑色の文字注釈なので読み飛ばしOK!
------------------------------------------------------------------------
ファイル名 == main.c
------------------------------------------------------------------------

/////////////////////////////////////////////////////////////
//                             //
// HELLO, World arranged. //
// //
// Created by : 猫山 猫宗 in 2009/03/08(SUN) //
// //
/////////////////////////////////////////////////////////////


// ココからは、インクルード部分ですよ~~♪
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspctrl.h>

#include <pspsdk.h>
#include <pspkernel.h>
#include <stdio.h>

#include <pspctrl.h>
#include <stdlib.h>
// インクルード部分お終い~~♪


// モジュール名を設定する。
PSP_MODULE_INFO("HELLO", 0, 1, 1);
// スレッドの情報を設定する。
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

// #define は、「定義する」という意味です。
// 'pspDebugScreenPrintf' と書くと長いので、'printf' に省略します。

#define printf pspDebugScreenPrintf


///////////////////////////////////////////////////////////////////
// ↓↓  ココから、[HOME]ボタン押しで終了できるように記述します。


// Exit callback コールバックの終了
int exitCallback(int arg1, int arg2, void *common)
{
sceKernelExitGame();
return 0;
}

// Callback thread コールバックスレッド
int callbackThread(SceSize args, void *argp)
{
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", (void*) exitCallback, NULL);
sceKernelRegisterExitCallback(cbid);

// ポーリング
sceKernelSleepThreadCB();

return 0;
}

// コールバックスレッドの生成
int setupCallbacks(void)
{
int thid = 0;

thid = sceKernelCreateThread("update_thread", callbackThread, 0x11, 0xFA0, 0, 0);
if (thid >= 0)
{
sceKernelStartThread(thid, 0, 0);
}
return thid;
}

//// お疲れ~♪ ↑↑ ここまで書いたら、[HOME]ボタンで終了できます
///////////////////////////////////////////////////////////////////



/////////////////////////////////////////////////////////////////
// //
//   いやほう!メイン関数でーーす!ここから始まります //
// //
/////////////////////////////////////////////////////////////////


int main(void)
{
SceCtrlData pad; // 構造体変数 pad に、パッド入力情報が入る。


pspDebugScreenInit(); // 画面を初期化する
setupCallbacks(); // [HOME]ボタン押しでXMBに戻れる様に設定

sceCtrlSetSamplingCycle(0); // パッド情報を読み込むために、まず行ないます
sceDisplayWaitVblankStart(); // 画面表示の垂直同期信号待ちをします(チラつき防止)

pspDebugScreenInit(); // 画面を初期化する

printf(" Hello, world !!\n\n"); // 画面に書く( \n は、改行文字です )
printf(" Hello, Ludorph !!\n\n"); // 画面に書く(つまり、2行、改行する)
printf(" Hello, kitty !!\n\n"); // 画面に書く
printf("\n Press R button to EXIT."); // 画面に書く( Rトリガーボタンを押せ! )

do
{
// ↓↓ PSPのパッド情報読み取り作業
sceCtrlReadBufferPositive(&pad, 1);
}while(pad.Buttons != PSP_CTRL_RTRIGGER); // Rトリガー押されない限り、無限ループよん
// 一応、[HOME]キーからでも終了できますので。

sceKernelExitGame(); // PSPのゲームを終了させる関数(XMBに戻ります)
return 1; // ダミーですが、書いてみたり。
}

------------------------------------------------------------------------
↓↓ makefile です
------------------------------------------------------------------------

TARGET = HELLO
OBJS = main.o

INCDIR = lib/
CFLAGS = -Wall -G0 -O2 -fomit-frame-pointer -mgp32 -mlong32

CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

LIBDIR =
LDFLAGS =
LIBS = -lpspgu -lpsppower

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = HELLO, World Arranged.
PSP_EBOOT_ICON = ICON3.png
PSP_EBOOT_ICON1 = NULL
PSP_EBOOT_UNKPNG = NULL
PSP_EBOOT_PIC1 = NULL
PSP_EBOOT_SND0 = NULL

PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

main.o : main.c

------------------------------------------------------------------------

付属の !_mk.bat をダブルクリックでコンパイル開始です。
コンパイルが終ったら、FW 1.00用の EBOOT.PBP が生成されます。

次回は、全角文字版の『 はろぅ わーるど for PSP 』 を製作&掲載します。
皆さん、mediumgauge様に感謝して全角文字ライブラリが含まれている、PSP用rar展開サンプルプログラム(RAR extract sample for PSP)をダウンロードさせて頂きましょう(#^.^#)

関連記事
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

     HELLO2.png →  HELLO2.png

アイコンのスクリーンショット
クロスメディアバーの [ゲーム] から見たトコロ。

実行画面のスクリーンショット1
かなーーーり乱文ですが、ご了承下さい。ヘコヘコ。m(_ _)m

実行画面のスクリーンショット2
下側の5行の文字列が、明るくなったり暗くなったりします。
Rトリガー押しで一発終了!




謝辞

このプログラムを作るにあたり、ミディアムゲージ様 製作の『全角文字表示ライブラリ』を、一部改変して使用しております。ソースのコンパイルには、『全角文字表示ライブラリ』が必須です。

ミディアムゲージ様に感謝です。

【 注意 】
2010年01月10日 現在、『全角文字表示ライブラリ』は配布停止中です。
理由は、心無いユーザーによる無断使用のため、です。なんてこったい!


ファームウェア1.00/カスタム・ファームウェア完全対応してます!!
もちろん、カーネル1.00版と、カーネル3.xx版があります。
for PSP-1000 / for PSP-2000

Q. ソースは?
A. 付属しています(付属しないと駄目じゃん!!)


ダウンロードページへご案内~

解説は、また、後ほど………イソイソイソ……。

関連記事

[edit]

CM: 6
TB: 0

page top

さて、前出の 「全角文字版はろ~わーるど」 の解説です。
大した事はしていません。

本家 『 全角文字表示ライブラリ zenkaku.c 』 への変更は、下記の通りです。
文字の描画色のキャスト(型宣言)を、"int"から"long"に変更しただけです。

理由は、
ただの気まぐれです。気まぐれオレンジロード(古っwww
「C++コンパイラーは、CPUやコンパイラーに渡すパラメータ等で int の扱いが変化する為」です。
PSPは32BIT-CPUですし、色の表現は32Bit可能ですし、ソースを見ていたら32Bitで扱われている事などから、"long"に統一しました。

昔ながらのプログラマーは、int は2バイトって固定観念があるんですよ。PSPは32ビットCPUを装備してるので、int は4バイト(固定)なのですが…。

で、文字の描画処理は、フォントの有効データがあれば、指定された色で点を打ち、フォントの有効データが無ければ何もしない、という事が行なわれています(擬似透明処理)。
空白文字だと全く点が打たれません。"●"という文字だと円状に点が打たれます。

こういう処理をしていると、暗い色で文字列を描画して、左上に(-1,-1)した座標から明るめの色で文字列を描画し、『立体感が出ている影つきの文字列』が描画できます。

私は、『 全角文字表示ライブラリ zenkaku.c 』を更に改良して、文字色を透明に出来るようにしたり、背景色を有効(32Bitカラー)にする事も考えています。
そうするとカラフルな文字が描画できて楽しいのでは?とか思ったり。

関数 mh_print のフォントについて
書体は東雲フォント(しののめふぉんと)です。
半角文字では横6ピクセル×縦12ピクセル
全角文字では横12ピクセル×縦12ピクセル
となっております。
Windows文字を全てサポートし、更に絵文字も入っています。

関数 mh_print の使い方
/*****************************************************************************
*文字列の描画
*****************************************************************************/

void mh_print(int x,int y,const char *str,long col)

int x == 描画始点のX座標(左端 / 0~479の範囲で指定:PSP横は480ピクセル)
int y == 描画始点のY座標(上端 / 0~271の範囲で指定:PSP縦は272ピクセル)
const char *str == 描画する文字列のオフセット値(アドレス:32Bitの値で指定)
long col == 描画する文字列の色を32Bitカラーで指定(実は24Bitカラー)

<使用例>
mh_print(32, 27, "Hello,world !",0xffffff); // 白色


尚、PSPでの32Bitカラーは、下記のようになっています。

( 上位 Bit  ←←←←←←←←←←    →→→→→→→→→→ 下位 Bit )
無無無無無無無無 青青青青青青青青 緑緑緑緑緑緑緑緑 赤赤赤赤赤赤赤赤

簡単に述べると、無青緑赤の順に、各色成分が 8 Bit 持っています。
Windowsでは、無赤緑青なので、PSPとは 青成分と赤成分が逆になっている、という事実。

8 Bit という事は、0~255 の 256通り の表現が可能という事です。
0 は無色で、255 は最大に明るい色、です。
C++言語での色表現を下記に書いてみました。C++言語では16進数を 0x数値 と書きます

< 例 >
青色:0x00FF0000
赤色:0x000000FF
緑色:0x0000FF00
紫色:0x00FF00FF
黄色:0x0000FFFF
水色:0x00FFFF00
黒色:0x00000000
灰色:0x00777777

32Bitカラーといっても、実際は24Bitカラーなんですねぇ。

この関数に対して不明点・質問があったら、コメント欄に書いてください。解かる範囲でお答えします。

関連記事

[edit]

CM: 1
TB: 0

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

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

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

  ( プログラムの一部を見たい人の為に、「続きを読む」 に追加しました 。 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

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

キミは このタイトルを見た瞬間、「やれやれだぜ」と言う………。

やっぱし、ジョジョ好きなんですわwww
デスクトップでもジョジョネタやりましたが、MP3でもジョジョネタやります(えっへん)

ダウンロード
ちゅうい : PSPを 3.xx以降カーネルにしてから実行してください
(リカバリーメニューで Homebrew Game Folder を 5.XX Kernel に設定)

ソースコードを見たい方は、続きをドウゾ。


【 関連記事 】
PSPプログラミング PSPSDKにライブラリを追加しよう(4) DXLibP v0.5.7
PSPプログラミング DXライブラリPortable を使ってみよう(1) mp3再生
PSPプログラミング DXライブラリPortable でプログラムの「核」を書く
PSPプログラミング DXライブラリPortable サウンド関数の解説(1)
PSPプログラミング DXライブラリPortable サウンド関数の解説(2)
PSPプログラミング DXライブラリPortable サウンド関数の解説(3)
PSPプログラミング DXライブラリPortable サウンド関数で「ドドド」
PSPプログラミング DXライブラリPortable サウンド「ドドド」解説


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

[edit]

CM: 0
TB: 0

page top

PSPパッドの読み取りについての解説をします.

今回は、DXライブラリPortable での読み取りは行ないません.生データの検出からやります.
この記事でデジタル部分、次回記事でアナログ部分を解説します.
read frame(読み出しフレーム)というのも検出できるようですが、省略です.

定義されている構造体
/** Returned controller data */
typedef struct SceCtrlData {
  /** The current read frame. */
  unsigned int   TimeStamp;
  /** Bit mask containing zero or more of ::PspCtrlButtons. */
  unsigned int   Buttons;
  /** Analogue stick, X axis. */
  unsigned char  Lx;
  /** Analogue stick, Y axis. */
  unsigned char  Ly;
  /** Reserved. */
  unsigned char  Rsrv[6];
} SceCtrlData;

カーネルモードとユーザーモードでは、PSPパッドの読み取れる内容が異なります.
全部 読めるのがカーネルモードで、一部 読めないのがあるのがユーザーモードです.

プログラマブルキーと特殊キーとに区別しようかと.
勝手に命名すると混乱を招く恐れがあるのですが、察して下さい.

参考にした資料 / ヘッダーファイル
pspctrl.h


[ カーネルモードで読み取れるデータ ]

定義されている変数    値(16進数 32ビット)
セレクトキー  PSP_CTRL_SELECT 0x00000001
スタートキー  PSP_CTRL_START 0x00000008
十字キー上   PSP_CTRL_UP 0x00000010
十字キー右   PSP_CTRL_RIGHT 0x00000020
十字キー下   PSP_CTRL_DOWN 0x00000040
十字キー左   PSP_CTRL_LEFT 0x00000080
Lトリガー   PSP_CTRL_LTRIGGER 0x00000100
Rトリガー   PSP_CTRL_RTRIGGER 0x00000200
△ボタン    PSP_CTRL_TRIANGLE 0x00001000
○ボタン    PSP_CTRL_CIRCLE 0x00002000
×ボタン    PSP_CTRL_CROSS 0x00004000
□ボタン    PSP_CTRL_SQUARE 0x00008000
ホーム     PSP_CTRL_HOME 0x00010000
ホールド    PSP_CTRL_HOLD 0x00020000
WLANスイッチ  PSP_CTRL_WLAN_UP 0x00040000
リモコン差込  PSP_CTRL_REMOTE 0x00080000
音量+     PSP_CTRL_VOLUP 0x00100000
音量-     PSP_CTRL_VOLDOWN 0x00200000
スクリーン   PSP_CTRL_SCREEN 0x00400000
♪       PSP_CTRL_NOTE 0x00800000
UMD挿入   PSP_CTRL_DISC 0x01000000
メモステ挿入  PSP_CTRL_MS 0x02000000
プログラマブルキー&特殊キー(全部のキー)

2010年04月08日 00:30 更新
「PSP_CTRL_REMOTE」はリモコン付きヘッドフォンをPSPに挿したらONになりました.
書き間違いの訂正
最初、WANと書きましたが、WLAN(無線LAN)の間違いです.ごめんなさい.
イーサネット -Wikipedia
無線LAN -Wikipedia
WAN -Wikipedia


[ ユーザーモードで読み取れるデータ ]
定義されている変数    値(16進数 32ビット)
セレクトキー  PSP_CTRL_SELECT 0x00000001
スタートキー  PSP_CTRL_START 0x00000008
十字キー上   PSP_CTRL_UP 0x00000010
十字キー右   PSP_CTRL_RIGHT 0x00000020
十字キー下   PSP_CTRL_DOWN 0x00000040
十字キー左   PSP_CTRL_LEFT 0x00000080
Lトリガー   PSP_CTRL_LTRIGGER 0x00000100
Rトリガー   PSP_CTRL_RTRIGGER 0x00000200
△ボタン    PSP_CTRL_TRIANGLE 0x00001000
○ボタン    PSP_CTRL_CIRCLE 0x00002000
×ボタン    PSP_CTRL_CROSS 0x00004000
□ボタン    PSP_CTRL_SQUARE 0x00008000
ホーム     PSP_CTRL_HOME 0x00010000
ホールド    PSP_CTRL_HOLD 0x00020000
プログラマブルキーのみ


PADの読み取りについて 今までやらなかったのは、ユーザーモードでも 音量+ とか 音量- とか WLANスイッチ などを読み取れないか試行錯誤していたからです.

で、昨日 解決したので、PSPパッド入力について一挙公開です.

PSPパッドの読み取りテストプログラム(生データ閲覧用)のダウンロード(ソース付き)
ダウンロードする
(PSPパッド読み取りテスト.7z)
通常のカーネルモード版とユーザーモード版と、特殊なユーザーモード版の3種類同梱.


【 ユーザーモードで どうやって特殊キーの読み取りを行なっているのか説明 】

カーネルモードで動作するプラグインを作り、そのプラグイン内にPSPパッドの読み取りを行なう関数を書いておき、ユーザーモードのメインコードから そのプラグインモジュールを読み込んで 関数呼び出しでPSPパッド値を得ています.

ですから、PSPパッドの特殊キー読み取り部分はカーネルモードで実行しています.
PSP-2000でも、カーネルモードのプラグインは実行可能ですよ.
解かったかな?

このソースでプラグイン初公開ですがコードはプラグイン作り勉強向けではありません.これ専用のプラグインです.
技術を色々勉強できるかと思いますので、興味ある方は挑戦してください.

今日はもう遅いので、詳しく解説するのは後日.


【 関連記事 】
PSPプログラミング PSPSDKにライブラリを追加しよう(4) DXLibP v0.5.7
PSPプログラミング DXライブラリPortable でプログラムの「核」を書く
PSPプログラミング PSPパッドの読み取り(デジタル部分)
PSPプログラミング PSPパッドの読み取り(アナログパッド部分) 戦車ゲーム紹介
PSPプログラミング DXライブラリPortable でのパッド入力 その1
PSPプログラミング DXライブラリPortable でのパッド入力 その2
PSPプログラミング DXライブラリPortable でのパッド入力 その3 OSK
PSPプログラミング DXライブラリPortable でのパッド入力 その4 アナログ系


関連記事

[edit]

CM: 14
TB: 0

page top

それでは、前回の配布物についての説明とか書きます

以前作った、イラスト鑑賞アプリでは、480x272の寸法(憂煉氏によると 512x512ぶん消費している、との事)でメモリ上に17枚までしか画像データが持てない、という事が解ったのでなるべく小さいアニメーション・セルを使ってみました。

この千早ちゃんセルは、165x272 の寸法で26枚あります。なんとかメモリに収まってヨカッタ

さて、これを PSP実機で鑑賞してみると、時々 フレーム落ちしてますが、それは透過情報ありのPNG画像を、背景画像とORで合成して貼り付ける処理をしているのが主な原因の一つだと思われます。

千早ちゃんセルを描画している処理は、これなので、↓↓
> int DrawGraph( X座標, Y座標, 画像のハンドル, 透過フラグ);
「透過フラグ」を FALSE にするともうチョイ描画速度が速くなってフレーム落ちが無くなるであろうと推測されます。

よく考えると、アイドルマスターSPは3Dポリゴン処理を 物凄く頑張っているなぁと思いますよ。

アニメーションをやる場合、透過情報付きPNG画像でやるのは効率が悪いのです。
アニメーションはコマが多くなるのでなるべく小さい、1ピクセルを1バイト情報でまかなえる画像を使ってやるのが一般的です。それがスプライトを使った簡易アニメーションです。
ゲームで良く見られる、登場人物などのスプライトの、簡易アニメーション処理ですね。

例を挙げるなら、ドラクエのキャラの歩くモーションだったり、格闘ゲームの必殺技を繰り出す時の動作のモーション(波動拳のアニメーションとか)だったりします。

で、上記のアニメーションは「セルを使った、動作ごとのアニメーション」とでも言っておきましょう。


もう一つのアニメーションとは、「画面のスクロール」です。
『千早が765衣装で吹っ切れた!? PSP』の動画で、背景が ゆっくりと 左右にスクロールしているのに気付いた方も多いと思います。

同じ絵を、画面表示のタイミングでちょっとずつ右方向へ表示座標をずらしながら描画し続けると、その絵が右に流れてゆく、という錯覚を与えます。これが画面スクロールの原理です。

画面の左右スクロールの際に気を付けなくてはいけないのは、左右へ速く画面スクロールさせてしまうと、見ている人が酔っ払います、吐き気を もよおす恐れもあるのでやってはいけません、という事。


PSPのテクスチャ寸法は、最大 512x512 で、PSPの画面寸法は、480x272 ですね。それでは 512-480 = 32 で横幅が 32ピクセルしか動かせないよ~と思っている方、DXライブラリには、画像の 拡大・縮小 描画機能もあるのですよ、と言っておきます。
画像の拡大描画だと、縦・横に2倍させれば 512x512寸法のテクスチャが 1024x1024寸法であるかの様に振舞う事ができます。これは便利ですね。


おさらい

アニメーションには 2種類あります。
・フレーム毎に絵が変化するパラパラまんが的なモノ
・同一画像の連続移動によるスクロール的なモノ

まだ他にも種類があるかも知れませんので、ご存知の方、教えて下さいませ。

次回は、ドラクエのキャラの歩くモーションのアニメーションをやります。
またもや透過情報付きのPNG画像でやります。単純なサンプル物が出来るかと思います。


「続きを読む」に、『千早が765衣装で吹っ切れた!? PSP』のソースコードの簡易版を貼り付けておきます。
(閲覧の推奨ブラウザは Firefoxです)

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

[edit]

CM: 4
TB: 0

page top

PSPプログラミング RPG TEST v0.01 勇者が歩くよ 

2010/10/24
Sun. 05:55

2010/10/26
微妙にソースコード修正
READMEに著作権表記を追加


はい、今日の配布物では 勇者が足踏みするのと上下左右に向きを変える、というところまで出来ました
背景は芝生固定でスクロール無しです

ではスクショ


ソースコードは、やや難し目になりました。
めげずに解析してみて下さい。

今回からブログで配布する方式にします。

RPG_TEST_v0_01_zip.txt


ダウンロードする方は、ファイルの拡張子を ZIP にして保存・解凍して下さいね。

ソースコードの解説は次回やります。 質問も受け付けます。
興味ある方は、是非解析してみて下さい。


First Seed Materialさんの配布素材を使わせて貰っています。感謝です。

DXライブラリPortable も使用しています。憂煉さんありがとう。


関連記事

[edit]

CM: 2
TB: 0

page top

はい、解説です

素材は 標準PSPで表示・再生できるフォルダに入れてますでしょうか。
このRPGはまだ開発中なので、素材は EBOOT.PBP と別フォルダが良いと判断してます。

【 今回は、勇者の描画方法についてだけ解説 】
勇者は、上下左右の4方向に3パターンで合計12枚のキャラ絵を使用しています。
配布素材はDXライブラリPortable でも扱いやすい構成になっていましたので、勇者の絵は 背景を透過させただけで殆ど弄っていません。

勇者の絵は、308行目で読み込んでいます。
> LoadDivGraph( GRPH_HERO ,12,3,4,32,48,&HDL_Graph_Hero[0][0]);
↑これです。画像の分割格納読み込みをやっています。
これは、全部で画像を12個に分割し、横3列、縦4行、横幅32ピクセル、縦幅48ピクセルにして、その分割した画像のハンドルを、二次元配列HDL_Graph_Hero に順番に格納させる命令です。

&HDL_Graph_Hero[0][0] は配列の先頭のポインタですよ

注意:画像の分割数は最低でも1です。うっかり0にすると実行時に挙動がおかしくなります。コンパイルエラーにはならないので十分気を付けて下さい。

    

配布されているこの絵ですが、どう扱えば良いか?
縦は「向き」ですね。向きの定義はこれです。32行目からの部分。

#define MUKI_SHITA   0 // 下向き
#define MUKI_HIDARI  1 // 左向き
#define MUKI_MIGI   2 // 右向き
#define MUKI_UE    3 // 上向き


横は「パターン絵」とでも言いましょうか。どこで「モーション絵」になるように定義をしているかと言うと、59行目です。
> int PIC_Walk_Step[4] = { 1,0,1,2 };
↑この数値は、モーション絵のパターン番号の定義です。「Hero_Step」という変数を1ずつカウントして足踏みを実現しています。
「0,1,2,3,0,1,2,3,…」に対応させて「1,0,1,2,1,0,1,2,…」という数値を導けるようにしています。こういうのは変数に入れて定義しておけば簡単に処理できます。

勇者の表示(描画)は、198行目の
> DrawGraph( 224,104,HDL_Graph_Hero[Hero_MUKI][ PIC_Walk_Step[(Hero_Step>>4)] ],TRUE );
です。
PIC_Walk_Step[(Hero_Step>>4)] の (Hero_Step>>4) は何かと言うと Hero_Step÷16 の商を求める計算式の高速版です。2の4乗16ですから。
16で割っている理由は、足踏みのアニメーション絵の切り替え速度が そのままのHero_Stepの値 では早すぎたからです。
つまり、16/60秒(約 0.3秒)ごとに1枚ずつ、足踏みのアニメーション絵の切り替えをやっているのです。
1モーションに4枚の絵を使っていますので、16/60秒×4倍=64/60秒(約 1.1秒)かかる、という計算になります。

Hero_Step のカウントは 189行目の
> Hero_Step = (++Hero_Step)&(63);
↑これです。増加させたあとの&(63)は、カウンタの周期が1モーション=64フレーム(16フレーム×4パターン絵)だから0~63の範囲になるようにする計算式です。
63(10進数)は、0x3F(16進数)/ 00111111(2進数)です。
つまり、カウンタ値を 00111111(2進数)でマスクして値が63を越えない処理をする均一速度な高速版なのです。
解りやすく書いたら
++Hero_Step;
if(Hero_Step > 63) Hero_Step = 0;

↑こういうことです。if文は、コンパイルすると「条件分岐処理」に機械語翻訳される(アセンブル)ので真の場合と偽の場合とで処理速度が変化します。その為、スピード重視なゲームではif文の羅列はお薦め出来ません。

2進数で考える、左シフト演算や&演算は、ビット演算です。論理ビット演算と算術ビット演算があります。コンピュータが得意な技ですから覚えてくださいね。論理ビット演算は ふつう unsigned数値でやります。算術ビット演算は符号付き数値でやります。

シフト演算については過去記事をおさらいして下さい


背景の描画方法は、解説要らないと判断しましたので省略。

次回は、マップチップを使った背景の実装とスクロール実装をやります。


続きを読むに、RPG_TEST_v0.01 の全ソースコードを貼り付けてあります。以後、必要箇所だけソースコード掲載します。
閲覧推奨ブラウザは、FireFoxです(行番号も表示されるので)。


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

[edit]

CM: 0
TB: 0

page top

DXライブラリPortable v0.5.7 UTF8コード版 を使ってプログラムを書くときに使える雛形です.
これに肉付けをしてゆくと何かのプログラムになります.

あとは、「千早が765衣装で吹っ切れた!?PSP」のソースコードを見て勉強していただければ何か作れるはずなのでがんばって下さい.

この雛形ソースコードでは無音の実行ファイルが作れます.
システムソフトウェア6.xx以降のPSPでは 扱える文字コードがUNICODEのみで シフトJISコードは廃止 なので、DXライブラリPortable v0.5.7 UTF-8版を使用して文字描画をする事を推奨します


まず、閲覧してください
DXLib Portable v0.5.7 UTF8コード版 での雛形(閲覧用)
http://blog-imgs-17.fc2.com/n/e/k/nekoyama2gillien/DXPLib_UTF8_hinagata.html

ダウンロードはこれです
DXLib Portable v0.5.7 UTF8コード版 での雛形(ダウンロード)
http://loda.jp/nekomune_/?id=93.zip
DXLibP_UTF8_ひながたsrc.zip


少しずつ覚えましょうね(#^.^#)

関連記事

[edit]

CM: 0
TB: 0

page top

はいはい、ショートプログラムを作りました

画像のスライドショウ+イントラフォント文字列表示
の2機能だけに重点を置いた簡単なモノです

UTAUスライドショウ

ねんぷちUTAU3人衆(ねんぷちデフォ子さん、ねんぷち重音テトさん、ねんぷち桃音モモさん)+ねんぷちミクさんの合計4人が切り替え表示されるだけです
皆さんのゲーム開発の雛形に使えるようにしております.
簡易ファイル読み込みチェッカー付き.

プログラムは長めですが、特に難しい事はしていませんので解析してみてください.
こういうのは ソースコードを少しずつ いじりながら組み方を憶えてゆけばいいです.

これはサンプルプログラムなので、実際に試してから ソースコードを見たりするのがいいと思います
> UTAUスライドショウ・ソースDXP(音無し版).zip
> http://loda.jp/nekomune_/?id=95.zip

> UTAUスライドショウ・リソース.lzh
> http://loda.jp/nekomune_/?id=94.lzh


次に、みなさんにやって頂きたいこと・・・
エラーを発生させる、ということです

「えっ?」と思われるかもしれませんが、指定された画像が入ってない場合、エラーになりますので、このプログラムだとどう処理されるのか皆さんに確かめてもらおうと思うのです

指定された画像が4枚とも入っていれば、正常に動作します。
しかし、画像を含めて自作ソフトを配布したとしても、必ずしも画像をちゃんと入れて遊んでくれる人ばかりではありませんので、画像が足りないときの対策をしておくべきだという事です

そのための、「簡易エラーチェック機能」という処理なのです


ソースコード閲覧はこれを
http://blog-imgs-17.fc2.com/n/e/k/nekoyama2gillien/DXP_UTF8_sample_UTAU_Slideshow_No_Sound.html




このプログラムを作るにあたり、エナメル・ハッチP様が制作された、MikuMikuDance用のねんどろいど風PMDモデル達を使わせて頂き、MikuMikuDanceにてポーズを付けて撮影した画像を配布物に含めています。
エナメル・ハッチ様のブログ ・・・ 現在、新装開店準備で閉鎖中です
-enamel toy box-





関連記事

[edit]

CM: 2
TB: 0

page top

はいはい、ショートプログラムを作りました
以前の「UTAUスライドショウ」に、音声ファイルがない場合のメッセージ表示機能を追加しました

画像のスライドショウ+イントラフォント文字列表示+音楽再生
の3機能だけに重点を置いた簡単なモノです

UTAUスライドショウ


音楽を再生しつつ、ねんぷちUTAU3人衆(ねんぷちデフォ子さん、ねんぷち重音テトさん、ねんぷち桃音モモさん)+ねんぷちミクさんの合計4人が切り替え表示されます.
皆さんのゲーム開発の雛形に使えるようにしております.
簡易ファイル読み込みチェッカー付き.

プログラムは長めですが、特に難しい事はしていませんので解析してみてください.
こういうのは ソースコードを少しずつ いじりながら組み方を憶えてゆけばいいです.

このプログラムを作るにあたり、エナメル・ハッチP様が制作された、MikuMikuDance用のねんどろいど風PMDモデル達を使わせて頂き、MikuMikuDanceにてポーズを付けて撮影した画像を配布物に含めています。
エナメル・ハッチ様のブログ ・・・ 現在、新装開店準備で閉鎖中です
-enamel toy box-

またもや「アルプス一万尺」を使っていますが、著作権が消滅している楽曲だから配布物に含んでも良いのです.
音楽をやっている方に依頼して演奏してもらった楽曲なのです.

この画像ファイルや音声ファイルについての著作権については配布物の中に書いてあります


ありか
ソースコード閲覧(ソースを見て、覚えて作る人とか)
http://blog-imgs-17.fc2.com/n/e/k/nekoyama2gillien/DXP_UTF8__UTAU_Slideshow_NEO.html

UTAUスライドショウNEO・ソースDXP.zip
http://loda.jp/nekomune_/?id=96

UTAUスライドショウ・リソース.lzh(まだDLしてない方のみ)
http://loda.jp/nekomune_/?id=94


音声ファイルが無い場合、あるメッセージが追加表示されます
どう違うのか実験してみてくださいね


関連記事

[edit]

CM: 0
TB: 0

page top

はい、「PSPプログラミング RPG TEST v0.01 勇者が歩くよ」の配布物をシステムソフトウェア6.XX以降に対応させる事からやってみました。なんかWARNINGでてたね、v0.01 のソースコード
自力で6.XX対応できた方、おめでとう!

勇者が足踏みするのと上下左右に向きを変える、というところは更新無し
背景は芝生固定でスクロール無しです

RPG_TEST_v001ss.png


ソースコード閲覧
http://blog-imgs-17.fc2.com/n/e/k/nekoyama2gillien/DXP_UTF8__RPG_TEST_v0_02.html

ソースコードDL
http://loda.jp/nekomune_/?id=98


First Seed Material
さんの配布素材を使わせて貰っています。感謝です。

DXライブラリPortable も使用しています。憂煉さんありがとう。

更新履歴
v0.02
・日本語ファイル名を半角英数文字に変更した
・ソースコードを改善した。命令行数の長かった関数を、関数分割化して行数を短くした
・音声ファイルが無い場合、音声ファイルが無いことを表示するようにした
・エラー表示の際のメッセージ表示位置(座標)を変更
関連記事

[edit]

CM: 0
TB: 0

page top

はい、NCDZPSPの改造制作の時に勉強した、スクリーンショットを撮影する為の関数を公開

これは PSPSDK のサンプルソースコードとネットで見付けた記事をミックスさせたコードです
まぁ、BSDライセンスでいいでしょうと。


スクリーンショット関数のソースコードを見る
http://blog-imgs-17.fc2.com/n/e/k/nekoyama2gillien/ScreenShot.html


JPEGって画像全体で圧縮するのですが、PNGって水平ライン単位で圧縮するのだな、と分かるでしょう。
皆さんの制作ゲームにもスクショ機能付け足してみるとか

次回は、スクリーンショットPNG撮影プラグインでも作ってみようかな?
関連記事

[edit]

CM: 4
TB: 0

page top


h o m e |


 

2019-06