2 DのRPGキャラクター移動コード(egretゲームエンジン、Type Script言語を例に)

5138 ワード

一般的な2 DのRPGの人物の移動は3種類あります:
(一)背景固定、キャラクター移動
(二)キャラクター固定、背景移動
(3)キャラクタの移動、バックグラウンドの動的移動
第1種は移動端でのゲームは比較的に珍しいが、PC端でのシミュレーション類のゲームは比較的によく見られる.スクリーンが大きく、背景が固定すればいいので、キャラクターは背景の上で移動する.第二に、移動端ではよく見られますが、キャラクタは画面の真ん中に固定されており、移動する必要がある場合は背景を移動しながらキャラクタのランニングのアニメーションを再生するだけでキャラクタの移動の効果を達成することができます.3つ目は、1つ目と2つ目の結合であり、現在最も一般的な方法であり、まず背景が固定され、キャラクタが自由に移動し、画面の縁に移動すると、背景が移動してキャラクタの視野を広げるか、あるいは、まずキャラクタが中央に位置して背景が移動し、背景が画面の縁から離れようとすると、キャラクタが移動する.
この文章で、私はただ第2の方式の実現の構想を言って、第1種は非常に簡単で難しくないため、第3種はまた第1の第2種の結合で、だから先に第2種を掌握して、自然に第1種ができて、更に2種の結合は書くことができます.
Bgクラスがあると仮定し、このクラスはコンテナ精霊egretを表示する.Sprite、このクラスには公有メンバーのstone石があり、この石はキャラクターの移動を阻害している.このBgクラスをbg変数にインスタンス化します.
画面の真ん中に固定的に表示されるrole表示オブジェクトがあるとします.
私たちは第2の移動方式を実現するため、Bgという背景は移動して削除する必要があるが、勝手に移動するのではなく、背景のある目標座標をクリックする必要がある場合に移動するので、クリックイベントを偵察し、背景のある座標をクリックするとbgHandle関数を呼び出す.
    this.bg.addEventListener(egret.TouchEvent.TOUCH_TAP,  this.bgHandle,  this);

bgHandle関数は、bgアンカーに基づく位置移動点座標を決定し、bg_を定義するために使用される.move_xは移動点横座標、bg_move_yは移動点縦座標,speedは背景速度,timeOnEnterFrameは移動過程の終了時間である.
ではbg_move_xおよびbg_move_yはどうやって手に入れますか?まずクリック背景の座標evtを取得する.stageXとevt.stageY、そして横座標evtを計算する.stageX、this.player.xと縦座標evt.stageY、this.player.yのオフセット値は、この2つのオフセット値を介して現在の背景位置thisとする.bg.xとthis.bg.y対応する移動方向でbg_を算出するmove_xおよびbg_move_yでいいです.
bg移動点を取得すると、フレームイベントがリスニングされ、背景が移動点に移動しない場合、bgMove関数が呼び出される.
    private bg_move_x:number = 0;   //      
    private bg_move_y:number = 0;   //      
    private speed:number = 0.3;    //      
    private timeOnEnterFrame = 0;   //            

    public bgHandle(evt:egret.TouchEvent):void{

        if(this.bg.hasEventListener(egret.Event.ENTER_FRAME) ){
            this.bg.removeEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);
        }

        this.timeOnEnterFrame = egret.getTimer();   //               

        if(evt.stageX > this.player.x){
            this.bg_move_x = this.bg.x - (evt.stageX - this.player.x);
        }
        else if(evt.stageX < this.player.x){
            this.bg_move_x = this.bg.x + (this.player.x - evt.stageX);
        }
        if(evt.stageY > this.player.y){
            this.bg_move_y = this.bg.y - (evt.stageY - this.player.y);
        }
        else if(evt.stageY < this.player.y){
            this.bg_move_y = this.bg.y + (this.player.y - evt.stageY);
        }

        this.bg.addEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);

    }

bgMove関数bg_によるmove_xおよびbg_move_yの値はバックグラウンド移動として、各バックグラウンドは【speed*(フレームイベント毎の開始時間-終了時間)】画素のみ移動し、宛先に到達するまでフレームイベントの移動をキャンセルする.プレイヤーが突然背景の別の座標をクリックすると、bgHandle関数はフレームイベントをキャンセルし、bg_を再計算します.move_xおよびbg_move_y次に、移動フレームイベントを再リスニングしてbgMove関数を呼び出す.
    private bgMove(evt:egret.Event):void{

        var now = egret.getTimer();
        var pass = this.timeOnEnterFrame;
        var time = now - pass;

        if(this.bg.x > this.bg_move_x){

            if((this.bg.x - this.speed * time) < this.bg_move_x ){
                this.bg.x = this.bg_move_x;
            }
            else{
                this.bg.x -= this.speed * time;

                if(this.isStopMove()){
                    this.bg.x += this.speed * time;
                }
            }
        }
        else if(this.bg.x < this.bg_move_x){

            if((this.bg.x + this.speed * time) > this.bg_move_x ){
                this.bg.x = this.bg_move_x;
            }
            else{
                this.bg.x += this.speed * time;

                if(this.isStopMove()){
                    this.bg.x -= this.speed * time;
                }
            }
        }
        if(this.bg.y > this.bg_move_y){

            if((this.bg.y - this.speed * time) < this.bg_move_y ){
                this.bg.y = this.bg_move_y;
            }
            else{
                this.bg.y -= this.speed * time;

                if(this.isStopMove()){
                    this.bg.y += this.speed * time;
                }
            }
        }
        else if(this.bg.y < this.bg_move_y){

            if((this.bg.y + this.speed * time) >this.bg_move_y ){
                this.bg.y = this.bg_move_y;
            }
            else{
                this.bg.y += this.speed * time;

                if(this.isStopMove()){
                    this.bg.y -= this.speed * time;
                }
            }
        }

        this.timeOnEnterFrame = egret.getTimer();

        if(this.bg.x == this.bg_move_x && this.bg.y == this.bg_move_y){
            this.bg.removeEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);
        }
    }

bgMove関数には、キャラクタが背景の石の障害物に衝突したか否かを判断し、戻りtrueに遭遇した場合、bgMove()は戻り値に基づいて背景が移動したか否かを判断する関数isStopMove()がある.
    private isStopMove():boolean{

        if( this.bg.stone.hitTestPoint( this.player.x, this.player.y, true ) ){
            return true;
        }
        else{
            return false;
        }
    }

この数段のコードはegretゲームエンジンのRPG背景に基づいてキャラクターの移動をシミュレートする考え方で、実はコードはもっと簡素化することができますが、簡素化も分かりにくくなるので、この長いコードは辛抱強く見ても難しくありません(egretエンジンを学んだことが前提です).