[phina.js] 마리오 같은 적을 무찌르는 효과.

글쓰기에 전념하고 있다
https://zenn.dev/alkn203/books/phina-tips-rewrite

개시하다


마리오 시리즈가 대표하는 것처럼 적들이 위에서 밟을 때 무너지는 효과는 액션 게임에서 이미 고정되어 있다.
이번에 적의 붕괴 효과는 피나였다.js로 표현해 봐.

대상을 이해하는 오리진

  • 이번 목적을 실현하기 위해 대상의origin을 변경할 필요가 있다.

  • phina.js의 대상은origin 속성이 있습니다. 지정한 위치, 회전, 확대, 축소의 기준입니다.

  • Vector2 클래스 형식, 기본값은 (0.5.5) 객체의 중심입니다.

  • 적 붕괴 효과

  • 적 붕괴 애니메이션 사용 트위너.

  • SccalleY 값을 변경하고 세로로 줄입니다.
  • // 縦方向に縮小
    bugbow.tweener.clear().to({scaleY: 0.1}, 200);
    
  • 기대했던 결과는 희망 하향 붕괴였지만, 지금 이러면 중심을 향해 축소돼 예상한 결과를 얻지 못할 것으로 보인다.
  • origin이 대상의 중심이기 때문이다.
  • origin의 변경 및 위치 조정

  • 아래로 축소하려면origin을 (0.51.0)로 변경하십시오.
  • 수정된origin은 대상 위치의 기준이기 때문에 수정된origin을 위로 이동하여 위치를 조정합니다.
  • // origin変更
    bugbow.setOrigin(0.5, 1.0);
    // 位置調整
    bugbow.y += bugbow.height / 2;
    // 縦方向に縮小
    bugbow.tweener.clear().to({scaleY: 0.1}, 200);
    

    끝말


    실제로 적들이 궤멸한 팽이 이미지를 준비해 프레임을 전환하는 것이 더 효율적일 수 있다.나는 이번 내용은 어쨌든 한 가지 방법을 고려해야 한다고 생각한다.

    샘플 코드


    코드 보기
    phina.globalize();
    // アセット
    var ASSETS = {
      // 画像
      image: {
        'tiles': 'https://cdn.jsdelivr.net/gh/alkn203/assets_etc/tiles.png',
        'bugbow': 'https://cdn.jsdelivr.net/gh/alkn203/assets_etc/bugbow.png',
      },
    };
    // 定数
    var GRID_SIZE = 64; // グリッドのサイズ
    // ステージデータ
    var STAGE = ['4444444444',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4333333334',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004',
                 '4000000004'];
                 
    // メインシーン
    phina.define('MainScene', {
      superClass: 'DisplayScene',
      // コンストラクタ
      init: function() {
        // 親クラス初期化
        this.superInit();
        // 背景色
        this.backgroundColor = 'skyblue';
        // グリッド
        this.gx = Grid(640, 10);
        this.gy = Grid(960, 15);
        // グループ
        this.objectGroup = DisplayElement().addChildTo(this);
        this.setStage(STAGE);
    
        var stone = RectangleShape({
          fill: 'gray',
          cornerRadius: 10,
        }).addChildTo(this);
        // 落下
        stone.setPosition(this.gx.center(), this.gy.center(-4)).physical.gravity.y = 0.5;
        
        var bugbow = Sprite('bugbow', GRID_SIZE, GRID_SIZE).addChildTo(this);
        bugbow.setPosition(this.gx.center(), this.gy.center(1));
        // 潰れイベント(1回限り)
        bugbow.one('stump', function() {
          // origin変更
          bugbow.setOrigin(0.5, 1.0);
          // 位置調整
          bugbow.y += bugbow.height / 2;
          // 縦方向に縮小
          bugbow.tweener.clear().to({scaleY: 0.1}, 200);
        });
        
        this.update = function() {
          // 当たり判定
          if (stone.hitTestElement(bugbow)) {
            stone.remove();
            bugbow.flare('stump');
          }
        };
      },
      // マップ作成
      setStage: function(stage) {
        var half = GRID_SIZE / 2;
        var self = this;
        // マップデータをループ
        stage.each(function(arr, j) {
          // 文字列を配列に変換
          arr.toArray().each(function(id, i) {
            var x = self.gx.span(i) + half;
            var y = self.gx.span(j) + half;
            // 空白以外の場合
            if (id > 0) {
              // タイルセットからスプライト作成
              var elem = Sprite('tiles', GRID_SIZE, GRID_SIZE).addChildTo(self.objectGroup);
              elem.setPosition(x, y);
              // フレームインデックス指定
              elem.frameIndex = id - 1;
              return;
            }
          });
        });
      },
    });
    // メイン
    phina.main(function() {
      var app = GameApp({
        startLabel: 'main',
        // アセット読み込み
        assets: ASSETS,
      });
      
      app.run();
    });
    

    runstant 프로젝트


    https://runstant.com/alkn203/projects/b748b651

    좋은 웹페이지 즐겨찾기