やっぱりわからんぞクラス

白鳥(しらとり)
記事: 6
登録日時: 11年前

やっぱりわからんぞクラス

投稿記事 by 白鳥(しらとり) » 11年前

またもや投稿頻度高めで申し訳ありません…
ちょいDXライブラリで3Dモデルを表示させてカメラを動かすだけのテストをしてたのですが、
3D処理初めてなのにクラスまで入ったらどっちに問題があるかわからなくなるのでクラスは使わずに組んでました

やりたいことがだいたいできたのでクラスにしてみようと思ったのですがどれをどうすれば…
とりあえずソースだけ貼ると

CODE:

#include "DxLib.h"
#include 


float offsetX(float,float);
float offsetY(float,float);

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{
	if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
    {
         return -1;    // エラーが起きたら直ちに終了
    }

	ChangeWindowMode(TRUE), SetDrawScreen( DX_SCREEN_BACK );

	//モデルの読み込み
	int PlayerModel = MV1LoadModel( "dat/Kirito/Kirigaya Kazuto (Shiruhane).pmd" );

	VECTOR CameraPos;
	float defY = 10.0;
	float angleXZ = 90.0;
	float radius =-30.0;
	float hightY = 0.0;



	int Color ;
    Color = GetColor( 255 , 255 , 255 ) ;


    //奥行0.1~1000までをカメラの描画範囲とする
    SetCameraNearFar( 0.1f, 1000.0f ) ;


    // ESCキーが押されるかウインドウが閉じられるまでループ
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
    {
        // 画面をクリア
        ClearDrawScreen() ;


		// 方向キーでカメラの座標を移動
        if( CheckHitKey( KEY_INPUT_UP ) == 1 )
        {
            hightY += 3.0 ;
        }
        if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
        {
            hightY -= 3.0 ;
        }
		if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
        {
            angleXZ -= 0.2 ;
        }
        if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
        {
            angleXZ += 0.2 ;
        }

		//カメラ上下に上限(上下だけに)
		if(hightY >  30.0){ hightY =  30.0; }
		if(hightY < -30.0){ hightY = -30.0; } 


		// カメラの座標を初期化
		CameraPos.x = offsetX(angleXZ,radius) ;
		CameraPos.y = hightY + defY ;
		CameraPos.z = offsetY(angleXZ,radius) ;

        // カメラの位置と注視点をセット、注視点は原点
        SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f + defY, 0.0f ) ) ;

		//モデル描画
		MV1DrawModel( PlayerModel );

		DrawFormatString(0,0,Color,"hightY = %f",hightY);
		//表にバン
		ScreenFlip();

		WaitTimer(30);
	
	}

	// DXライブラリ使用の終了処理
	DxLib_End() ;

	// ソフトの終了
	return 0 ;
}

float offsetX (float angle, float radius ){
	return radius * cos(angle);
}

float offsetY (float angle, float radius ){
	return radius * sin(angle);
}
ひどい組み方をしている気が…
てかひどいんだと思うんですがこれをどうすればいいやら…

とりあえずカメラ移動系をクラスでまとめようかとか思ってたのですが
まずクラスの使い方が合ってるのかすら不安になってきた始末…

ちょっと休みます

zxc
記事: 79
登録日時: 13年前

Re: やっぱりわからんぞクラス

投稿記事 by zxc » 11年前

  hightとは何かと思って調べた結果(weblioでの検索結果)。・・・heightの誤字ですかね。
  やってみて駄目だったら他の手段を考える、というのも一つの方法だと思いますし、他の方がつくったクラスやデザインパターンを見てみるのも良いかもしれません。("参考:デザインパターン")

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前

Re: やっぱりわからんぞクラス

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

1.データを構造体にまとめる要領でデータだけをクラス化する。
2.データの処理をクラスのメンバ関数に移す。
3.データをできるだけクラスに隠蔽する。
の3ステップが出来れば最初は上出来じゃないでしょうか。

