GameMaker 日本語掲示板

GameMakerでの「委譲」

3 コメント
views
17 フォロー

最近オブジェクト指向での設計手法を勉強してるんですが、
「継承は何かと危険で厄介」「代わりに委譲を使うべし」というのを知りました。
継承のダメな点を学び、自分が作っているものがことごこく当てはまってることに気づき
(それを継承のメリットだと信じて作ってきたから当然です)、「こりゃあなんとかせにゃいかん!」となってます。
GameMakerでは継承の仕組みは提供されていますが、委譲ってどうやるんでしょう?
委譲に相当する構造を実装することは可能なのでしょうか?

asa
作成: 2022/07/03 (日) 17:05:49
通報 ...
1

移譲は has-a (所持している)関係なので、機能を持たせたいオブジェクトの変数に、オブジェクトのインスタンスを持たせることで実現できます

  • objBattery: 移譲元 (このオブジェクトを拡張したい)
  • objShip: 移譲先 (拡張したオブジェクト)

■objShip の Createイベントで以下のように記述する

// 砲台オブジェクトを所持する
_battery = instance_create_layer(0, 0, "Instances", objBattery);

// 弾を撃つ関数
bullet = function(deg, speed) {
  // objBatteryの機能で弾を撃つ
  return _battery.bullet(self.x, self.y, deg, speed)
};

※サンプルコードはビルドしていないので参考までに…

敵キャラを拡張するために基底となる敵キャラを内包しても良いですし、サンプルコードのように部品(機能)を所持する、という使い方でも良いです

2
asa 2022/07/05 (火) 08:32:59 修正

具体的なサンプルコードまである説明をいただきありがとうございます!
なるほどGameMakerでの委譲ってこういうことなんですね。
内包する、所持する、というのは具体的にどういうことなのかバシッと見えてきました。

GameMakerのオブジェクトはいろいろ装備されてますので、諸々の機能が必要なく、最小のものにしたければ下記のようにstructを使うのもありなのでしょうか…


script weaponsBattery(struct)のコンストラクタを書いておく

function Battery(_bullet_remain) constructor
{
  bullet_remain = _bullet_remain;
  
  bullet = function(_x, _y, _deg, _speed)
  {
    bullet_remain = max(0, bullet_remain-1);
    if (bullet_remain == 0) return;

    instance_create_layer(_x, _y, "Instances", objBullet);
  }
}



objShip(船オブジェクト): create eventで砲台を作成して保持し、その機能を使う

battery = new Bullet(10);
battery.bullet(self.x, self.y, deg, speed);



いろいろ試してみようと思います。
ご説明ありがとうございました!

3

確かにオブジェクトだと冗長な場合は struct で問題ないですね👍