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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

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

#1

投稿記事 by 夢幻ノ月夜 » 5年前

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回ループになりませんか?
このサイトが間違っているのか俺の解釈が間違っているのか教えてください
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 5年前

for( int i=0; i<28; i++ ){ //ボタン28個分ループ
でループしているわけですが、方向キー4つが何処から出てきたのか分かりません。
そう思った理由を説明してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

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

#3

投稿記事 by 夢幻ノ月夜 » 5年前

softya(ソフト屋) さんが書きました:for( int i=0; i<28; i++ ){ //ボタン28個分ループ
でループしているわけですが、方向キー4つが何処から出てきたのか分かりません。
そう思った理由を説明してくださいね。
画像の図を見て
方向キーが最初に含まれていて
上の後にPAD_INPUT_1が来ているからです
ついでにサンプルコードも実行してみましたが
方向キーも0,1,2,3番目のボタン扱いになっていたように見えたからです
添付ファイル
PAD入力.jpg
毎回ゲーム作ろうとするたびに壁にぶち当たる

Rittai_3D
記事: 525
登録日時: 7年前

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

#4

投稿記事 by Rittai_3D » 5年前

コード:

// 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 からきたものだと推測します。
初心者です

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

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

#5

投稿記事 by 夢幻ノ月夜 » 5年前

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回のループってどこですか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
usao
記事: 1584
登録日時: 7年前

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

#6

投稿記事 by usao » 5年前

オフトピック
そのページ見た感じだと以下のようなことが書かれているように見える.

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 5年前

PAD_INPUT_1から28の定義が追加されたのは2011年ですので、それ以前からあるコードの場合28個で十分だった可能性はあります。
最新定義に従うなら32個です。

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

なので、途中で変わったのでなんとも言えないが害はない可能性が高い。と言えるかと。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

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

#8

投稿記事 by 夢幻ノ月夜 » 5年前

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

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

なので、途中で変わったのでなんとも言えないが害はない可能性が高い。と言えるかと。
害はない…なるほどありがとうございます
害が見つからないのでこれにて解決とします!
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

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

#9

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

多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
28個のままで問題ないと思います。

ISLe()

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

#10

投稿記事 by ISLe() » 5年前

リンクされた館の記事を読むと、28個のボタン全てをチェックする方法として書かれたコードだということが分かります。

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

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

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

アバター
usao
記事: 1584
登録日時: 7年前

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

#11

投稿記事 by usao » 5年前

>多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
>28個のままで問題ないと思います。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

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

#12

投稿記事 by softya(ソフト屋) » 5年前

usao さんが書きました:>多分32個もボタンが定義されているジョイパッドじゃないと遊べない設計にすること自体間違いだと思いますので、
>28個のままで問題ないと思います。

このトピックの論点はそういう類の話ではないような…?
すいません。大ボケでした。
図まで載せてたんですね。
だとしたら図のとおり32個が正しいと思います。
【補足】28個で通常害はないですが
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

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

#13

投稿記事 by ISLe() » 5年前

新・C言語~ゲームプログラミングの館~4.5章の記事はこうなっています。
*** 以下、少し発展的な内容です。 ***

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

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

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

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

ISLe()

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

#14

投稿記事 by ISLe() » 5年前

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;
}

アバター
みけCAT
記事: 6273
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#15

投稿記事 by みけCAT » 5年前

オフトピック
i=27のとき(1<<(i+4))を計算してしまうと、int型が32ビットの場合は符号付き整数のオーバーフローを起こし、未定義動作になってしまう気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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