GameMaker 日本語掲示板

オブジェクト(struct)ベースのStateパターン / 5

9 コメント
views
16 フォロー
5

遷移する度にインスタンスの破棄とインスタンス化をするのが負荷になる可能性があるという指摘も頂きました。
いろいろ考えるべきことがありますね~

通報 ...
  • 6

    別口でご回答させていただきましたが、為念こちらにも。

    gameMakerは学んだことがなく知識や仕様理解は暗いですが、気になった点としてインスタンスの生成を上げさせていただきました。
    もう1点、idleとwalk内で同様の処理が記述されていることも、冗長になりがちな点と、コピペミス等で不具合が発生する原因になりそうであったため、少し気になりました。

    上記2点をとりあえず解決するという目的で、自分ならこうするかな? という観点でコードを記載させていただきます。

    先に述べました通り、gameMakerには疎いため、文法等に不備等がありましたらご容赦ください。(withってなんやレベルでした)
    あくまで考え方のひとつとして見ていただければと思います。

    function character(_obj) constructor {
    	obj = _obj;
    	cnt;
    
    	current_motion;
    	idle = new motion(obj, spr_player_idle, 60, 0.01);
    	walk = new motion(obj, spr_player_walk, 60, 0.2, 2);
    	
    	init = function() {
    		cnt = 0;
    		idle.next_motion = walk;
    		walk.next_motion = idle;
    		current_motion = idle;
    	}
    	
    	loop = function() {
    		if (cnt >= current_motion.limit) {
    			current_motion = current_motion.next_motion();
    			cnt = 0;
    			obj.sprite_index = current_motion.sprite;
    			obj.image_speed = current_motion.image_speed;
    		}
    		current_motion.action();
    		cnt++;
    	}
    }
    
    function idle(_obj, _sprite, _image_speed, _limit) constructor
    {
    	obj = _obj;
    	sprite = _sprite;
    	image_speed = _image_speed;
    	limit = _limit;
    
    	next_motion;
    	
    	action = function() {
    	}
    }
    
    function walk(_obj, _sprite, _imgspd, _limit, _speed) constructor
    {
    	obj = _obj;
    	sprite = _sprite;
    	image_speed = _image_speed;
    	limit = _limit;
    	speed = _speed;
    	next_motion;
    
    	action = function() {
    		with (obj) x += speed;
    	}
    }
    

    以下、メモ書きです。

    それっぽくかんがえたこと

    • idleとwalkのインスタンスを別の構造体の中に持たせてみた
        newしないで切り替えできるように
        (ここだけ見ると構成的にo_playerに持たせてもよさそうな?)
        ついでにidleとwalkで共通していた処理も1か所書けばいいようになった気がする
    • 現在のモーション(idleかwalk)を、current_motionに保持
        何かしら実行するときはこれだけ見てればいい
        gameMakerで出来るかどうかは知見のなさ故に不明瞭ですが、たぶんできるやろの精神
    • idleとwalkに、次の遷移先を持たせる
        本当はアドレス指定よりKey値で指定できる形が望ましいと思いますが、とりあえずの形で
        切り替えるときはloopで60cntした時だったところを、limit変数にしてみた
        limitもidleとかに持たせたのでidleは60f, walkは40fとか個別指定もできるかも?
    • idleとwaikからマジックナンバーを消してみた
        全く別のobjからもidleやwalkが使える
        移動量とかも全部インスタンス生成時に設定できるからmotionで指定するとかできそうな気がする
        汎用性は低そうなのでそこまでする必要があるかどうかは不明
    • ソースよりコメントに時間がかかってしまった
        長文になってしまい申し訳ございませぬ・・・