パズルのピースハマった!

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

パズルのピースハマった!

投稿記事 by taketoshi » 11年前

オブジェクト脳。略してオブ脳を構築するべく。
今更オブジェクト指向について勉強していました。

ずーーーっと、よそのオブジェクトが持つ変数の書き換えに、
そのオブジェクトの参照を丸ごと渡すという暴挙を行っていたのです

継承と多態性まで理解していたんですが、他のクラスへのアクセス方法を理解していなかったので悩みました。
しかしここのサイトでインターフェイスクラスを学んでいてオブジェクト指向のピースが脳内でガチガチとハマりはじめました。
凄いかもオブジェクト指向。すごいぞオブ脳。

之も知らずに会社のシステムとかSRPGとか作ってたノカァ・・・。
順番まるっきり違うなぁ。と思う今日この頃。

備忘録でメモメモ。

CODE:

// インターフェイス3.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

typedef struct{
	int x,y;
}pos;

class map;
class charcter;


//例:マップに属する変数を書き換える
class IMapBelongWrite{
public:
	virtual void MapWrite(pos temp) = 0;
};


//マップ変数を書き換えるインターフェイスを継承したmapクラスを作る
class map : public IMapBelongWrite{
private:
	pos nBelong;//書き換えるターゲット
public:
	void MapWrite(pos temp) override{
		nBelong.x = temp.x;
		nBelong.y = temp.y;
	}

	void show(){
		printf("x = %d , y = %d\n",nBelong.x,nBelong.y);
	}


};

class charcter{
	//インターフェイスクラスへの参照を持つ
	IMapBelongWrite *lpMapInter;
public:
	void setchar(){
		pos temp;
		temp.x = 100;
		temp.y = 200;
		lpMapInter->MapWrite(temp);
	}

	//コンストラクタ
	charcter();
	charcter(map *lpmap){lpMapInter = lpmap;}
};

//ステージクラス
class Stage{
private:
	map *lpMap;
	charcter *lpChar;
public:

	//コンストラクタでインスタンス作る
	Stage(){
		lpMap = new map();
		lpChar = new charcter(lpMap);
	}
	~stage(){
		delete lpMap;
		delete lpChar;
	}

	void updata(){

		//mapインスタンスの変数書き換え
		lpChar->setchar();

		//確認
		lpMap->show();
		
	}
};



int _tmain(int argc, _TCHAR* argv[])
{

	Stage *lpStage = new Stage();

	lpStage->updata();

	delete lpStage;

	return 0;
}

最後に編集したユーザー taketoshi on 2014年2月07日(金) 23:46 [ 編集 1 回目 ]

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

Re: パズルのピースハマった!

投稿記事 by ISLe » 11年前

キャラクタが直接マップにアクセスしたりすると後々たいへんなことになりますよ。

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

Re: パズルのピースハマった!

投稿記事 by taketoshi » 11年前

>>ISLeどの

位置情報を管理するクラスを作ってそことキャラクタクラスでやり取りするべきでしょうか?

SRPG前提です。

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

RE: パズルのピースハマった!

投稿記事 by taketoshi » 11年前

多態性をもって実装すればパッドの処理なのか、キーボードの処理なのを直ぐに切り替えられる事に気が付く。
之は凄いわー。

4年掛かった・・・・・orz

メモメモ
► スポイラーを表示

jay
記事: 314
登録日時: 14年前

Re: パズルのピースハマった!

投稿記事 by jay » 11年前

クラス化、カプセル化、継承までは理解出来たけど
いまだにポリモーフィズムを理解できていない僕が通ります

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

Re: パズルのピースハマった!

投稿記事 by taketoshi » 11年前

>>jayどの

知らなくてもソフトウェアは書けます!
ですが多態性を持ってコードすればメインのコードを物凄く減らせる・・と予想しています。

SRPGだとユニットの一連の動きは
キャラクタ選択⇒移動のための思考⇒移動開始⇒移動後の思考⇒行動実行

というルーチンは全て共通なので多態性を持たせることで
プレイヤー、敵ユニット、NPCのすべてを共通の処理で実装できるのではないかと企んでいます。

リファクタリングというか書き直したい熱がムラ-ムラ。じゃなくてメラメラ燃えてきました。
やるぜー!やってやるぜー!

dic
記事: 658
登録日時: 14年前

Re: パズルのピースハマった!

投稿記事 by dic » 11年前

オブりよったな!

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

Re: パズルのピースハマった!

投稿記事 by taketoshi » 11年前

>>dicどの

オブられました!

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

Re: パズルのピースハマった!

投稿記事 by ISLe » 11年前

多態性のあるオブジェクト同士を直接接続すると、互いに影響を受けてしまいがちで、コードが複雑且つ膨大になるおそれがあります。
同一マップに複数種のキャラが存在できるわけなので、少なくともマップが上位であるべきで、キャラがマップを書き変えるのはマズいです。
SRPGかどうかは関係ありません。

インターフェースは、切り替えを容易にするだけでなく階層構造も容易にします。
例えば、ユーザー操作を記録しながら通過させるクラスと、記録した操作を送出しユーザー操作を通過させないクラスを作って、パッドかキーボードか切り替えるクラスの前に挟めば、元のコードにほとんど変更を加えずにリプレイを実装できます。

画面が縦横に回転するのにパッド操作を対応させるサンプルとしてC言語質問掲示板にJavaのコードを投稿したことがあります。
そのころは、コントローラーの分離という話題が集中してましたね。
共時性というのでしょうか、同じような話題が集中することがよくありますね。
最後に編集したユーザー ISLe on 2014年2月08日(土) 19:01 [ 編集 1 回目 ]

アバター
こじこじ
記事: 16
登録日時: 12年前

Re: パズルのピースハマった!

投稿記事 by こじこじ » 11年前

他クラスへのアクセス方法がわからなくて結局switch文で
分岐させたことがあります。

参考にさせていただきま〜す!

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

RE: パズルのピースハマった!

投稿記事 by taketoshi » 11年前

>>ISLeどの

マップが上位ってことはキャラクタクラスを、マップクラスが包含してマップクラス側で書き換えた方が後々ややこしくならないでしょうか
ちょっと単純すぎますがサンプル書いてみました、実際動かすとなるとキャラクタマネージャとかが入ると思うので複雑になると思います。
それ以外の方法としてはキャラクタの位置情報を扱うクラスを独立させてマップクラスに包含させ、キャラクタクラスとやり取りしてもいいのかなと思っています。
► スポイラーを表示
多態性の入口に立っただけでまだまだ覚えることは多いです。
デザインパターンの本が読みたい。

>>こじこじどの

まだ使い道に気が付いただけで使い方は全然わからないのですが
一緒に多態性について学んでゆきましょう。