2.9章について

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

2.9章について

#1

投稿記事 by Nfumi » 12年前

こちらを初めて利用させていただきます。よろしくお願いします。
十分に理解したとは言い難いですが、苦しんで覚えるC言語様の方でポインタまでを学びました。
そろそろゲームを作ってみたいと思い、ゲームプログラミングの館様の講座を参考にさせていただいています。
OSはWin7Homepremium、コードはVisual C++ 2010を使用して書いています。

講座の方は現在2.8章までは進むことができましたが、2.9章で足踏みしている状態です。

本題ですが、
下のgpUpdateKey関数とMain関数において、Zキーが60フレーム入力されたとして、
その処理がどうなっているのか、私の考えをコメント/**/に書いています。
私の認識と知識が正しいのかどうか、間違っていれば正しくはどうなのか教えていただきたいのです。
よろしくお願いいたします。

コード:

#include "DxLib.h"

int Key[256];[tab=60]/* グローバル変数Keyの配列([0]~[255]の256個)を宣言。 
[tab=150]Z(90)が60フレーム入力されたので、Key[89]には整数60が代入される。
[tab=150]数値はキーが押下された分だけ無限に増加していく。*/
int gpUpdateKey()
{
	char tmpkey[256];[tab=110]/* [0]~[255]まで数値0が代入される。 */
	GetHitKeyStateAll( tmpkey );[tab=30]/* Zキーの入力を受けて、tmpkey[89]に1が代入される。*/
						[tab=230]/* KEY_INPUT_Zの情報を同時に得る(?) */
	for ( int i = 0; i < 256; i++ )
	{
		if ( tmpkey[i] != 0 )[tab=50]/* 条件文がtmpkey[89] != 0の時に真となるので、 */
		{
			Key[i]++;[tab=110]/* Key[89]に1が加算される。 */
		}
		else
		{
			Key[i] = 0;				[tab=120]/* [89]以外の配列には0が代入される。 */
		}							[tab=190]/* キー入力がされなくなると */
	}								[tab=190]/* tmpkey[89]には0が代入され、Key[89]の数値も0となり、
									[tab=210]Main関数内のif文は実行されない。*/
	return 0;
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

																	/* gpUpdateKey関数を呼び出し */
        while ( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0, gpUpdateKey()==0 )
	{
		if( Key[KEY_INPUT_Z] >= 60 )[tab=30]/* Zキーが入力されて1~59フレーム目は偽となるので
											[tab=240]実行されず、whileに戻る。 */
		{
			DrawFormatString( 0, 0, GetColor(255,255,255), "?!" );
		}
	}

	DxLib_End();
	return 0;
}
(管理人がコードタグを修正しました)

Nfumi
記事: 2
登録日時: 12年前

2.9章について

#2

投稿記事 by Nfumi » 12年前

codeのミスを直そうと思ったのですが、
ユーザー登録前に投稿してしまった為か編集することができません。ごめんなさい。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 2.9章について

#3

投稿記事 by taketoshi » 12年前

その考え方で合ってますよ。

さらに確認するために

コード:

	if( Key[KEY_INPUT_Z] >= 60 )/* Zキーが入力されて1~59フレーム目は偽となるので実行されず、whileに戻る。 */
	{
		DrawFormatString( 0, 0, GetColor(255,255,255), "?!" );
	}
の部分を

コード:

	DrawFormatString( 0, 0, GetColor(255,255,255), "Zの値 = %d", Key[KEY_INPUT_Z]);
に書き換えてKey[KEY_INPUT_Z]に代入されている数値を見てみると挙動が解り易いです。
押してる間は数値が増え続け、離したら0にリセットされます。

derok
記事: 51
登録日時: 12年前

Re: 2.9章について

#4

投稿記事 by derok » 12年前

ほとんど合っているので細かい所を、
Nfumi さんが書きました: char tmpkey[256]; /* [0]~[255]まで数値0が代入される。 */
この時点では0は代入されていません。

コード:

memset(tmkey, 0, sizeof(tmkey) );
の様に書けば、初期化できます。
Nfumi さんが書きました: KEY_INPUT_Zの情報を同時に得る(?)
KEY_INPUT_ZはDXライブラリで定義されている定数です。
これはコンパイル時に変換されます。

Nfumi
記事: 2
登録日時: 12年前

Re: 2.9章について

#5

投稿記事 by Nfumi » 12年前

>taketoshiさん
>その考え方で合ってますよ。
>~に書き換えてKey[KEY_INPUT_Z]に代入されている数値を見てみると挙動が解り易いです。
>押してる間は数値が増え続け、離したら0にリセットされます。

考え方はほとんど間違ってなかったようで安心しました。
Key[KEY_INPUT_Z]を%dに代入してみたところ、仰られた挙動が確認できました。
ありがとうございます。

>derokさん
>この時点では0は代入されていません。
>~の様に書けば、初期化できます。

コード:

{
	char tmpkey[256];
	memset(tmpkey, 0, sizeof(tmpkey) );
	printf("%d",tmpkey[1]);
	return 0;
}
としてみたところtmpkeyの初期化が確認できました。

>KEY_INPUT_ZはDXライブラリで定義されている定数です。
>これはコンパイル時に変換されます。

内部的にどういった処理がされているのかまだ明確にイメージ出来ていないのですが、
今の理解度でもGetHitKeyStateAll関数を使用していくのに問題は無さそうかなと思うので、
とりあえず学習を進めていきたいと思います。

お二方、お答え下さってありがとうございました。

閉鎖

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