ゲームプログラミングの館と新・ゲームプログラミングの館について質問

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

ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#1

投稿記事 by vov » 6年前

私は現在、勉強しながらとある簡単なゲームを作っております。
そこで新・ゲームプログラミングの館も大いに参考にさせてもらい助かっているのですが・・・

私は、まだ基礎からなので新・ゲームプログラミングの館の方を中心に見ています。

そこで、気になったことがあります

新・ゲームプログラミングの館では

コード:

#include "DxLib.h"
 
int Key[256];
 
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
    char GetHitKeyStateAll_Key[256];
    GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
 
 
        //ココ!! 
 
 
 
        ScreenFlip();
    }
 
    DxLib_End();
    return 0;
}

コード:

#include "DxLib.h"
 
char Key[256];
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
        SetDrawScreen( DX_SCREEN_BACK );        //裏画面に設定
 
        while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
              //↑メッセージ処理         ↑画面をクリア          ↑キーボード入力状態取得       ↑ESCが押されていない

                //ココに処理を書いていく

                ScreenFlip();//裏画面を表画面に反映
        }
 
        DxLib_End();
        return 0;
}
の二つが書いてあります。
前者はキー入力監視付きと書いてありました。

そこで、龍神録の方も見てみると前者でやっています。

しかし、龍神録のインクルードの部分が分からないので急に真似はできません・・・

ですが、私は既に、キーボードの入力関係のKey.cpp , Key.hを作りキャラクター関係のch.cppにインクルードで参照させてしまっています。
(他にもファイルがあります)

ですので、私は後者で作業を進めている訳です。

これからmain.cppに初期化部分、描画部分とかいう感じに記述していく訳ですが、

今の段階(後はmain部分と他少し)で後者から前者へやり方を切り替えるとなると面倒ですか?

このまま後者のやり方でやった方が良いですか?

また、前者と、後者のはっきりした違いなどを教えてください。
(もちろんキーボードはその中に含まれていると思いますが・・・)

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

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#2

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

この場合は、2つの要素を質問に含んでいますね。
1つは、GetHitKeyStateAll_2の機能について、あとはファイル分割についてです。
両者は密接には関係しません。

あとKey.cppを既に使っているのならGetHitKeyStateAll_2は既に動いているのでは? と言うことは前者のキー入力監視付きを使っていることになります。
ちなみにGetHitKeyStateAll_2は押しているフレーム数を数えるのでキーを押してからのフレーム数を知ることができます。
5フレーム押し続けているとか、キーが押された直後だとか(1だった場合)とかですね。

>これからmain.cppに初期化部分、描画部分とかいう感じに記述していく訳ですが、
>今の段階(後はmain部分と他少し)で後者から前者へやり方を切り替えるとなると面倒ですか?
>このまま後者のやり方でやった方が良いですか?

main.cppに全部書くほうが初心者には難易度が低いですね。
ファイル分割は色々と知識がある前提がありますので、初心者がやると無駄に労力を費やします。

あと一発で、ちゃんとしたプログラムを書けると思わないほうが良いです。
何度も作り直すので、後々面倒ですかとか考えずに今できる全力で作ってください。

2回めに作るときに分割するぐらいの気持ちで良いんじゃないでしょか。
と言うより、そんな作りなおす大変とか壮大なものを最初に作ると挫折しますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

vov

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#3

投稿記事 by vov » 6年前

返信ありがとうございます。

とりあえず、作りたい物があり、最初は構造体から色々な要素(オブジェクト?)のそれぞれの処理まですべてmain.cppに書いていました。

しかし、途中で行数が400位を超えていちいち訂正箇所を見つけるのが面倒になり、分割してやろうという結果になりました。

返信が来るまでにmain関数に分割ファイルのまま書いてみましたが、案の定うまくいった所とうまくいかなかった所が半分半分でした。

これは、まず、行が長くなっても良いからmain.cppに全て書く、それですべてがうまくいったら同じ作品を次はファイルを分割して書いてみる。

