したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

ゲームプログラミング相談スレ

15とじか:2014/03/22(土) 02:49:13 ID:yv/t42sg0
続いて、virtual の話をしましょう
世の中には、「呼び出し方は同じだけど中身の処理が違う、でも一緒に扱いたい」というものは沢山あります
さっきの話で言うと、八百屋さんだけじゃなくて肉屋さんでも「お金を出して商品をもらう」という点では同じですし、
ゲームの世界でも「アイテムごとに使った時の効果を変えたい」とか「敵の種類ごとに描画処理を変えたい」という話はよく出てきます
そして、カプセル化の考え方に基づくなら、使う側としてはそういう「中身の細かい手続きの違い」は気にせずに一緒くたに扱えると嬉しいわけです
そして、そういう時に便利なのが、virtual(→仮想関数;多態性)です

仮想関数の詳しい使い方は個々人で調べてもらうとして、
仮想関数を定義したクラスの基本的な使い方は以下の様な感じになります:
● 敵一般を表すクラスを EnemyBase として定義する
● 各敵のクラス(例:Slime,Worm)はEnemyBaseを継承して定義する
● 手続きが同じで中身が違う処理(例:draw())は virtual を付けて仮想関数として扱う
● 各敵のクラスのインスタンスのポインタは、EnemyBaseのポインタとしても扱える
std::list<EnemyBase*> enemies;
Slime slime;
Worm worm;
enemies.push_back(&slime);
enemies.push_back(&worm);
● ポインタから呼び出した仮想関数は、各敵固有の処理に置き換わっている
for(auto it=enemies.begin(); it!=enemies.end(); ++it) (*it)->draw(); // Slime,Wormの描画処理がそれぞれ呼び出される
● 同じ型の変数(=ここではEnemyBaseのポインタ)として扱いつつ、異なる挙動をさせることが出来る! ヾ( ノシ*°ヮ。)ノシ


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板