ページ 11

スイッチを作りたくて

Posted: 2011年8月26日(金) 18:45
by OP
あるプログラムがあるのですが、その画像と音をZキーが押されると発動するようにしたいのです。このプログラムです。↓

コード:

#include "DxLib.h"
 
typedef struct{
	int x,y,img;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2];
	char Key[256];
	ch_t ch;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	ch.x =180;
	ch.y =0;

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

		PlayMusic( "サウンド/テスト.wav" , DX_PLAYTYPE_LOOP ) ; //マスタースパーク効果音
	LoadDivGraph( "画像/テスト.png" , 2 , 2 , 1 , 256 , 512 , image );//画像を分割してimage配列に保存

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
		if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右のボタンが押されたら
			ch.x++; //xの値を1増やす
		else if( Key[ KEY_INPUT_LEFT ] == 1 )
			ch.x--;
		else if(Key[ KEY_INPUT_DOWN ] == 1 )
			ch.y++;
		else if(Key[ KEY_INPUT_UP ] == 1 )
			ch.y--;

		ch.img=image[0];

                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}
もしわかる人がいましたらわかりやすい返信お願いします。

Re: スイッチを作りたくて

Posted: 2011年8月26日(金) 18:56
by h2so5
まずZキーが押されているかどうかの判定を入れましょう。

Re: スイッチを作りたくて

Posted: 2011年8月26日(金) 19:17
by OP
こうでしょうか?

コード:


#include "DxLib.h"
 
typedef struct{
	int x,y,img;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2];
	char KeyBuf[256];
	ch_t ch;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	ch.x =180;
	ch.y =0;

	GetHitKeyStateAll( Buf );

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

	if( Buf[ KEY_INPUT_Z ] == 1 )
		PlayMusic( "サウンド/テスト.wav" , DX_PLAYTYPE_LOOP ) ; //マスタースパーク効果音
	LoadDivGraph( "画像/テスト.png" , 2 , 2 , 1 , 256 , 512 , image );//画像を分割してimage配列に保存

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
		if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右のボタンが押されたら
			ch.x++; //xの値を1増やす
		else if( Key[ KEY_INPUT_LEFT ] == 1 )
			ch.x--;
		else if(Key[ KEY_INPUT_DOWN ] == 1 )
			ch.y++;
		else if(Key[ KEY_INPUT_UP ] == 1 )
			ch.y--;

		ch.img=image[0];

                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re: スイッチを作りたくて

Posted: 2011年8月26日(金) 20:01
by 沖 滉均
こうでしょうかと聞く前に自分で動作を確認してみましたか?
コードを見る限りでは確認していなさそうですね。
そもそも、ビルドが通らないはずです。

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 10:10
by OP
ビルドしたところKeyとBufが定義されてないと出ました。どうやって宣言するのでしょうか?

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 10:19
by softya(ソフト屋)
OPさんはC言語から勉強中なんですよね?
だったら、まずどの関数でエラーが出ているか正確に書いてください。
で、その関数では、どの様な引数が要求されるか調べてみましょう。

「DXライブラリ置き場 リファレンスページ」
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

どうですか?KeyとBufってどんな定義が必要ですか?
回答をお待ちしています。

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 10:23
by 白い時空

コード:

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2];
    char KeyBuf[256];
    ch_t ch;
ここを見ればわかりますが、宣言されているのはKeyでもBufでもなくKeyBufになっています。
KeyとBufをKeyBufに変更するか、または
char Key[256],Buf[256];
と宣言を変更するかしてください。

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:09
by OP
ビルドできました。

コード:


#include "DxLib.h"
 
typedef struct{
	int x,y,img;
}ch_t;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2];
	char Key[256],Buf[256];
	ch_t ch;

    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
	ch.x =180;
	ch.y =0;

	GetHitKeyStateAll( Buf );

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

	if( Buf[ KEY_INPUT_Z ] == 1 )
		PlayMusic( "サウンド/テスト.wav" , DX_PLAYTYPE_LOOP ) ; //マスタースパーク効果音
	LoadDivGraph( "画像/テスト.png" , 2 , 2 , 1 , 256 , 512 , image );//画像を分割してimage配列に保存

    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
		if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右のボタンが押されたら
			ch.x++; //xの値を1増やす
		else if( Key[ KEY_INPUT_LEFT ] == 1 )
			ch.x--;
		else if(Key[ KEY_INPUT_DOWN ] == 1 )
			ch.y++;
		else if(Key[ KEY_INPUT_UP ] == 1 )
			ch.y--;

		ch.img=image[0];

                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:18
by softya(ソフト屋)
目的のことは実現されましたか?
なぜ、こんなことを聞くかというと論理的に状況を説明するクセを付ける必要があるからです。
プログラムというのはコンピュータにやりたい事を論理的に記述するってことですからね。

