ページ 11

時間の取得について

Posted: 2013年2月14日(木) 00:14
by ZEROXX
こんばんは、何度かこの掲示板を利用させてもらっているものです。
今回もわからないところがあったので質問させていただきます。
自分でも調べてみたんですが結局やり方がわからなかったので
掲示板を利用させていただきました。

if,for,while,関数,変数など基礎的な事は理解しているつもりです。
コンソールで色々とプログラムを作ったりもしているので、全くの初心者ではありません。

質問内容
最近ゲームを作っているんですが、セーブ機能のところで躓きました。
前セーブした時間とLvを画面に表示して、分かりやすくしたかったのですが、
時間の表示がうまく表示できません。

ここで質問なのですが、時間をリアルタイムで画面に表示するのではなくて、
マウスでボタンをクリックした時の時間を取得して、止まった状態の時間を取得するのには
どうすれば良いのでしょうか?

コード:

time_t t;
time_t FFF;
time_t GDS,SSK,GPSD;
time_t  time(time_t *timer);
time_t ppp1,ppp2,ppp3;

//時間取得
SSK=time(&t);
FFF=SSK%60;
SSK-=FFF;
SSK=SSK/60;

GDS=SSK%60;
SSK-=GDS;
SSK=SSK/60;

GPSD=SSK%24-3;
ppp1=GPSD;
ppp2=GDS;
ppp3=FFF;

DrawFormatString(35,140,Cr7,"%d:",ppp1);
DrawFormatString(55,140,Cr7,"%d:",ppp2);
DrawFormatString(85,140,Cr7,"%d",ppp3);

※Cr7=GetColor(255,255,255);//白 のことです。
上述したプログラムは、時間を計算するプログラムです。
プログラム自体が長いので、時間の部分のみ表示します
※プログラム自体は、正常に動作しています。
環境
Windows 7 64bit ,Microsoft Visual C++ 2010 Express,DxLib

Re: 時間の取得について

Posted: 2013年2月14日(木) 01:58
by ZEROXX
補足しておきます。
ボタンの処理は、理解できていてswitch命令とfor文、そしてマウスの状態取得の方は
できますが、上に書いたのには書いていません。

コード:

