ページ 11

新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 15:37
by 夢幻ノ月夜
http://dixq.net/g/04_05.html
このページを見て思ったのですが
このページで掲載されているサンプル

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更,初期化,裏画面設定

        int Pad;        //ジョイパッドの入力状態格納用変数

        // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
        while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() ){
                Pad = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;        //入力状態をPadに格納
                for( int i=0; i<28; i++ ){      //ボタン28個分ループ
                        if( Pad & (1<<i) ){             //ボタンiの入力フラグが立っていたら
                                DrawFormatString( 0, i*15, GetColor(255,255,255), "%dのキーが押されています", i );
                        }
                }
        }

        DxLib_End();
        return 0;
}
の28個分ループのところなんですが
方向キー4つ+28個のボタン
なので32回ループになりませんか?
このサイトが間違っているのか俺の解釈が間違っているのか教えてください

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 15:55
by softya(ソフト屋)
for( int i=0; i<28; i++ ){ //ボタン28個分ループ
でループしているわけですが、方向キー4つが何処から出てきたのか分かりません。
そう思った理由を説明してくださいね。

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 16:33
by 夢幻ノ月夜
softya(ソフト屋) さんが書きました:for( int i=0; i<28; i++ ){ //ボタン28個分ループ
でループしているわけですが、方向キー4つが何処から出てきたのか分かりません。
そう思った理由を説明してくださいね。
画像の図を見て
方向キーが最初に含まれていて
上の後にPAD_INPUT_1が来ているからです
ついでにサンプルコードも実行してみましたが
方向キーも0,1,2,3番目のボタン扱いになっていたように見えたからです

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 17:10
by Rittai_3D

コード:

// Dxlib ver 3.13b Line:861~
// DX Library Copyright (C) 2001-2008 Takumi Yamada.
// パッド入力定義
#define PAD_INPUT_DOWN								(0x00000001)	// ↓チェックマスク
#define PAD_INPUT_LEFT								(0x00000002)	// ←チェックマスク
#define PAD_INPUT_RIGHT								(0x00000004)	// →チェックマスク
#define PAD_INPUT_UP								(0x00000008)	// ↑チェックマスク

// 一部省略

#define PAD_INPUT_1									(0x00000010)
#define PAD_INPUT_2									(0x00000020)
#define PAD_INPUT_3									(0x00000040)
#define PAD_INPUT_4									(0x00000080)
#define PAD_INPUT_5									(0x00000100)
#define PAD_INPUT_6									(0x00000200)
#define PAD_INPUT_7									(0x00000400)
#define PAD_INPUT_8									(0x00000800)
#define PAD_INPUT_9									(0x00001000)
#define PAD_INPUT_10								(0x00002000)
#define PAD_INPUT_11								(0x00004000)
#define PAD_INPUT_12								(0x00008000)
#define PAD_INPUT_13								(0x00010000)
#define PAD_INPUT_14								(0x00020000)
#define PAD_INPUT_15								(0x00040000)
#define PAD_INPUT_16								(0x00080000)
#define PAD_INPUT_17								(0x00100000)
#define PAD_INPUT_18								(0x00200000)
#define PAD_INPUT_19								(0x00400000)
#define PAD_INPUT_20								(0x00800000)
#define PAD_INPUT_21								(0x01000000)
#define PAD_INPUT_22								(0x02000000)
#define PAD_INPUT_23								(0x04000000)
#define PAD_INPUT_24								(0x08000000)
#define PAD_INPUT_25								(0x10000000)
#define PAD_INPUT_26								(0x20000000)
#define PAD_INPUT_27								(0x40000000)
#define PAD_INPUT_28								(0x80000000)
と定義されていますので、最初の4回のループで方向キーの判定は終わっています。
28という数字は、おそらく、32-4=28 からきたものだと推測します。

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 18:26
by 夢幻ノ月夜
Rittai_3D さんが書きました:

コード:

// Dxlib ver 3.13b Line:861~
// DX Library Copyright (C) 2001-2008 Takumi Yamada.
// パッド入力定義
#define PAD_INPUT_DOWN								(0x00000001)	// ↓チェックマスク
#define PAD_INPUT_LEFT								(0x00000002)	// ←チェックマスク
#define PAD_INPUT_RIGHT								(0x00000004)	// →チェックマスク
#define PAD_INPUT_UP								(0x00000008)	// ↑チェックマスク

// 一部省略

#define PAD_INPUT_1									(0x00000010)
#define PAD_INPUT_2									(0x00000020)
#define PAD_INPUT_3									(0x00000040)
#define PAD_INPUT_4									(0x00000080)
#define PAD_INPUT_5									(0x00000100)
#define PAD_INPUT_6									(0x00000200)
#define PAD_INPUT_7									(0x00000400)
#define PAD_INPUT_8									(0x00000800)
#define PAD_INPUT_9									(0x00001000)
#define PAD_INPUT_10								(0x00002000)
#define PAD_INPUT_11								(0x00004000)
#define PAD_INPUT_12								(0x00008000)
#define PAD_INPUT_13								(0x00010000)
#define PAD_INPUT_14								(0x00020000)
#define PAD_INPUT_15								(0x00040000)
#define PAD_INPUT_16								(0x00080000)
#define PAD_INPUT_17								(0x00100000)
#define PAD_INPUT_18								(0x00200000)
#define PAD_INPUT_19								(0x00400000)
#define PAD_INPUT_20								(0x00800000)
#define PAD_INPUT_21								(0x01000000)
#define PAD_INPUT_22								(0x02000000)
#define PAD_INPUT_23								(0x04000000)
#define PAD_INPUT_24								(0x08000000)
#define PAD_INPUT_25								(0x10000000)
#define PAD_INPUT_26								(0x20000000)
#define PAD_INPUT_27								(0x40000000)
#define PAD_INPUT_28								(0x80000000)
と定義されていますので、最初の4回のループで方向キーの判定は終わっています。
28という数字は、おそらく、32-4=28 からきたものだと推測します。
4回のループってどこですか?

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 18:41
by usao
オフトピック
そのページ見た感じだと以下のようなことが書かれているように見える.

(1)上下左右とボタン1~28の計32種類の情報が取れるようだ
(2)ボタン1~28の状態ついては,戻り値の下位bitから見ていけばわかるらしい(ボタン1の情報が最下位ビット.そのような図というか表というかが示されているので)
(3)最後のサンプルは(2)の具体的説明であり,ボタン28種の情報を見るサンプルである(=上下左右の状態は見ない)

→しかし 3Dさんが示された値を見ると,(2)(3)はそうではないようです.
 この定義見ると 「せっかくだから32種類全部を表示すればいいのに,なんで28個だけ?」 とはまぁ思いますね.

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 18:54
by softya(ソフト屋)
PAD_INPUT_1から28の定義が追加されたのは2011年ですので、それ以前からあるコードの場合28個で十分だった可能性はあります。
最新定義に従うなら32個です。

>このサイトが間違っているのか俺の解釈が間違っているのか教えてください

なので、途中で変わったのでなんとも言えないが害はない可能性が高い。と言えるかと。

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 19:02
by 夢幻ノ月夜
softya(ソフト屋) さんが書きました:PAD_INPUT_1から28の定義が追加されたのは2011年ですので、それ以前からあるコードの場合28個で十分だった可能性はあります。
最新定義に従うなら32個です。

>このサイトが間違っているのか俺の解釈が間違っているのか教えてください

なので、途中で変わったのでなんとも言えないが害はない可能性が高い。と言えるかと。
害はない…なるほどありがとうございます
害が見つからないのでこれにて解決とします!

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 19:17
by Dixq (管理人)
多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
28個のままで問題ないと思います。

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月06日(月) 21:46
by ISLe()
リンクされた館の記事を読むと、28個のボタン全てをチェックする方法として書かれたコードだということが分かります。

なのに、『1~28』ではなく、『↓・←・→・↑・1~24』、のボタン状態を表示するコードになっているのはなぜか、ということですよね。
質問者さんと同じく、わたしも明らかにおかしいと思います。

どうして、ボタンの1~28の状態が格納されている位置に合わせて、4ビットずらさないのでしょうか。

記事に書かれているとおりに、このコードを、(方向キー以外の)28個のボタンをチェックする方法、と理解しても害はないのでしょうか?

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月07日(火) 09:22
by usao
>多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
>28個のままで問題ないと思います。

このトピックの論点はそういう類の話ではないような…?

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月07日(火) 11:39
by softya(ソフト屋)
usao さんが書きました:>多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
>28個のままで問題ないと思います。

このトピックの論点はそういう類の話ではないような…?
すいません。大ボケでした。
図まで載せてたんですね。
だとしたら図のとおり32個が正しいと思います。
【補足】28個で通常害はないですが

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月07日(火) 18:16
by ISLe()
新・C言語~ゲームプログラミングの館~4.5章の記事はこうなっています。
*** 以下、少し発展的な内容です。 ***

28個のボタン全てをチェックする為に、

if( Pad1 & PAD_INPUT_1)
if( Pad1 & PAD_INPUT_2)
if( Pad1 & PAD_INPUT_3)
・・・・

のように28個のif文を書くのは面倒です。ここで、変数Pad1に入っている入力状態の仕組みを理解します。
この流れで、どうして、32個が正しいという結論になるのか、分かりません。
方向キーも含めて28個で良いという結論になる理由も、分かりません。

夢幻ノ月夜 さんが書きました:このサイトが間違っているのか俺の解釈が間違っているのか教えてください
書いた本人が間違っていないとおっしゃってますが、わたしはサイトが間違っていると思います。

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月07日(火) 18:25
by ISLe()
ISLe() さんが書きました:
夢幻ノ月夜 さんが書きました:このサイトが間違っているのか俺の解釈が間違っているのか教えてください
書いた本人が間違っていないとおっしゃってますが、わたしはサイトが間違っていると思います。
ごめんなさい。
記事は方向キーを含めないと読めるので、質問者さんの解釈も間違っていると思われます。

あの文章に続けるとして、わたしなら、こうします。

コード:

#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更,初期化,裏画面設定
 
        int Pad;        //ジョイパッドの入力状態格納用変数
 
        // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
        while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() ){
                Pad = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;        //入力状態をPadに格納
                for( int i=0; i<28; i++ ){      //ボタン28個分ループ
                        if( Pad & (1<<(i+4)) ){             //ボタンiの入力フラグが立っていたら
                                DrawFormatString( 0, i*15, GetColor(255,255,255), "%dのキーが押されています", i+1 );
                        }
                }
        }
 
        DxLib_End();
        return 0;
}

Re: 新・C言語~ゲームプログラミングの館~4.5章

Posted: 2015年4月07日(火) 22:31
by みけCAT
オフトピック
i=27のとき(1<<(i+4))を計算してしまうと、int型が32ビットの場合は符号付き整数のオーバーフローを起こし、未定義動作になってしまう気がします。