それと
char Key[256],Buf[256];
は無駄があります。
それは何でしょうか?

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:21
by OP
すいません…わかりませんでした。なんかちょっと勉強してできるかなと思ってしまいました。
また勉強しなおしてみます。

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:25
by softya(ソフト屋)
ここで諦めずに、このプログラムを前に言った日本語で書きだしてみてみませんか?
なんか、同じようなことを繰り返しているので日本語での書き出し自体がちゃんと出来ていない気がします。
問題があればアドバイスしますので、挑戦してみてください。

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:41
by OP
日本語で訳してみました。コメントで書いてないところはわからないとこです。

コード:

#include "DxLib.h" //含むDXライブラリ
 
typedef struct{
    int x,y,img;
}ch_t;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2]; //イメージの2を表示
    char Key[256],Buf[256];
    ch_t ch;
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x =180; //Xの180
    ch.y =0; //Yの0表示
 
    GetHitKeyStateAll( Buf );
 
    SetDrawScreen( DX_SCREEN_BACK ) ;   //描画先を裏画面に設定
 
    if( Buf[ KEY_INPUT_Z ] == 1 )
        PlayMusic( "サウンド/テスト.wav" , DX_PLAYTYPE_LOOP ) ; //テスト効果音
    LoadDivGraph( "画像/テスト.png" , 2 , 2 , 1 , 256 , 512 , image );//画像を分割してimage配列に保存
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
        if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右のボタンが押されたら
            ch.x++; //xの値を1増やす
        else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左のボタンが押されたら
            ch.x--; //Xの値を1減らす
        else if(Key[ KEY_INPUT_DOWN ] == 1 ) // 下のボタンが押されたら
            ch.y++; // Yの値を増やす
        else if(Key[ KEY_INPUT_UP ] == 1 ) // 上のボタンが押されたら
            ch.y--; // Yの値を減らす
 
        ch.img=image[0];
 
                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 12:56
by softya(ソフト屋)
日本語化するには、このプログラムは難しすぎたかもしれませんね。

コード:

#include "DxLib.h" //含むDXライブラリ
 
typedef struct{	←これは構造体(struct)でtypedefで型名を新たに付与しています。それぞれ調べてみてください。調べて分からなければ構造体ってなんですか?ぐらいから聞いてもらって構いません。
    int x,y,img;
}ch_t;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int image[2]; //イメージの2を表示	←ちがいます。int型の配列で、ある情報を蓄えます。
    char Key[256],Buf[256]; ← char型の配列です。ある情報を蓄えるために使います。
    ch_t ch; ← 上の構造体と関係しています。
 
    if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
 
    ch.x =180; //Xの180 ←具体的に行っていることを書いてくださいね。何が起こるのでしょうか?
    ch.y =0; //Yの0表示
 
    GetHitKeyStateAll( Buf ); ← DXライブラリのリファレンスを調べられましたか?で、調べた分からないことがあれば聞いてください。
 
    SetDrawScreen( DX_SCREEN_BACK ) ;   //描画先を裏画面に設定
 
    if( Buf[ KEY_INPUT_Z ] == 1 ) ← ここにあるZキーの処理はいつ動作するでしょうか? プログラムの流れ、動作タイミングを理解してそれを書きましょう。
        PlayMusic( "サウンド/テスト.wav" , DX_PLAYTYPE_LOOP ) ; //テスト効果音
    LoadDivGraph( "画像/テスト.png" , 2 , 2 , 1 , 256 , 512 , image );//画像を分割してimage配列に保存
 
 	
 	それぞれの関数や一行毎の機能を元からのコメントを消して自分の言葉で書いてください。それでやっと理解したことになります。
 	なので、調べる、日本語で書くを徹底的に行なってください。最初のうちは、こんな短いコメントになるはずは無いんですよ。
 	いろいろ調べても分からなかれば質問してください。
 	以下の部分も、同様です。
 	
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了
 
        if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右のボタンが押されたら
            ch.x++; //xの値を1増やす
        else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左のボタンが押されたら
            ch.x--; //Xの値を1減らす
        else if(Key[ KEY_INPUT_DOWN ] == 1 ) // 下のボタンが押されたら
            ch.y++; // Yの値を増やす
        else if(Key[ KEY_INPUT_UP ] == 1 ) // 上のボタンが押されたら
            ch.y--; // Yの値を減らす
 
        ch.img=image[0];
 
                DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;
 
                ScreenFlip();//裏画面を表画面に反映
    }
 
    DxLib_End();
    return 0;
}

Re: スイッチを作りたくて

Posted: 2011年8月27日(土) 13:08
by OP
ありがとうございます!!これを元にどうしたらいいか考えたいと思います!!