--/--/--

スポンサーサイト

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

C++で時計

時計20120823

C++とDXライブラリで時計作ってみたよ!
ポイントは短針が17時30分とかで
5時と6時の間にあるところだよ!
今までウィンドウ最小化すると動作停止するバグがあったけど
ScreenFlipていう関数が原因だったみたい!


需要のほどは不明ですが以下ソースコード









#include "DxLib.h"

#define _USE_MATH_DEFINES
#include

#include

#define WHITE GetColor(255,255,255)

#define CENTER_X 320
#define CENTER_Y 240
#define RADIUS 200

int Key[256];

int gpUpdateKey(){
char tmpKey[256];
GetHitKeyStateAll( tmpKey );
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){
Key[i]++;
} else {
Key[i] = 0;
}
}
return 0;
}

int Loop(){
ScreenFlip();
return ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0;
}


class Point{
public:
int x,y;
};

class Plate{
public:
Point p[12];
Plate(){
int i;
for(i=0;i<12;i++){
p[i].x=(int)(-cos(M_PI*i/6.0+M_PI/2.0)*RADIUS+CENTER_X);
p[i].y=(int)(-sin(M_PI*i/6.0+M_PI/2.0)*RADIUS+CENTER_Y);
}
}
};

class Hand{
public:
Point p;
int type;
Hand(){
type=0;
p.x=0;p.y=0;
}
void SetType(int t){
type=t;
}
};

class Clock{
public:
Plate p;
Hand s;
};

class Drawer{
public:
void draw(Plate p){
int i;
for(i=0;i<12;i++){
int j=i;
if(j==0)j=12;
DrawFormatString(p.p[i].x,p.p[i].y,WHITE,"%d",j);
}
}
void draw(Hand *h){
int t;
t=h->type*2+1;
DrawLine(CENTER_X,CENTER_Y,h->p.x,h->p.y,WHITE,t);
}
};

class Synchronizer{
time_t timer;
struct tm *t_st;
public:
void Synchronize(Hand *h){
time(&timer);
t_st=localtime(&timer);
int a;
double b;
int len;
if(h->type==0){
a=t_st->tm_sec;
b=30.0;
len=RADIUS*0.8;
h->p.x=(int)(-cos(M_PI*a/b+M_PI/2.0)*len+CENTER_X);
h->p.y=(int)(-sin(M_PI*a/b+M_PI/2.0)*len+CENTER_Y);
}
else if(h->type==2){
a=t_st->tm_hour;
b=6.0;
len=RADIUS*0.4;
h->p.x=(int)(-cos(M_PI*a/b+M_PI/2.0+M_PI*t_st->tm_min/360)*len+CENTER_X);
h->p.y=(int)(-sin(M_PI*a/b+M_PI/2.0+M_PI*t_st->tm_min/360)*len+CENTER_Y);
}
else if(h->type==1){
a=t_st->tm_min;
b=30.0;
len=RADIUS*0.7;
h->p.x=(int)(-cos(M_PI*a/b+M_PI/2.0)*len+CENTER_X);
h->p.y=(int)(-sin(M_PI*a/b+M_PI/2.0)*len+CENTER_Y);
}
}
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////

void Main(){
Plate p;
Drawer d;
Synchronizer s;
Hand *hs,*hm,*hh;
hs = new Hand();
hs->SetType(0);
hm = new Hand();
hm->SetType(1);
hh = new Hand();
hh->SetType(2);
while(Loop()){
s.Synchronize(hs);
s.Synchronize(hm);
s.Synchronize(hh);
d.draw(p);
d.draw(hs);
d.draw(hm);
d.draw(hh);
}
}

////////////////////////////////////////////////////////////////////////////////////////////////////

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode(TRUE);
SetAlwaysRunFlag(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
Main();
DxLib_End();
return 0;
}

コメント

非公開コメント

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