まぁ、その前にC言語で構造体の利用と関数化が出来ていないと始まりません。
最後に編集したユーザー softya(ソフト屋) on 2014年1月25日(土) 21:29 [ 編集 1 回目 ]

白鳥(しらとり)
記事: 6
登録日時: 11年前

Re: やっぱりわからんぞクラス

投稿記事 by 白鳥(しらとり) » 11年前

コメントありがとうございます…
誤字…うわぁ
浮かんでこなくて打ってみたら「あれ、こんな感じだったな」でそのまま…
修正します

構造体の要領ならなんとか出来るのですが2からがまだ出来てない状態ですね…
Cでゲームを作ってた時は関数化していたのですが途中からごっちゃになってしまいまして…
結局mainに全部書くのと変わらないような状態になってしまってました

ちょっとずつ関数化とクラスに慣れてみます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前

Re: やっぱりわからんぞクラス

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

C言語で関数と構造体をオブジェクト(カメラやプレーヤーなどの単位)毎に別cppファイルにまとめてみて下さい。
それができるならステップ2から3は出来るはずです

白鳥(しらとり)
記事: 6
登録日時: 11年前

Re: やっぱりわからんぞクラス

投稿記事 by 白鳥(しらとり) » 11年前

softya(ソフト屋) さんが書きました:C言語で関数と構造体をオブジェクト(カメラやプレーヤーなどの単位)毎に別cppファイルにまとめてみて下さい。
それができるならステップ2から3は出来るはずです
毎回アドバイスありがとうございます
頑張ってみます

アバター
せんちゃ
記事: 50
登録日時: 14年前

Re: やっぱりわからんぞクラス

投稿記事 by せんちゃ » 11年前

「クラスにする」という考え方は一旦捨てたほうが良いのではないでしょうか。
自分も学生の頃はCよりC++がわかったほうが良いに違いない!みたいな気持ちがあってCを疎かにしてクラスばかり勉強してましたが
決してそれは効率的、というか良い勉強方法ではなかったなと今になって思っています。

決してC++ > Cではないのです。(これは学生の頃の自分がしていた誤解でした)
昔マンガで「C++はできるけどCは基礎程度なら」とか言ってる奴がいましたがそんなのは有り得ません。
まずCが解るという前提がないとC++の恩恵には授かれないのです。

構造体と関数だけでまずクラスっぽいこと(ソフト屋さんが仰るようなまとめ方)をやってみて
その上で「このやり方は面倒くさいなぁ・・・」と感じたときにクラスに手を出したほうが
なぜクラスという機能があるのか、のありがたみを実感できると思います

ISLe
記事: 2650
登録日時: 14年前

Re: やっぱりわからんぞクラス

投稿記事 by ISLe » 11年前

わたしのアプローチの仕方は逆ですね。

まずカメラをモジュール化(あえてクラス化とは言いません)するとして、位置を変えたり角度を変えたりする機能のインターフェースを考えます。
変数を直接変更しているところをとにかく関数に置き換え、共通化するために適切な関数原型は何かを考えます。

関数呼び出しをまとめると自然にどの変数をまとめれば良いかということに繋がると思います。

また、機能を実装するのに、heightとかangleとかいう変数を使わなければいけないとは限らないかもしれません。
変数をまとめることが前提だとより良い実装を検討し差し替えるといった行動を自ら否定しがちです。

とりあえず、変数ひとつ書き換えたほうが早いという考えを捨てて、いちいち関数を呼び出すコードにする。
整理するのはそのあとが良いのではないでしょうかね。

白鳥(しらとり)
記事: 6
登録日時: 11年前

Re: やっぱりわからんぞクラス

投稿記事 by 白鳥(しらとり) » 11年前

なるほど…
たしかにクラス化にこだわりすぎていた気がします。
正直クラスより今までのように関数化するほうが楽だったりするのでまたクラスが必要になったときにクラス化を試してみることにします。
みなさん回答有難うございました。