日記 intime o'
バイナリ時計作る。DSで。 - NDSハック 2007/12/19(Wed.)本ソースはDevKitProのndsコンパイラでコンパイルし、作者の環境で のみ動作を確認しました。完全な動作を保証するものではありません。コンパイル済ndsプログラムのダウンロードはこちらから -000b日目-- 明日作ろう。 時間の取得の方法さえ分かれば簡単なんだが。 -001b日目-- NDS上で動くバイナリ時計を作る。 ほんとは今日の昼くらいにやる つもりだったけど忘れてた。 まずは、時間の取得。駄目元でやってみたら 問題なく#include <time.h>でいけました。#include <time.h> time_t timer; struct tm *t_st; time(&timer); t_st = localtime(&timer); iprintf("¥x1b[10;0H¥n¥n¥n¥n %d' %d'' %d¥n",t_st->tm_hour,t_st->tm_min,t_st->tm_sec);
エミュレータDeSumeで動作させると、ずっと同じ時刻を表示してたが DSLで動かすとちゃんと表示でけた。 -010b日目-- 取得した時間t_st(構造体)の中の時、分、秒を変数int h,m,sに代入する。h = t_st->tm_hour; m = t_st->tm_min; s = t_st->tm_sec;
で、このh,m,sの10の位と1の位にそれぞれわける。 1. さらにそれをh10,h1,m10,m1,s10,s1とする。 2. その6つをさらにそれぞれ二進法に分ける。 3. それを元に上画面に適当なレイアウトで表示。 とりあえず、指針はできたー。あとはそれをコードにするだけです。。 -011b日目--#include <nds.h> #include <stdio.h> #include <time.h> #include <stdlib.h> void draw(int x, int y, uint16* buf, uint16 c){ buf += y * SCREEN_WIDTH + x; uint16* line = buf; *line++ = c; } void waku(){ uint16 col = RGB15(3,3,3); int xx,yy,a,b; for(int i=0;i<6;i++){ for(int j=0;j<4;j++){ if(i==0 & (j==0 | j==1))continue; xx = (i+1)*32; yy = (j+1)*32; for(a=xx;a<xx+28;a++){ for(b=yy;b<yy+28;b++)draw(a,b,VRAM_A,col); } } } } void pika(int i,int j){ i--;j--; uint16 col=RGB15(0,31,0); int xx = (i+1)*32; int yy = (j+1)*32; for(int a=xx;a<xx+28;a++){ for(int b=yy;b<yy+28;b++)draw(a,b,VRAM_A,col); } } void kura(int i,int j){ i--;j--; uint16 col=RGB15(3,3,3); int xx = (i+1)*32; int yy = (j+1)*32; for(int a=xx;a<xx+28;a++){ for(int b=yy;b<yy+28;b++)draw(a,b,VRAM_A,col); } } int main(void) { time_t timer; struct tm *t_st; int h,m,s; int h10,h1,m10,m1,s10,s1; int k; int e1[22],e2[22],n=0; powerON(POWER_ALL); irqInit(); irqEnable(IRQ_VBLANK); videoSetMode(MODE_FB0); videoSetModeSub(MODE_0_2D | DISPLAY_BG0_ACTIVE); vramSetMainBanks( VRAM_A_LCD, VRAM_B_LCD,VRAM_C_SUB_BG , VRAM_D_LCD); 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); waku(); iprintf("¥x1b[10;0H bin.clock ver 1.22¥n (c)Kero's World¥n¥n"); while(1) { for(k=0;k<n;k++){ kura(e1[k],e2[k]); e1[k]=0; e2[k]=0; } n=0; time(&timer); t_st = localtime(&timer); iprintf("¥x1b[10;0H¥n¥n¥n¥n %2d:%2d¥'%d¥"¥n", h=t_st->tm_hour,m=t_st->tm_min,s=t_st->tm_sec); h10=h/10; h1=h%10; m10=m/10; m1=s%10; s10=s/10; s1=s%10; for(k=4;k>2;k--){ if(h10%2){pika(1,k);e1[n]=1;e2[n]=k;n++;} h10-=h10%2;h10/=2; } for(k=4;k>0;k--){ if(h1%2){pika(2,k);e1[n]=2;e2[n]=k;n++;} h1-=h1%2;h1/=2; } for(k=4;k>0;k--){ if(m10%2){pika(3,k);e1[n]=3;e2[n]=k;n++;} m10-=m10%2;m10/=2; } for(k=4;k>0;k--){ if(m1%2){pika(4,k);e1[n]=4;e2[n]=k;n++;} m1-=m1%2;m1/=2; } for(k=4;k>0;k--){ if(s10%2){pika(5,k);e1[n]=5;e2[n]=k;n++;} s10-=s10%2;s10/=2; } for(k=4;k>0;k--){ if(s1%2){pika(6,k);e1[n]=6;e2[n]=k;n++;} s1-=s1%2;s1/=2; } swiWaitForVBlank(); } return 0; }
完成。やった コンパイル済ndsプログラムのダウンロードはこちらから
コメ(0) | トラ(0)
(c)Kero's World