ページ 11

時計を作ろうと思っています。

Posted: 2010年6月18日(金) 18:54
by 釣り師
はじめまして、DecentLoveという者です。
まだC++を始めたばかりの初心者です。

時計を作ろうと思い立ちデスクトップに置けるシンプルな時計を作成しようと思いました。
DxLibを使い、このサイトの解説や、DxLibの本家サイトなどの関数の解説などを元に一応プログラムを書いてみたのですが、どうにもエラーが起こってしまい先へ進めません。

「ビルドエラーが~」という内容がエラー情報として表示されます。
使用しているコンパイラはVisualC++の2010です。

今、ウィンドウの適当な場所に今の年月日を表示させようとしています。

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
[
DATEDATA Date;

ChangeWindowMode(TRUE);

if(DxLib_Init() ==-1 );
[
return -1;
]

GetDateTime ( &Date) ;

DrawFormatString( 100, 100, White, "Year : Mon : Day", Year Mon Day);

DxLib_End();

return 0;
]

ここまでは書けたのですが…
どうやらどこかが間違っているみたいで…。作り方自体が根本的に間違っているのかもしれません。
どこがどう違っているのかを指摘してくだされば幸いです。

最終的には添付した画像のような物を作りたいと思っています。

どなたかアドバイス宜しくお願いします。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:05
by ookami
とりあえず[/url]を{}にするとどうなりますか?

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:10
by 釣り師
試してみましたが、エラーでした。
どこかが間違ってるみたいなんです。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:15
by ookami
エラーの内容は変わりませんでしたか?どこがエラーか特定できるくらいにまでは減っていると思います。

あと、「C++ 構造体」などで調べてみると参考になると思います。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:16
by シエル
WhiteやYear Mon Dayという変数はありません。

Year Mon DayはDate構造体のメンバですので、
Date.Year,Date.Mon,Date.Dayと呼び出す必要があります。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:16
by Dixq (管理人)
描画関数の引数の変数じゃないですか?

エラーがでたらそのエラーメッセージをかけば的確な回答が集まりやすいですよ

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:26
by シエル
超簡単サンプル作りました。
エスケープキーボタンで終了します。

一度ゲームプログラミングの館(http://dixq.net/g/)からはじめたほうがいいと思いますよ。
この13章ぐらいまでやれば、DXライブラリの基礎はある程度わかるはずです。


注意:
右上の×ボタンで終了すると、プロセスだけ残ってしまうので、エスケープキーで終了させて下さい。


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DATEDATA Date;

ChangeWindowMode(TRUE);


if(DxLib_Init() ==-1 )
return -1;

while(1){

SetDrawScreen( DX_SCREEN_BACK ) ;

ClearDrawScreen();

GetDateTime ( &Date) ;

int color;

color=GetColor(0,0,255);

DrawFormatString( 100, 100, color,"Year:%d Mon:%d Day:%d Hour:%d Min:%d Sec:%d",Date.Year,Date.Mon,Date.Day,Date.Hour,Date.Min,Date.Sec);

ScreenFlip();

if(CheckHitKey(KEY_INPUT_ESCAPE)){
break;
}


}

DxLib_End();

return 0;
}

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:27
by 釣り師
みなさん、回答ありがとうございます。
おかげでだいぶ、エラーの出る所が減ってきました。


#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DATEDATA Date;

ChangeWindowMode(TRUE);

if(DxLib_Init() ==-1 )
{
return -1;
}

GetDateTime ( &Date) ;

DrawFormatString( 100, 100, "Year : Mon : Day", Date.Year, Date.Mon, Date.Day);

DxLib_End();

return 0;
}


エラーは
error C2664: 'DxLib::DrawFormatString' : 3 番目の引数を 'const char [17]' から 'int' に変換できません。
と出てきています。
DrawFormatString( 100, 100, "Year : Mon : Day", Date.Year, Date.Mon, Date.Day);
の所のようです。(Whiteは色指定のために使っていたつもりなんですが、消しました。)

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:31
by シエル
第3引数には文字の色を指定する必要があるので、そのエラーが出ます。
ですので、

int color;

color=GetColor(0,0,255);

のように色を取得して、この変数colorを第3引数に設定してください。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:32
by 釣り師
シエルさん。

