Dixqさんの1,2の問題の答え

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよこ

Dixqさんの1,2の問題の答え

#1

投稿記事 by ひよこ » 16年前

Dixqさん1,2の問題ができたので答えます。

[color=Tea[/url]問題
1. 画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
2. 今度は裏画面処理を使って画像を上から下に徐々に移動するだけのプログラムを書いて下さい。
3. Zキーが押されれいる間DrawStringで「押されています」と表示するプログラムを書いて下さい。(裏画面処理使う)
4. Zキーが押された瞬間一度だけ「押されました」とprintfDxで表示するプログラムを書いて下さい。(裏画面処理使う)
5. Aキーが押された瞬間一度だけドの音が鳴るプログラムを書いて下さい。(裏画面処理使う)
(管理人による記事の追加)
[/color]


1画像が徐々に下へいく
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;          //ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了 
 

        int i ;
        for(i=0;i<300;i++){
                 LoadGraphScreen( 0 , i , "char.png" , TRUE ); //画像を描画
                 Sleep(10);                                     //10ミリ秒待つ
        }


        WaitKey();              // 何かキー入力があるまで待つ
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}
2裏画面処理で画像が徐々に下へいく
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                  // ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1 ;        // DXライブラリ初期化処理


        SetDrawScreen( DX_SCREEN_BACK ) ;           // 描画先を裏画面に設定

        int i ;
        for( i = 0 ; i < 300 ; i ++ )
        {
                ClearDrawScreen();                            // 裏画面のデータを全て削除
                LoadGraphScreen( 0, i, "char.png" , TRUE ) ; //裏画面へ画像を描写
                ScreenFlip() ;                                // 裏画面データを表画面へ反映
        }


        WaitKey();              // 何かキー入力があるまで待つ
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}
これでいいでしょうか。

Dixq (管理人)

Re:Dixqさんの1,2の問題の答え

#2

投稿記事 by Dixq (管理人) » 16年前

いいですね。正解です。
でも後一歩で完璧になります。
ゲームプログラミングの館の説明が少し悪かったので13章を少し改善しました。

このプログラムは恐らく画像が移動している時にウィンドウを動かそうとしても出来ないと思います。
ProcessMessageという関数を呼んでいないからです。

また、画像を常に毎回ロードして表示するLoadGraphScreenという関数はゲームプログラムでは使う事はほとんどありません。
ロードしたデータを保存しておき、それを表示する方法を使います。

なので、13c章のプログラムを参考にして下さい。

ひよこ

Re:Dixqさんの1,2の問題の答え

#3

投稿記事 by ひよこ » 16年前

添削してくださりありがとうございます。
指導してもらったのでソースを改良してきました。
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                  // ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1 ;        // DXライブラリ初期化処理


        SetDrawScreen( DX_SCREEN_BACK ) ;           // 描画先を裏画面に設定
		int image;                               //ハンドルを受け取るためのint型変数を宣言
        image = LoadGraph( "char.png" ) ;       //char.pngのハンドルを代入

        int i ;
        for( i = 0 ; i < 300 ; i ++ )
        {
                ClearDrawScreen();                            // 裏画面のデータを全て削除
                DrawGraph( 0 , i , image , FALSE ) ;      //画像を表示


                ScreenFlip() ;                                // 裏画面データを表画面へ反映
        }


        WaitKey();              // 何かキー入力があるまで待つ
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

tk-xleader

Re:Dixqさんの1,2の問題の答え

#4

投稿記事 by tk-xleader » 16年前

ループの中でProcessMessage関数を呼んでませんよ。
ScreenFlip関数の次あたりに入れるのがいいのではないでしょうか?

ひよこ

Re:Dixqさんの1,2の問題の答え

#5

投稿記事 by ひよこ » 16年前

ProcessMessageってなんですか。よくわかりません。

tk-xleader

Re:Dixqさんの1,2の問題の答え

#6

投稿記事 by tk-xleader » 16年前

Windowsのプログラムというのは、ループしている中では、「メッセージ」というものを受け取る必要があるのです。
ですので、ProcessMessageという関数を呼んで、DXライブラリにメッセージを処理させる必要があるのです。

ひよこ

Re:Dixqさんの1,2の問題の答え

#7

投稿記事 by ひよこ » 16年前

tkmakwins15さんそれは何の問題ですか。

木霊

Re:Dixqさんの1,2の問題の答え

#8

投稿記事 by 木霊 » 16年前

 横から失礼します。
 ひよこさんはDXライブラリのリファレンスを読まれましたか?
 
 ProcessMessage ()は60分の1秒に1回は呼び出さなければ、システムが不安定になります。
 分かりやすく言えば、いつ強制終了してもおかしくない状態になります。
 なのでDXライブラリを使用する際の決まり文句として書かなければいけません。

 あと、調べれば分かるような事はまず自分で調べてみましょう。

Dixq (管理人)

Re:Dixqさんの1,2の問題の答え

#9

投稿記事 by Dixq (管理人) » 16年前

上にも書いた通りですが、
お書きになったプログラムは恐らく画像が移動している時にウィンドウを動かそうとしても出来ないと思います。
ProcessMessageという関数を呼んでいないからです。
詳しくはググるか、DXライブラリのリファレンスをご覧になったらいいと思いますが、
メッセージ処理をさせなければなりません。
メッセージ処理の関数の入れ方については13章をご覧下さい。
また、forで回数指定してループさせるより13c章のようにwhileで回した方がいいでしょう。
(forでもwhileでも同じ事は出来ますが)

ひよこ

Re:Dixqさんの1,2の問題の答え

#10

投稿記事 by ひよこ » 16年前

Dixqさんウィンドウを動かすというのはこういう感じの文でよろしいでしょうか
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;                  // ウィンドウモードに変更
        if( DxLib_Init() == -1 ) return -1 ;        // DXライブラリ初期化処理


        SetDrawScreen( DX_SCREEN_BACK ) ;           // 描画先を裏画面に設定
		int image;                               //ハンドルを受け取るためのint型変数を宣言
        image = LoadGraph( "char.png" ) ;       //char.pngのハンドルを代入

        int i ;
        for( i = 0 ; i < 300 ; i ++ )
        {
                ClearDrawScreen();                            // 裏画面のデータを全て削除
                DrawGraph( 0 , i , image , FALSE ) ;      //画像を表示


                ScreenFlip() ;                                // 裏画面データを表画面へ反映

		if( ProcessMessage() == -1 );// メッセージループに代わる処理をする
		
			

        }



        WaitKey();              // 何かキー入力があるまで待つ

        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

SCI

Re:Dixqさんの1,2の問題の答え

#11

投稿記事 by SCI » 16年前

ひよこさん
そうです。それで普通のWinアプリみたいな動きをしてくれると思います。

後はループの件ですが、そのコードだと一定時間経つと問答無用で終わるんじゃないですか?
しばらくは描画の更新が続きますが、iの値が300になるとWaitKey()状態になります。
このとき、描画更新処理はされていないはずです。
これを解決するには、上で出ている「whileのお話」を参考にすると良いですよ~

ひよこ

Re:Dixqさんの1,2の問題の答え

#12

投稿記事 by ひよこ » 16年前

みなさんいろいろとご指摘ありがとうございます。
またわからなくなったら質問しますのでよろしくおねがいします。

閉鎖

“C言語何でも質問掲示板” へ戻る