if(( GetMouseInput() & MOUSE_INPUT_LEFT )!=0){
for(int oi=0;oi<=7;++oi){
	switch(oi){
case 1:
if(posX<=600&&posX>=15&&posY<=180&&posY>=60){
DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv);
Data1=1;My_Lv1=My_Lv;//データがあるかどうかのフラグ、レベルのデータ保存用の変数に変換


ppp1=GPSD;
ppp2=GDS;
ppp3=FFF;
pppP=1;
	fstream file;
	file.open("セーブデータ/セーブデータ1.txt", ios::out);
	if(! file.is_open()){
	return EXIT_FAILURE;
	}
      ・・・
	file.close();
    }
	break;
・・・
補足
四角いボタンの上にマウスカーソルを載せている状態の時は、ボックス(ボタン)を青く表示して表示し
ボックスがクリックされた時に、データを保存し、保存されたLvとその時の時刻を表示すると言うものです。
今回問題になったのは、この時にどのようにしてクリックした瞬間の時刻をメモ帳に記憶して、
押した瞬間の時刻データをボックスに文字として表示したいのだけどもどうしたら良いのか?
というものです。

time_tにて、変数を使うことができますが、全てが連動しているため
ボタンを押した瞬間の時刻データを変数に置いておくことができない為
これをどのように解決したら良いのかをどうか教えていただけると幸いです。

Re: 時間の取得について

Posted: 2013年2月14日(木) 02:11
by h2so5
プログラムの構造がどうなっているのかよく分かりません。2行目のループにはなんの意味があるんでしょうか。
  • 変数の名前をいい加減に付けないようにしましょう。ppp1とかFFFとか意味不明です。
  • インデントを揃えてください。

Re: 時間の取得について

Posted: 2013年2月14日(木) 02:28
by ZEROXX
h2so5さん返信ありがとうございます。
色々とバラバラですみません。

• 変数の名前をいい加減に付けないようにしましょう。ppp1とかFFFとか意味不明です。
すみません、後で変えたいと思います。

• インデントを揃えてください。
すみません、気をつけます。

コード:

time_t t;
time_t FFF;
time_t GDS,SSK,GPSD;
time_t  time(time_t *timer);time_t ppp1,ppp2,ppp3;
・・・(この間、省略します)
//時間取得
SSK=time(&t);
FFF=SSK%60;
SSK-=FFF;
SSK=SSK/60;

GDS=SSK%60;
SSK-=GDS;
SSK=SSK/60;

GPSD=SSK%24-3;

ppp1=GPSD;
ppp2=GDS;
ppp3=FFF;

//マウスポインタの座標を取得
GetMousePoint( &posX, &posY );

for(int il=0;il<=3;++il){
switch(il){
case 1:
if(posX<=600&&posX>=15&&posY<=180&&posY>=60){
if(Data1==0){DrawBox(15,60,600,180,Cr8, TRUE ) ;
DrawString( 259 , 105, "Not Data" , Cr7 );}
if(Data1==1){DrawBox(15,60,600,180,Cr8, TRUE ) ;
DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv1);

DrawFormatString(35,140,Cr7,"%d:",ppp1);
DrawFormatString(55,140,Cr7,"%d:",ppp2);
DrawFormatString(85,140,Cr7,"%d",ppp3);

}
}
break;
case 2:
if(posX<=600&&posX>=15&&posY<=350&&posY>=230){
if(Data2==0){DrawBox(15,230,600,350,Cr8, TRUE ) ;
DrawString( 259 , 275, "Not Data" , Cr7 );}
if(Data2==1){DrawBox(15,230,600,350,Cr8, TRUE ) ;
DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv2);
}
}
break;
case 3:
if(posX<=600&&posX>=15&&posY<=520&&posY>=400){
if(Data3==0){DrawBox(15,400,600,520,Cr8, TRUE ) ;
DrawString( 259 , 445, "Not Data" , Cr7 );}
if(Data3==1){DrawBox(15,400,600,520,Cr8, TRUE ) ;
DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv3);
}
}
break;
default:
if(Data1==0){DrawBox(15,60,600,180,Cr3, TRUE ) ;
DrawString( 259 , 105, "Not Data" , Cr7 );
}
if(Data2==0){DrawBox(15,230,600,350,Cr3, TRUE ) ;
DrawString( 259 , 275, "Not Data" , Cr7 );
}
if(Data3==0){DrawBox(15,400,600,520,Cr3, TRUE ) ;
DrawString( 259 , 445, "Not Data" , Cr7 );
}
if(Data1==1){DrawBox(15,60,600,180,Cr3, TRUE ) ;
DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv1);

DrawFormatString(35,140,Cr7,"%d:",ppp1);
DrawFormatString(55,140,Cr7,"%d:",ppp2);
DrawFormatString(85,140,Cr7,"%d",ppp3);
}
if(Data2==1){DrawBox(15,230,600,350,Cr3, TRUE ) ;
DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv2);
}
if(Data3==1){DrawBox(15,400,600,520,Cr3, TRUE ) ;
DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv3);
}
}
}
if(( GetMouseInput() & MOUSE_INPUT_LEFT )!=0){
for(int oi=0;oi<=3;++oi){
switch(oi){
case 1:
if(posX<=600&&posX>=15&&posY<=180&&posY>=60){
DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv);
Data1=1;My_Lv1=My_Lv;
ppp1=GPSD;
ppp2=GDS;
ppp3=FFF;

fstream file;
file.open("セーブデータ/セーブデータ1.txt", ios::out);
if(! file.is_open()){
return EXIT_FAILURE;
}
file<<My_Lv<<endl;//自分のLv
file<<NPC_Lv<<endl;//相手のLv
file<<MNY<<endl;//お金の残量
file<<My_EXE<<endl;//経験値
file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
file<<x<<y<<endl;
file<<SSTurn<<endl;
file<<Point<<endl;
file<<My_Lv1<<Data1<<endl;
file.close();
 }
break;
case 2:
if(posX<=600&&posX>=15&&posY<=350&&posY>=230){
DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv);
Data2=1;My_Lv2=My_Lv;
DrawFormatString(35,140,Cr7,"%d:",GPSD);
DrawFormatString(55,140,Cr7,"%d:",GDS);
DrawFormatString(85,140,Cr7,"%d",FFF);
fstream file;
file.open("セーブデータ/セーブデータ2.txt", ios::out);
if(! file.is_open()){
return EXIT_FAILURE;
}
file<<My_Lv<<endl;//自分のLv
file<<NPC_Lv<<endl;//相手のLv
file<<MNY<<endl;//お金の残量
file<<My_EXE<<endl;//経験値
file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
file<<x<<y<<endl;
file<<SSTurn<<endl;
file<<Point<<endl;
file<<My_Lv2<<Data2<<endl;
file.close();
}
break;
case 3:
if(posX<=600&&posX>=15&&posY<=520&&posY>=400){
DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv);
Data3=1;My_Lv3=My_Lv;
DrawFormatString(35,140,Cr7,"%d:",GPSD);
DrawFormatString(55,140,Cr7,"%d:",GDS);
DrawFormatString(85,140,Cr7,"%d",FFF);
fstream file;
file.open("セーブデータ/セーブデータ3.txt", ios::out);
if(! file.is_open()){
return EXIT_FAILURE;
}
file<<My_Lv<<endl;//自分のLv
file<<NPC_Lv<<endl;//相手のLv
file<<MNY<<endl;//お金の残量
file<<My_EXE<<endl;//経験値
file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
file<<x<<y<<endl;
file<<SSTurn<<endl;
file<<Point<<endl;
file<<My_Lv3<<Data3<<endl;
file.close();
}
break;
}
}
}
これが通しのプログラムになります。

