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

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

点を打つ、という処理は、(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です。


/**   main.c から部分抜粋して表示   **/

/*****************************************************************************
* sub1 3桁の数値を表示するのだ!!
*****************************************************************************/

void num_display(int x,int y,int num)
{
int i1,i2,i3;
unsigned char c1[2],c2[2],c3[2];
i1 = (int)(num/100); // 100 の位
num -= i1*100;
i2 = (int)(num/10); // 10 の位
num -= i2*10;
i3 = (num % 10); // 1 の位

c1[0]=0x30+(unsigned char)i1; c1[1]=0; // 文字列に変換
c2[0]=0x30+(unsigned char)i2; c2[1]=0; // 文字列に変換
c3[0]=0x30+(unsigned char)i3; c3[1]=0; // 文字列に変換

mh_print(x ,y,c1 , WHITE); // 100の位 表示
mh_print(x+ 6,y,c2 , WHITE); // 10の位 表示
mh_print(x+12,y,c3 , WHITE); // 1の位 表示
}

/*****************************************************************************
* sub2 十字キー操作でドットを移動するのだ!!
*****************************************************************************/

void move_dot()
{
int x = 128; // ドットのX座標(初期値 128)
int y = 80; // ドットのY座標(初期値 80)
int step=16; // ドットの移動間隔(初期値16ドット単位)
int yy;
unsigned long fill_color=DARKBLUE; // 画面塗りつぶし色コード
unsigned char *vptr0; // V-RAMアドレスのポインタ用

while(1) // 無限ループ(Rトリガー押しで抜けられます)
{
pgFillvram(fill_color); // ← pg.c にあります / 画面を塗りつぶし

vptr0 = pgGetVramAddr(x,y);
*(unsigned long *)vptr0 = WHITE; // 白色でドット打ち

yy=(y>136)?68:170; // mh_printの y座標を求めています(ドットの位置で変化します)

mh_print( 0, yy ,"ドットの移動間隔= ドット単位 ○ボタン押しで変化。",YELLOW);
mh_print( 0, yy+16,"ドットの座標( , ) ×ボタン押しで背景色が変化。" , PINK);
mh_print( 0, yy+32,"じゅうじキー操作でドットが移動。Rトリガー押しで終了。", SKYBLUE);
num_display(108,yy ,step); // ドットの移動間隔step の値を表示する
num_display( 78,yy+16,x); // ドットの 座標x の値を表示する
num_display(102,yy+16,y); // ドットの 座標y の値を表示する

pgScreenFlipV();

readpad();
switch(new_pad)
{
case CTRL_RTRIGGER: // Rトリガー押しの場合
return; // リターン( While(1)のループから脱出します )
break;

case PSP_CTRL_CIRCLE: // ○ボタン押しの場合(ドットの移動間隔を変更)
switch(step)
{
case 8:
step=16;
break;
case 16:
step=32;
break;
case 32:
step=64;
break;
case 64:
step=1;
break;
case 1:
step=2;
break;
case 2:
step=4;
break;
case 4:
step=8;
break;
}
break;

case PSP_CTRL_UP: // ↑キー押しの場合
y -= step; // y座標をマイナスする
if(y<0) // y座標 が 上端未満なら
y=0; // y座標を 上端 にする
break;

case PSP_CTRL_DOWN: // ↓キー押しの場合
y += step; // y座標をプラスする
if(y>(SCREEN_HEIGHT-1)) // y座標 が 下端を越えるなら
y=SCREEN_HEIGHT-1; // y座標を 下端 にする
break;

case PSP_CTRL_LEFT: // ←キー押しの場合
x -= step; // x座標をマイナスする
if(x<0) // x座標 が 左端を越えるなら
x=0; // x座標を 左端 にする
break;

case PSP_CTRL_RIGHT: // →キー押しの場合
x += step; // x座標をプラスする
if(x>(SCREEN_WIDTH-1)) // x座標 が 右端 を越えるなら
x=SCREEN_WIDTH-1; // x座標を 右端 にする
break;

case PSP_CTRL_CROSS: // ×ボタン押しの場合(画面塗りつぶし色チェンジ)
switch(fill_color)
{
case DARKBLUE:
fill_color=BROWN;
break;
case BROWN:
fill_color=BLACK;
break;
case BLACK:
fill_color=PURPLE;
break;
case PURPLE:
fill_color=DARKGREEN;
break;
case DARKGREEN:
fill_color=DARKBLUE;
break;
}
break;

default :
break;
}
}
}

/*****************************************************************************
* main
*****************************************************************************/

int main(int argc,char **argv)
{
setupCallbacks();
/* Gu初期化 */
sceGuInit();
sceGuStart(GU_DIRECT, list);
sceGuDrawBuffer(GU_PSM_8888, SCRBUF0, BUF_WIDTH);
sceGuDispBuffer(SCR_WIDTH, SCR_HEIGHT, SCRBUF0, BUF_WIDTH);
sceGuFinish();
sceDisplayWaitVblankStart();
sceGuDisplay(GU_TRUE);

sceCtrlSetSamplingCycle(0);// パッドの初期化
pgScreenFrame(2,0); // 表示画面と描画画面を独立させる

move_dot(); // ドットが移動するサブルーチンでっす。

sceKernelExitGame();
return 0;
}
関連記事
スポンサーサイト

[edit]

CM: 1
TB: 0

page top

この記事に対するコメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

# |  | 2009/06/15 18:29 * edit *

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/96-1b1091f5
この記事にトラックバックする(FC2ブログユーザー)

page top


h o m e |


 

2017-11