ページ 11

DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 22:11
by ゴルスラ
DXライブラリで時刻表示を作ってみたのですが、時刻は表示されるのですが、clsDx();で毎回消しているはずなのに、何故か重なって表示されます。
どうすればいいでしょうか?
回答、お願いしますm(__)m

ソースコード:

#include "DxLib.h"
#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ){ return -1; }

DATEDATA Date; //時間データ

for(;;){
if( ProcessMessage() == -1 ){ break ;}
clsDx();
SetDrawScreen(BACK);
GetDateTime( &Date ) ; //時間取得
printfDx("現在時刻:%d年%d月%d日、%d時%d分%d秒",Date.Year,Date.Mon,Date.Day,Date.Hour,Date.Min,Date.Sec);
ScreenFlip();
}

DxLib_End();
return 0;
}

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 22:19
by nns
とりあえずSetDrawScreenは最初の1回だけでいいのでは?

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 22:42
by ookami
#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)
↑これですと、1行目のは無効になりますね。2行目のも意図どおりには行かないです。

SetDrawScreen(FRONT)でも
SetDrawScreen(BACK)でも
SetDrawScreen(hoge)でも
SetDrawScreen(DX_SCREEN_FRONT)に展開されます。

さじ加減の迷うところですが、私ならこの場合はdefineを使わないです。

あと、未確認ですがprintfDxではなくDrawStringFで試してみてください。 画像

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 23:01
by ゴルスラ
nnsさん、ookamiさん、お早い回答有難うございます。
#defineの所ですが、どうすればいいのでしょうか?
また、DrawStringFがなかったようなので、DrawFormatStringかな?とおもって、こっちでやりました。
ですが、まだ正しく表示されません。
また、よろしくお願いします。
ソースコード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ){ return -1; }

DATEDATA Date; //時間データ

SetDrawScreen(DX_SCREEN_BACK);
for(;;){
if( ProcessMessage() == -1 ){ break ;}
clsDx();
GetDateTime( &Date ) ; //時間取得
DrawFormatString(0,0,GetColor(255,255,255),"現在時刻:%d年%d月%d日、%d時%d分%d秒",Date.Year,Date.Mon,Date.Day,Date.Hour,Date.Min,Date.Sec);
ScreenFlip();
}

DxLib_End();
return 0;
}

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 23:28
by ideyan
ClearDrawScreen()
を使ってバックバッファを初期化してみてはどうですか?

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 23:39
by ookami
> rawFormatStringかな?
す、すみません(汗) それです。余計な手間をおかけしてしまいました。

#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)
↑この2行を消して、メインループの中の
SetDrawScreen(BACK)

SetDrawScreen(DX_SCREEN_BACK)
に変えます。

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月01日(土) 23:46
by ゴルスラ
>>ideyanさん
ClearDrawScreen();ですが、時刻の表示はできますが、背景画像とか、文とかが全部消えてしまうので使えません。

>>ookamiさん
ということは、SetDrawScreen(BACK);
と短縮して書くことはできないということでしょうか?

#define DrawStringF DrawFormatString
↑のようなのは大丈夫でしょうか?:DrawStringF("表示"); 画像

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月02日(日) 00:05
by ideyan
printfDx()はバッファ(?)に文字をためていき、
ScreenFlip()をするときに一気に描画するとリファレンスにあります。
clsDx()で消えるのはこのバッファに溜まっている文字です。

ClearDrawScreen()を使わない場合、バックバッファには前回描画したものが
そのまま残っています。
DrawFormatString()を使うにせよ、printfDx()を使うにせよ、
クリアせずに前回の描画の上から違う文字列を書いているだけなので
文字は重なって当然です。

>背景画像とか、文とかが全部消えてしまうので使えません。
背景画像とか文も毎回描画しなおしじゃダメですか?

全部描画しなおすのがどうしても嫌だというなら、
時計を表示してる場所の背景部分を黒で塗り潰すとか、専用の画像を用意するなりして
その部分だけでも毎回描画するという方法もあるかと思います。

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月02日(日) 00:12
by ookami
背景画像の表示はどこで(ループの外で?)やってるのでしょうか?


