updated_at: 2024-12-15 04:08

#TileMap https://rexrainbow.github.io/phaser3-rex-notes/docs/site/tilemap/ tilemap.json (예)

....
"layers":[
  {
  "data":[
    0, 0, 101, 101, 101, 0, 0, 0, 0, 0,
    0, 0, 101, 65, 101, 0, 0, 0, 0, 0,
    0, 0, 101, 0, 101, 101, 101, 101, 0, 0,
    101, 101, 101, 10, 0, 10, 65, 101, 0, 0,
    101, 65, 0, 10, 53, 101, 101, 101, 0, 0,
    101, 101, 101, 101, 10, 101, 0, 0, 0, 0,
    0, 0, 0, 101, 65, 101, 0, 0, 0, 0,
    0, 0, 0, 101, 101, 101, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  ],
  "height":10,
  "width":10,
....
"tilesets":[
  {
    "image":"./tilesheet.png",
    "name":"TileSetName",
  }],
"tilewidth":64,
"type":"map",
"version":1.2,
"width":10
}

1. Load tile map
- scene.load.tilemapTiledJSON(key, url);  // JSON
- scene.load.tilemapCSV(key, url);          // CSV

2. Add tile map object¶
3 Create
- Create map from tiled
* var map = scene.add.tilemap(key);
- Create map from 2d array
var map = this.make.tilemap({
  // data: tileIdxArray,  // [ [], [], ... ]
  tileWidth: 32,
  tileHeight: 32,
  width: 10,
  height: 10
});

- Create map from csv
var map = this.make.tilemap({
  key: 'map',     // csv file
  tileWidth: 32,
  tileHeight: 32
});

4. Add tileset image
var tileset = map.addTilesetImage(tilesetName, key);
preload() {
  this.load.tilemapTiledJSON('tilemap', `tilemap.json`);
  this.load.spritesheet('tileImage', 'tilesheet.png', {
    frameWidth: 64,
    startFrame: 0
  })
}

JSON 형식의 timemap 과 이미지 형식의 tiles 를 로드한다.

create() { // d: { level: number }
  const map = this.make.tilemap({ key: 'tilemap' });
  // 로드된 tilemap 파일을 tilemap 형식으로 만들어 준다.
  const tiles = map.addTilesetImage('TileSetName', 'tileImage');
  // map 에 정의된 tilesets 의 name 과 tileImage 를 맵핑하여 tiles에 정의한다.

  this.layer = map.createLayer('Level', tiles, 0, 0);

  this.player = this.layer.createFromTiles(53, 0, { key: 'tiles', frame: 52 }).pop();
  this.player?.setOrigin(0);
}

이미지를 fremeWidth 만큼 이동시키면서 (0 ~ ) 분리한다. json 파일의 data를 width와 height 맞게 배치한 후 그 이미지를 자동으로 출력한다.

tileset 으로 사용하기 위해 맵(this.make.tilemap)에 이미지를 추가한다.

addTilesetImage(tilesetName, [key], [tileWidth], [tileHeight], [tileMargin], [tileSpacing], [gid])

타일셑에 레이어를 만든다., x, y는 는 world에서의 x, y 포지션이다.

createLayer(layerID, tileset [, x] [, y])
createFromTiles(indexes, replacements, spriteConfig, [scene], [camera], [layer])

spriteConfig : {key, frame}

// 설명
this.layer = map.createLayer('Level', tiles, 0, 0);
this.player = this.layer.createFromTiles(13, 0, { key: 'tileImage', frame: 52 }).pop();
현재 레이어의 tiles 의 13 이라는 값이 있는 곳에 13을 0으로 바꾸고  tileImage의 52번째 프레임으로 바꾼다.
layer.createFromTiles(color, 0, { key: 'tileImage', frame: color })
  .map((box: any) => box.setOrigin(0)); <!-- 각 box에 setOrigin을 적용

spriteConfig key : The key of the Texture this Game Object will use to render with, as stored in the Texture Manager frame : An optional frame from the Texture this Game Object is rendering with.

Table of contents 목차

    평점을 남겨주세요
    평점 : 5.0
    총 투표수 : 1

    질문 및 답글