という流れが良いのでしょうか?

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

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#4

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

プログラムコードを見直すだけで400行が100行ぐらいになることは、初心者の間は普通にあります。
なので、ファイル分割の前に効率化や関数化を徹底的に行うべきだと思います。
※ 全部で400行ぐらいで訂正箇所を見つけるのが面倒と言うのも、ちゃんと整理されていない可能性を感じました。
闇雲にファイル分割すると、更にカオスになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
てんむすキツネ
記事: 88
登録日時: 8年前
住所: 岡山

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#5

投稿記事 by てんむすキツネ » 6年前

恐らくですが
前者は各キ-ボードの押されていた時間の情報、を取得(というか計算)しています。
後者はそのフレームでキーボードが押されているか、を取得しています。

ゲームの場合、押されていた時間の情報あがるほうが便利です。
大抵のゲームは60FPSで60分の1秒単位で情報を更新します。

前者の場合、プレイヤーは1回しか押してないと思っても
60分の1秒単位で更新されますので
0.1秒間押しただけで6回押されたことになってしまいます。
そのため
一回しか決定してないはずなのに
何回も決定されたことになってしまうかもしれません。

なので、前者でないと色々不便だと思います。

また、前者に変更することは簡単です。
後者の機能を使いキーボードが押されているか取得し
その情報を元に、押されていた時間を保存している変数の値を
++しているわけです。
そして、押されてなかった場合には0にして
押されていない( 押されている時間が0 )というふうにしておきます。

押された時間の情報であれば
0.1秒間押しても6回押されたことにならず、         //この時変数の値はずっと1( 0=押されていない,1=押されている )
6「カウンタ」分押されたとして保存されます。         //この時変数の値は6
つまり、押された時間が1の時のみ反応するようにしておけば
決定は1回しか押されずにすむわけです。

長文でわかりにくいかもしれませんが
コード一つ一つにきちんと意味があります。
1つづつ理解していけば
恐らく何をしているか、どのようにすればいいかがわかってくると思います。

-追記-
すでにソフト屋さん様が
わかり易く解説してくださっていました。
かえって混乱させていたらすみません。
MLP!MLP!

vov

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#6

投稿記事 by vov » 6年前

みなさま丁寧にありがとうございます。

まずは、main.cppに全て書いてみることにします。

そして、そこでの骨格をキー入力監視付きの方にしてみたいと思っているのですが・・・・できますよね?

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

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#7

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

vov さんが書きました:みなさま丁寧にありがとうございます。

まずは、main.cppに全て書いてみることにします。

そして、そこでの骨格をキー入力監視付きの方にしてみたいと思っているのですが・・・・できますよね?
出来ます。と言うより、今後のプログラム作成のために理解しなければいけない事です。
挑戦してみてください。それでも分からない問題が出たら聞いてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ゲームプログラミングの館と新・ゲームプログラミングの館について質問

#9

投稿記事 by ISLe » 6年前

vov さんが書きました:しかし、途中で行数が400位を超えていちいち訂正箇所を見つけるのが面倒になり、分割してやろうという結果になりました。
統合開発環境等は使っていないのでしょうか。
最近はテキストエディタでも関数一覧から定義にジャンプする機能があったりしますが。

400行程度はまだ全然短いのでとりあえず完成させることを目指したほうが良いです。

ファイル分割する前に、同一ファイルで関数単位に分割してみてください。
きちんと機能的に意味のある関数に分割できるようになれば、不具合の内容からどの関数を修正したら良いか当たりを付けられるようになります。
訂正箇所を絞るのにいちいち全体を眺めなくて済むようになります。

それができるようになってから、ファイル単位での分割にステップアップするのが良いと思います。
ファイル分割は共通の意味を持った関数群をまとめる作業(いわゆるライブラリ化)です。
機能的に意味のある関数を作る能力がなければただ煩雑になってしまうだけです。


意味のある分割ができるようになれば、プログラムの動作を変えずにコードを改善すること(リファクタリング)も難しくありません。

閉鎖

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