とりあえず今回はフレームバッファーを使ってみようかなぁと とりあえずサンプルのcomplex2Dにフレームバッファーの説明があったので 大切そうなところだけ。
videoSetMode(MODE_FB1); これがフレームバッファーモードをセットする命令みたいです。 FB…そのままですね。 これはFB「1」になってますがこれは最初で uint16* back = VRAM_A; uint16* front = VRAM_B; 定義してあるから最初にVRAM_Bの内容を映したいからかな。 ダブルバッファにしてあるためでしょう。 ということはダブルバッファにしなくていい場合は MODE_FB0でVRAM_Aを使えば楽そうですな。 次。
vramSetMainBanks(VRAM_A_LCD, VRAM_B_LCD, VRAM_C_SUB_BG, VRAM_D_SUB_SPRITE); またややこしいですなぁ。コメントにもややこしいと書いてありますし。 これは今までVramSetBankAとかの拡張版の命令かな。 今回はVRAM_B_LCDとかスプライトとか使うつもりは無いので消してみたら 引数が足りませんってエラーが出てきた。 詳細はあとで調べるとして今回はいつも通り VramSetBankA()をつかってみたところ問題なかったのでよし。 そのあとはしばらくスプライトとかよくわからないものが続きます。 とりあえずバックバッファはbackとわかっているので backに値を代入していそうなところを探します。 for(ix = 0; ix < SCREEN_WIDTH; ix++) { back[ix + SCREEN_WIDTH * (SCREEN_HEIGHT - 1)] = rand()& 0xFFFF; back[ix + SCREEN_WIDTH * (SCREEN_HEIGHT - 2)] = rand()& 0xFFFF; } ふつうに書き込めばいいみたいだ。 back[書き込みたいy座標*SCREEN_WIDTH+書き込みたいx座標]=RGB15(色); でかけました。
割り込みとかなんだかいろいろ有るけどとりあえずパス。 で、書くだけなら下のプログラムでいけるはず… と思ったんだけど、上の画面がちらちらしてる。 まるで垂直同期を思いっきり無視したかのよう…っていうか無視しているのだが
なるほど。ここで割り込みが必要になるのか。 swiWaitForVBlank();がそれっぽいですな。 明日試してみよう
下のコードにあるlineとclsは僕が勝手に作った関数です。 線を引く関数と画面を消す関数。 他でも使えそうなので何となく別ファイルにまとめてみた。 ダウンロードは http://www.mlxt.com/blog/software/ml_graph.h
#include "nds.h" #include "stdio.h" #include "nds/arm9/console.h" #include "ml_graph.h"
static int bak_x, bak_y;
int main(void) { int x,y,t; uint16 keysPressed; powerON(POWER_ALL); videoSetMode(MODE_FB0); vramSetBankA(VRAM_A_LCD);
videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetBankC(VRAM_C_SUB_BG);
SUB_BG0_CR = BG_MAP_BASE(31); BG_PALETTE_SUB[255] = RGB15(31,31,31); consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(31), (u16*)CHAR_BASE_BLOCK_SUB(0), 16);
cls(VRAM_A,RGB15(31,31,31)); while(1) { x=IPC->touchXpx; y=IPC->touchYpx; iprintf("\x1b[2J"); iprintf("(X,Y)=(%d,%d)",x,y); if (x!=0){ if (bak_x==0){ bak_x=x; bak_y=y; } line (bak_x,bak_y,x,y,VRAM_A,RGB15(0,0,0)); bak_x=x; bak_y=y; }else{ bak_x=0; bak_y=0; } for(t=0;t<10000;t++); t=0; } return 0; } | |