ありがとうございます!
全然僕のと違いますね。
時刻が変化するのは
while(1){
でループさせているからですよね?

ゲームプログラミングの館は、一応ある程度やったつもりだったんですが、勉強不足だったようです。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:40
by シエル
>>時刻が変化するのは
>>while(1){
>>でループさせているからですよね?
そのとおりです。

>ゲームプログラミングの館は、一応ある程度やったつもりだったんですが、勉強不足だったようです。
せめて、この辺(http://dixq.net/g/13.html)とかループの方法はもう一度
勉強しなおしたほうがよいと思います。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 19:51
by 釣り師
>せめて、この辺(http://dixq.net/g/13.html)とかループの方法はもう一度
勉強しなおしたほうがよいと思います。
そうですね。一度、関係ありそうなところは全部やり直してみようと思います。


回答してくださった皆さん。
有難うございました。
おかげで解決いたしました。

たぶん、また行き詰まって質問にくるかと思いますが、その時はまたよろしくお願いします。

本当に有難うございました。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:02
by 釣り師
解決したと言いながらすみません。

シエルさん。
サンプルで作っていただいたやつなんですが、エスケープを押しても終了されません。
何故でしょうか?
break
でループはぬけていると思うのですが…。何故なんでしょう。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:07
by シエル
ウィンドウをアクティブにしてますか?

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:09
by 釣り師
はい。
ちゃんとアクティブにしてから押しているのですが。
タスクマネージャーでは「応答なし」になってしまっています。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:15
by シエル
タスクマネージャーから強制終了させて、もう一回実行しても駄目ですか?
私の環境なら問題なく終了するのですが。。。

即席で作ったので、あんまりそのソースは参考にしないで下さい><
もっと良いコードにしたほうがいいです。

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:20
by 釣り師
何回も試したのですが、ダメでした。

>即席で作ったので、あんまりそのソースは参考にしないで下さい><
もっと良いコードにしたほうがいいです。

即席で作れるとは、すごいです!
では、このコードを参考にして、頑張って作っていこうとおもいます!

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:23
by ideyan
解決後になんですが、
ProcessMessageをループで呼び出していないので
システムが不安定になっているのでは? >サンプルの不具合

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 20:28
by シエル
>>ideyanさん
おっしゃるとおりですね。
DXライブラリはWindowsのメッセージ処理はProcessMessageが管理してくれてるんですね。楽だなぁ。
私は普段DXライブラリは一切使わないので、完全に忘れてました。
もっと勉強します!

>>DecentLoveさん
下記のURLを参考にしてみて作り直してみてください!
そうすれば、問題なく動くはずです。。。
http://dixq.net/g/14.html

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 21:10
by Dixq (管理人)
簡単にサンプル作ってみました。
詰め込み過ぎ・・?
#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
    DATEDATA Date;
    if(ChangeWindowMode(TRUE)||DxLib_Init()||SetDrawScreen(DX_SCREEN_BACK))return -1; 
    while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
        GetDateTime( &Date );
        DrawFormatString(100,100,GetColor(255,255,255),"%02d時%02d分%02d秒",Date.Hour,Date.Min,Date.Sec); 
    }
    DxLib_End();
    return 0;
}
 

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 21:12
by 釣り師
ideyanさん、シエルさん。
ありがとうございます。

今からちょっと改良してみたいと思います!

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 21:15
by Dixq (管理人)
あら、上のプログラムはちょっと解りにくすぎましたかね・・。
解りやすく書き直してみました。
上のプログラムとやってる事は同じです。ちょいとエラー処理は減りましたが
#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){

    DATEDATA Date;            //時刻を取得する為の変数
    
    ChangeWindowMode(TRUE);    //ウィンドウモードに変更する為の関数
    DxLib_Init();            //DXライブラリの初期化
    SetDrawScreen(DX_SCREEN_BACK);    //描画先を裏画面に変更(13章参照)
    
    while( CheckHitKey(KEY_INPUT_ESCAPE)==0 ){    //Escキーが押されていない間ループ

        ProcessMessage();    //メッセージ処理(これをしないと動作が不安定になるのでいつも呼ぶ物と覚えるべし)
        ClearDrawScreen();    //裏画面に書かれている物を全部消す

        GetDateTime( &Date );    //時間取得

        //文字の描画。0は0を詰めるという事。2は2スペースを使って表示するという事
        DrawFormatString(100,100,GetColor(255,255,255),"%02d時%02d分%02d秒",Date.Hour,Date.Min,Date.Sec); 

        ScreenFlip();    //裏画面に描画されている物を表に反映
    }
    DxLib_End();    //DXライブラリ終了処理
    return 0;
}
 

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 21:24
by 釣り師
Dixqさん。
ありがとうございます。
無事に動きました!


質問なんですが
ゲームプログラミングの館で
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
というコードは毎回必ず記述しなくてはならない。
とありましたが
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
こういう風に省略できるという事ですよね?

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 21:43
by Dixq (管理人)
正しくは上のように書くべきですが、C++は仮引数が省略出来るので、使わないならこちらの見やすくていいですよね。
自分でその変数を使わないなら省略する事によって起こる弊害はありません。

※書き方は以前他のトピの話題を参考にしました

Re:時計を作ろうと思っています。

Posted: 2010年6月18日(金) 22:15
by 釣り師
>正しくは上のように書くべきですが、C++は仮引数が省略出来るので、使わないならこちらの見やすくていいですよね。

なるほど、そうなんですか。
ありがとうございます、参考にさせていただきます。



それでは、そろそろこのトピも閉じさせていただこうかと思います。
みなさん、有難うございました。