> SetDrawScreen(BACK);
と短縮して書きたい場合は、
int BACK=DX_SCREEN_BACK;

とするか、

#define BACK DX_SCREEN_BACK

ですかね。BACKという名前が他でかぶのを避けるために、ちと曲解ですが

#define SETDRAWSCREENBACK() SetDrawScreen(DX_SCREEN_BACK)

として

SETDRAWSCREENBACK();

と使うか。()はなくてもいいですが。

>#define DrawStringF DrawFormatString
>↑のようなのは大丈夫でしょうか?
大丈夫です。

えぇと…私の理解では↓
■defineのパラメータの例

#define a(b) A(b)
a(hoge) → A(hoge) に展開。bをhogeに置換。

#define a(b) A(B)
a(hoge) → A(B) に展開。b がないので置換がない。

Re:DXライブラリの時刻表示で、うまくいきません

Posted: 2010年5月02日(日) 00:16
by ゴルスラ
>>ideyanさん
最終的にはやっぱりめんどくさい方法をとらなければいけないんですね^^;

>>ookamiさん
intを使ってみます。

返信ありがとうございました^^
最終的にはすべて再描写することにしました。

popenによる通信

Posted: 2010年5月13日(木) 17:52
by ほげほげ
送信側から受信側へ文字列を送信し,表示させたいんですけど,うまくいきません.
環境はmacのxcodeです.
よろしくお願いします.

受信側 (popen_test)

int main (int argc, char * const argv[/url]) {
while(1){
if(!feof(stdin)){
char a[10];
fread(a,sizeof(char),5,stdin);
printf("%s",a);
}

}
return 0;
}

送信側
int main (int argc, char * const argv[/url]) {
FILE *gid=popen("./popen_test","w");
while(1){
fwrite("abc",sizeof(char),5,gid);
sleep(1);
}
return 0;
}

Re:popenによる通信

Posted: 2010年5月13日(木) 18:19
by たかぎ
> うまくいきません.

どうなることを期待し、どううまくいかないのでしょう?

Re:popenによる通信

Posted: 2010年5月13日(木) 19:46
by ほげほげ
送信側から受信側へ文字列を送信し,表示させたいんです.
送信側の実行ファイルからpopenで受信側の実行ファイルを呼び出してfwriteで送信側から文字列データを送信する度に受信側でデータを取得することができるのを目指しています.
その間受信側のプロセスは終了しないようにしたいのですが,どうすればいいですか?現段階ではfwrite,freadが全く機能していない様子です.反応がありません.

Re:popenによる通信

Posted: 2010年5月13日(木) 20:09
by たかぎ
一通り送信し終わって、パイプをクローズしたときに受信が行われます。

Re:popenによる通信

Posted: 2010年5月13日(木) 21:25
by Poco
fwrite()の後で、fflush()をしてみては?

Re:popenによる通信

Posted: 2010年5月13日(木) 22:52
by ほげほげ
fflush
を入れましたが,うまくいきませんでした.
方法は問いませんが何かこの問題を解く方法はないでしょうか?


送信側から受信側へ文字列を送信し,表示させたいんです.
送信側の実行ファイルから受信側の実行ファイルを呼び出して送信側から文字列データを送信する度に受信側でデータを取得することができるのを目指しています.その間受信側のプロセスは終了しません.

Re:popenによる通信

Posted: 2010年5月14日(金) 00:10
by Poco
popenではなく、より低レベルのAPI(含むシステムコール)を使用してみては?
pipe, fork, exec*辺りを使用することをお勧めします。

#マック持ってないんで、外していたらゴメンナサイ。

Re:popenによる通信

Posted: 2010年5月14日(金) 00:13
by たかぎ
> popenではなく、より低レベルのAPI(含むシステムコール)を使用してみては?

その方がよいと思います。