Re: 時間の取得について

Posted: 2013年2月14日(木) 02:48
by Priest
インデントを揃えるというのはそうではなくて、こういうことです。

コード:

time_t t;
time_t FFF;
time_t GDS,SSK,GPSD;
time_t  time(time_t *timer);
time_t ppp1,ppp2,ppp3;
・・・(この間、省略します)
//時間取得
SSK=time(&t);
FFF=SSK%60;
SSK-=FFF;
SSK=SSK/60;
 
GDS=SSK%60;
SSK-=GDS;
SSK=SSK/60;
 
GPSD=SSK%24-3;
 
ppp1=GPSD;
ppp2=GDS;
ppp3=FFF;
 
//マウスポインタの座標を取得
GetMousePoint( &posX, &posY );
 
for(int il=0;il<=3;++il){
	switch(il){
	case 1:
		if(posX<=600&&posX>=15&&posY<=180&&posY>=60){
			if(Data1==0){
				DrawBox(15,60,600,180,Cr8, TRUE ) ;
				DrawString( 259 , 105, "Not Data" , Cr7 );
			}
			if(Data1==1){
				DrawBox(15,60,600,180,Cr8, TRUE ) ;
				DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv1);
 
				DrawFormatString(35,140,Cr7,"%d:",ppp1);
				DrawFormatString(55,140,Cr7,"%d:",ppp2);
				DrawFormatString(85,140,Cr7,"%d",ppp3);
			}
		}
		break;

	case 2:
		if(posX<=600&&posX>=15&&posY<=350&&posY>=230){
			if(Data2==0){
				DrawBox(15,230,600,350,Cr8, TRUE ) ;
				DrawString( 259 , 275, "Not Data" , Cr7 );
			}
			if(Data2==1){
				DrawBox(15,230,600,350,Cr8, TRUE ) ;
				DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv2);
			}
		}
		break;

	case 3:
		if(posX<=600&&posX>=15&&posY<=520&&posY>=400){
			if(Data3==0){
				DrawBox(15,400,600,520,Cr8, TRUE ) ;
				DrawString( 259 , 445, "Not Data" , Cr7 );
			}
			if(Data3==1){
				DrawBox(15,400,600,520,Cr8, TRUE ) ;
				DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv3);
			}
		}
		break;

	default:
		if(Data1==0){
			DrawBox(15,60,600,180,Cr3, TRUE ) ;
			DrawString( 259 , 105, "Not Data" , Cr7 );
		}
		if(Data2==0){
			DrawBox(15,230,600,350,Cr3, TRUE ) ;
			DrawString( 259 , 275, "Not Data" , Cr7 );
		}
		if(Data3==0){
			DrawBox(15,400,600,520,Cr3, TRUE ) ;
			DrawString( 259 , 445, "Not Data" , Cr7 );
		}
		if(Data1==1){
			DrawBox(15,60,600,180,Cr3, TRUE ) ;
			DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv1);
 
			DrawFormatString(35,140,Cr7,"%d:",ppp1);
			DrawFormatString(55,140,Cr7,"%d:",ppp2);
			DrawFormatString(85,140,Cr7,"%d",ppp3);
		}
		if(Data2==1){
			DrawBox(15,230,600,350,Cr3, TRUE ) ;
			DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv2);
		}
		if(Data3==1){
			DrawBox(15,400,600,520,Cr3, TRUE ) ;
			DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv3);
		}
	}
}
if(( GetMouseInput() & MOUSE_INPUT_LEFT )!=0){
	for(int oi=0;oi<=3;++oi){
		switch(oi){
			case 1:
				if(posX<=600&&posX>=15&&posY<=180&&posY>=60){
					DrawFormatString( 35 , 80,  Cr7,"Lv.%d",My_Lv);
					Data1=1;My_Lv1=My_Lv;
					ppp1=GPSD;
					ppp2=GDS;
					ppp3=FFF;
 
					fstream file;
					file.open("セーブデータ/セーブデータ1.txt", ios::out);
					if(! file.is_open()){
						return EXIT_FAILURE;
					}
					file<<My_Lv<<endl;//自分のLv
					file<<NPC_Lv<<endl;//相手のLv
					file<<MNY<<endl;//お金の残量
					file<<My_EXE<<endl;//経験値
					file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
					file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
					file<<x<<y<<endl;
					file<<SSTurn<<endl;
					file<<Point<<endl;
					file<<My_Lv1<<Data1<<endl;
					file.close();
				}
				break;
			case 2:
				if(posX<=600&&posX>=15&&posY<=350&&posY>=230){
					DrawFormatString( 35 , 250,  Cr7,"Lv.%d",My_Lv);
					Data2=1;My_Lv2=My_Lv;
					DrawFormatString(35,140,Cr7,"%d:",GPSD);
					DrawFormatString(55,140,Cr7,"%d:",GDS);
					DrawFormatString(85,140,Cr7,"%d",FFF);
					fstream file;
					file.open("セーブデータ/セーブデータ2.txt", ios::out);
					if(! file.is_open()){
						return EXIT_FAILURE;
					}
					file<<My_Lv<<endl;//自分のLv
					file<<NPC_Lv<<endl;//相手のLv
					file<<MNY<<endl;//お金の残量
					file<<My_EXE<<endl;//経験値
					file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
					file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
					file<<x<<y<<endl;
					file<<SSTurn<<endl;
					file<<Point<<endl;
					file<<My_Lv2<<Data2<<endl;
					file.close();
				}
				break;
			case 3:
				if(posX<=600&&posX>=15&&posY<=520&&posY>=400){
					DrawFormatString( 35 , 420,  Cr7,"Lv.%d",My_Lv);
					Data3=1;My_Lv3=My_Lv;
					DrawFormatString(35,140,Cr7,"%d:",GPSD);
					DrawFormatString(55,140,Cr7,"%d:",GDS);
					DrawFormatString(85,140,Cr7,"%d",FFF);
					fstream file;
					file.open("セーブデータ/セーブデータ3.txt", ios::out);
					if(! file.is_open()){
						return EXIT_FAILURE;
					}
					file<<My_Lv<<endl;//自分のLv
					file<<NPC_Lv<<endl;//相手のLv
					file<<MNY<<endl;//お金の残量
					file<<My_EXE<<endl;//経験値
					file<<p1.HP<<p1.SP<<p1.Striking<<p1.Defense<<p1.Velocity<<p1.SpiritualStrength<<p1.Intellect<<p1.AccuracyOfFire<<endl;//自分の設定値
					file<<p2.HP<<p2.SP<<p2.Striking<<p2.Defense<<p2.Velocity<<p2.SpiritualStrength<<p2.Intellect<<p2.AccuracyOfFire<<endl;//相手の設定値
					file<<x<<y<<endl;
					file<<SSTurn<<endl;
					file<<Point<<endl;
					file<<My_Lv3<<Data3<<endl;
					file.close();
				}
				break;
			}
		}
	}
}

