【phina.js】게임 작성 튜토리얼(15퍼즐)(그 2)【숫자의 표시】

※지금까지의 Tips는 phina.js 튜토리얼 모음 에 정리하고 있습니다.

(그 1)【피스의 배치】 ←→ (그 3)【피스의 터치】

이번 목표



마지막에는 15 퍼즐 조각을 배치했습니다. 이번에는 다음과 같이 15 퍼즐 조각에 숫자를 표시합니다.



코드는 다음과 같습니다.
phina.globalize();
// 定数
var SCREEN_WIDTH = 640;            // 画面横サイズ
var SCREEN_HEIGHT = 960;           // 画面縦サイズ
var GRID_SIZE = SCREEN_WIDTH / 4;  // グリッドのサイズ
var PIECE_SIZE = GRID_SIZE * 0.95; // ピースの大きさ
var PIECE_NUM_XY = 4;              // 縦横のピース数
var PIECE_OFFSET = GRID_SIZE / 2;  // オフセット値
// メインシーン
phina.define('MainScene', {
  superClass: 'DisplayScene',
  // コンストラクタ
  init: function() {
    // 親クラス初期化
    this.superInit();
    // 背景色
    this.backgroundColor = 'gray';
    // グリッド
    var grid = Grid(SCREEN_WIDTH, PIECE_NUM_XY);
    // ピースグループ
    var pieceGroup = DisplayElement().addChildTo(this);
    // ピース配置
    PIECE_NUM_XY.times(function(spanX) {
      PIECE_NUM_XY.times(function(spanY) {
        // 番号
        var num = spanY * PIECE_NUM_XY + spanX + 1;
        // ピース作成
        var piece = Piece(num).addChildTo(pieceGroup);
        // Gridを利用して配置
        piece.x = grid.span(spanX) + PIECE_OFFSET;
        piece.y = grid.span(spanY) + PIECE_OFFSET;
        // 16番のピースは非表示
        if (num === 16) piece.hide();
      });
    });
  },
});
// ピースクラス
phina.define('Piece', {
  // RectangleShapeを継承
  superClass: 'phina.display.RectangleShape',
    // コンストラクタ
    init: function(num) {
      // 親クラス初期化
      this.superInit({
        width: PIECE_SIZE,
        height: PIECE_SIZE,
        cornerRadius: 10,
        fill: 'silver',
        stroke: 'white',
      });
      // 数字
      this.num = num;
      // 数字表示用ラベル
      this.label = Label({
        text: this.num + '',
        fontSize: PIECE_SIZE * 0.8,
        fill: 'white',
      }).addChildTo(this);
    },
});
// メイン
phina.main(function() {
  var app = GameApp({
    startLabel: 'main',
  });
  app.run();
});

[runstant로 확인]

코드 설명



숫자 표시



숫자를 표시하려면 Label 클래스를 사용합니다. 이를 위해 Piece 클래스를 다음과 같이 변경합니다.
// ピースクラス
phina.define('Piece', {
  // RectangleShapeを継承
  superClass: 'RectangleShape',
    // コンストラクタ
    init: function(num) {
      // 親クラス初期化
      this.superInit({
        width: PIECE_SIZE,
        height: PIECE_SIZE,
        cornerRadius: 10,
        fill: 'silver',
        stroke: 'white',
      });
      // 数字
      this.num = num;
      // 数字表示用ラベル
      this.label = Label({
        text: this.num + '',
        fontSize: PIECE_SIZE * 0.8,
        fill: 'white',
      }).addChildTo(this);
    },
});

  • init 함수에 num이라는 인수를 만들고 초기화 시 숫자를 제공합니다.

  • this.num에 주어진 값을 유지합니다.

  • Label의 text 속성에 주어진 숫자를 설정하여 addChildTo로 this(Piece)에 추가합니다. 아울러, 폰트 사이즈와 색을 설정하고 있습니다. 조각의 자식 요소로 레이블을 추가하면 조각이 움직일 때도 레이블이 따라갑니다.

  • 숫자 계산


    // ピース配置
    PIECE_NUM_XY.times(function(spanX) {
      PIECE_NUM_XY.times(function(spanY) {
        // 番号
        var num = spanY * PIECE_NUM_XY + spanX + 1;
        // ピース作成
        var piece = Piece(num).addChildTo(pieceGroup);
        // Gridを利用して配置
        piece.x = grid.span(spanX) + PIECE_OFFSET;
        piece.y = grid.span(spanY) + PIECE_OFFSET;
        // 16番のピースは非表示
        if (num === 16) piece.hide();
      });
    });
    
  • 숫자는 MainScene 조각을 배치하는 루프 처리에서 올바른 값이되도록 계산하여 Piece에 인수로 제공합니다.
  • 루프에서는 16번까지의 숫자가 작성됩니다만, 15퍼즐에서는 16번은 불필요하므로, 조건으로 16번의 피스는 공백으로 간주해 hide를 사용해 비표시로 하고 있습니다.

  • 이번에는 여기까지



    지금까지 각 조각의 중심에 숫자가 표시됩니다.
    다음 번에는 조각에 터치 이벤트를 추가하고 싶습니다.

    (그 1)【피스의 배치】 ←→ (그 3)【피스의 터치】

    좋은 웹페이지 즐겨찾기