C++初歩2 継承と多態性
C++初歩2 継承と多態性
オブジェクト指向設計の特徴である継承を実現するための基底クラスと派生クラスについて説明します。プログラムとしては、これから作るPongゲームの中心となるActorクラスを作成し、その派生クラスとしてWallクラスを作成します。
2次元のデータを扱うことが多くなるため、2次元データ用のVector2クラスに、演算子をオーバーロードする手続きを定義します。+、-、*演算をオーバーロードして、自分で定義した手続きが動作するようになります。プログラムとしては、Ballクラスを追加し、ボールが自動的に移動する所までを作成します。
多態性(ポリモーフィズム)と、それを実現するvirtualとoverrideというキーワードについて説明します。プログラムとしては、GameクラスでWallクラスとBallクラスのオブジェクトへのポインタとして記録していたものを、これらの親クラスであるActorクラスへのポインタとして記録する様に変更し、BallのUpdateをオーバーライドし、ボールが外に出たら、真ん中から再生するようにします。
C++言語の機能であるコンテナについて説明します。コンテナにある要素は、範囲for文という書き方で、全ての要素を走査することが出来ます。プログラムは、Gameクラスが持つActor配列を、コンテナの一つであるvector(可変長配列)に変更します。
矩形当たり判定で、ボールが壁にぶつかると跳ね返る処理を追加します。この衝突処理を追加する時に必要なのが、ボールクラスのUpdateメソッドの中で、壁の情報をどのように入手するかです。オブジェクト指向では、オブジェクトが、他のオブジェクトの情報を知りたい時、is-aの関係にするか、has-aの関係にするか、オブジェクト同士の関係を決めていきます。今回、ボールがゲームオブジェクトを所持するhas-aの関係を作ることで、ボールが壁の情報を入手できるようにします。
左右の壁を無くし、左右に、パドルを追加します。Paddleクラスを、Actorクラスの派生クラスとして作成し、GameクラスのLoadDataメソッドで、他のクラスと同様に、Paddleクラスのオブジェクトをインスタンス化します。既に、衝突処理は作成されているので、Paddleオブジェクトを作るだけで、ボールは、パドルに当たると跳ね返ります。
Pongライクなゲームに仕立てます。得点を表示するScoreクラスをActorクラスの派生クラスとして作成します。ボールがパドルに当たると加点、ボールが外に飛び出ると減点するゲームにします。効果音も追加し、ゲームの形が整います。