Re: 時間の取得について

Posted: 2013年2月14日(木) 03:05
by ZEROXX
Priestさん返信ありがとうございます。
インデントを揃えるとは、そういうことでしたか。

独学でやっているので、色々と間違っているところや分からないところがあります。
こういう指摘は大変参考になります。 ありがとうございます。

指摘されるという事はプログラムの記述自体あんまり綺麗なものではないのでしょう、
色々と指摘されるのはとても参考になりますので良いのですが
できれば質問の方にも答えていただきたいところではあります。
見にくいプログラムですみませんが、どうか質問に対する回答を
お願い致しますm(_ _)m

Re: 時間の取得について

Posted: 2013年2月14日(木) 03:31
by Priest
ZEROXX さんが書きました: time_tにて、変数を使うことができますが、全てが連動しているため
ボタンを押した瞬間の時刻データを変数に置いておくことができない為
新たに"ボタンを押した瞬間の時刻データを変数に置いておく"用のtime_t型変数を宣言してあげればなんとかなりそうなものですけどどうなんでしょう?

C++はよくわからないので、Cの構造体で、

コード:

struct SAVEDATA {
    int Lv; // セーブ時のレベル
    time_t Time;  // セーブした時刻
};
みたいな記憶領域を作ってあげることで解決しませんか?

Re: 時間の取得について

Posted: 2013年2月14日(木) 03:37
by ZEROXX
Priestさん返信ありがとうございます。
解決出来るかどうかはわかりませんが、Priestさんの方法を試してみたいと思います。
それでも解決できない場合は、またこの掲示板を利用することにさせていただきます。
そろそろPCから離れるので、
この辺で、解決させていただきます。
皆さんありがとうございました。

Re: 時間の取得について

Posted: 2013年2月15日(金) 00:21
by ZEROXX
Priestさんが言っていたように構造体を利用したところ上手く出来ました。
ありがとうございましたm(_ _)m。