Skip to content

Latest commit

Β 

History

History
310 lines (243 loc) Β· 15.6 KB

Phaser.js.md

File metadata and controls

310 lines (243 loc) Β· 15.6 KB

Phaser.js

Phaser.jsλŠ” JavaScript둜 개발된 2D κ²Œμž„μ„ λ§Œλ“€κΈ° μœ„ν•œ ν”„λ ˆμž„μ›Œν¬λ‘œ, κ²Œμž„ 루프, 물리 엔진, μ• λ‹ˆλ©”μ΄μ…˜, μž…λ ₯ 처리 λ“± 기본적인 κ²Œμž„ κ°œλ°œμ— ν•„μš”ν•œ λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

  • 직관적인 API둜 μ‰½κ²Œ κ²Œμž„μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 2D κ²Œμž„μ— μ΅œμ ν™”λ˜μ–΄ 있으며, 타일맡, 물리 엔진, 좩돌 처리 등을 기본적으둜 μ§€μ›ν•©λ‹ˆλ‹€.

PhaserλŠ” 기본적으둜 WebGL을 μ‚¬μš©ν•˜μ—¬ κ·Έλž˜ν”½μ„ λ Œλ”λ§ν•©λ‹ˆλ‹€. WebGL은 λΈŒλΌμš°μ €μ—μ„œ ν•˜λ“œμ›¨μ–΄ 가속을 ν™œμš©ν•˜μ—¬ κ·Έλž˜ν”½ λ Œλ”λ§ μ„±λŠ₯을 μ΅œμ ν™”ν•©λ‹ˆλ‹€.

const config = {
	type: Phaser.AUTO,
	width: window.innerWidth,
	height: window.innerHeight,
	scene: {
		preload:  preload,
		create:  create,
		update:  update
	},
};

const game = new Phaser.Game(config);

function preload() {

}

function create() {

}

function update() {

}

Phaser.GameObject

μ „λ°˜μ μΈ κ²Œμž„ μ˜€λΈŒμ νŠΈκ°€ μƒμ†ν•˜λŠ” μƒμœ„ κ°μ²΄μž…λ‹ˆλ‹€.

객체 생성

μ˜€λΈŒμ νŠΈλŠ” 보톡 this.add λ©”μ„œλ“œλ₯Ό 톡해 μƒμ„±λ©λ‹ˆλ‹€.

Phaser.GameObjects.Sprite 객체λ₯Ό μƒμ„±ν•˜μ—¬ 씬에 μΆ”κ°€:

const sprite = this.add.sprite(100, 100, 'textureKey');

객체 μ‚­μ œ

  • Phaser 씬에 μΆ”κ°€λœ κ²Œμž„ 였브젝트(this.add.*)λŠ” 기본적으둜 씬이 μ’…λ£Œλ˜λ©΄ Phaserκ°€ μžλ™μœΌλ‘œ μ •λ¦¬ν•©λ‹ˆλ‹€.
  • μ „μ—­ λ³€μˆ˜λ‘œ μƒμ„±λ˜κ±°λ‚˜ μ”¬μ˜ 라이프사이클 μ™ΈλΆ€μ—μ„œ κ΄€λ¦¬λ˜λŠ” κ°μ²΄λŠ” μˆ˜λ™μœΌλ‘œ destroy()λ₯Ό ν˜ΈμΆœν•΄μ•Ό μ œκ±°λ©λ‹ˆλ‹€.
  • 이벀트 λ¦¬μŠ€λ„ˆ, 타이머, μ»€μŠ€ν…€ 데이터 ꡬ쑰에 μ €μž₯된 μ°Έμ‘°λŠ” 가비지 컬렉터가 ν•΄μ œν•˜μ§€ λͺ»ν•  수 μžˆμœΌλ―€λ‘œ λͺ…μ‹œμ μœΌλ‘œ μ œκ±°ν•΄μ•Ό ν•©λ‹ˆλ‹€.
// μΊ”λ²„μŠ€ μˆ˜λ™ 정리
canvas = null; // λͺ…μ‹œμ μœΌλ‘œ μ°Έμ‘° ν•΄μ œ

destroy()

destroy()** λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 였브젝트λ₯Ό μ”¬μ—μ„œ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ°Έμ‘° μ—­μ‹œ 제거되며, 이후 JavaScript의 가비지 컬렉터에 μ˜ν•΄ λ©”λͺ¨λ¦¬κ°€ νšŒμˆ˜λ©λ‹ˆλ‹€.

sprite.destroy();

destroy()λ₯Ό ν˜ΈμΆœν•œ ν›„μ—λŠ” ν•΄λ‹Ή μ˜€λΈŒμ νŠΈμ— μ ‘κ·Όν•˜μ§€ μ•Šλ„λ‘ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

name

  • 이름을 톡해 객체λ₯Ό μ‹λ³„ν•˜κ³  검색할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λ¦„μ˜ νƒ€μž…μ€ 일반적으둜 λ¬Έμžμ—΄μ΄λ©°, 쀑볡될 수 μžˆμŠ΅λ‹ˆλ‹€.

setName

  • Phaser.GameObjects의 이름을 μ„€μ •ν•©λ‹ˆλ‹€.

id

  • μ•„μ΄λ””λŠ” μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ 객체 κ°„ 고유 식별을 μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ•„μ΄λ””μ˜ νƒ€μž…μ€ 일반적으둜 μ •μˆ˜μ΄λ©°, 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

setID

  • Phaser.GameObjects의 아이디λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

getBounds

  • getBounds()λŠ” ν•΄λ‹Ή 객체의 경계 μ‚¬κ°ν˜•(Rectangle)을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€. 주둜 좩돌 κ°μ§€λ‚˜ 객체의 μœ„μΉ˜ 및 크기λ₯Ό νŒŒμ•…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • getBounds() λ©”μ„œλ“œμ˜ 초기 값은 ν•΄λ‹Ή 객체의 λ Œλ”λ§λ˜λŠ” 이미지에 μ˜ν•΄ μžλ™μœΌλ‘œ κ²°μ •λ©λ‹ˆλ‹€.
  • 객체의 ν¬κΈ°λ‚˜ μœ„μΉ˜κ°€ λ³€ν•  λ•Œ getBounds()λŠ” μžλ™μœΌλ‘œ κ°±μ‹ λ©λ‹ˆλ‹€.
  • Phaser.GameObjects.Sprite,Phaser.GameObjects.Container, Phaser.GameObjects.Image, Phaser.GameObjects.Textμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

setActive

  • 객체가 κ²Œμž„μ˜ 논리(물리 μ—°μ‚°, 좩돌 검사 λ“±)에 μ°Έμ—¬ν•˜λŠ”μ§€λ₯Ό μ œμ–΄ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
  • true둜 μ„€μ •ν•˜λ©΄ κ°μ²΄λŠ” κ²Œμž„ λ…Όλ¦¬μ—μ„œ ν™œμ„± μƒνƒœλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.
  • false둜 μ„€μ •ν•˜λ©΄ κ°μ²΄λŠ” κ²Œμž„ λ…Όλ¦¬μ—μ„œ λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€(물리 μ—°μ‚°, 좩돌 등이 쀑지됨).

setVisible

  • 객체가 화면에 λ Œλ”λ§λ μ§€ μ—¬λΆ€λ₯Ό μ œμ–΄ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
  • true둜 μ„€μ •ν•˜λ©΄ 객체가 화면에 좜λ ₯λ©λ‹ˆλ‹€.
  • false둜 μ„€μ •ν•˜λ©΄ 객체가 화면에 λ Œλ”λ§λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (κ·ΈλŸ¬λ‚˜ μ—¬μ „νžˆ ν™œμ„± μƒνƒœμΌ 수 μžˆμŠ΅λ‹ˆλ‹€.)
    • νŠΉμ • μ‘°κ±΄μ—μ„œ 객체λ₯Ό 보이지 μ•Šκ²Œ ν•˜μ§€λ§Œ μ—¬μ „νžˆ 좩돌 검사λ₯Ό μˆ˜ν–‰.

Phaser.GameObjects.Container

  • μ—¬λŸ¬ GameObjects 객체듀을 계측적 ꡬ쑰둜 λ¬ΆλŠ” κ°μ²΄μž…λ‹ˆλ‹€. (GameObjectsκ°€ μ•„λ‹Œ κ°μ²΄λŠ” 좔가될 수 μ—†μŠ΅λ‹ˆλ‹€.)
  • μ»¨ν…Œμ΄λ„ˆ λ‚΄ 객체듀은 μ»¨ν…Œμ΄λ„ˆμ˜ 트랜슀폼(μœ„μΉ˜, 크기, νšŒμ „) μš”μ†Œμ— 영ν–₯을 λ°›μŠ΅λ‹ˆλ‹€.
  • λ‚΄λΆ€ 객체듀은 λ°°μ—΄ ꡬ쑰둜 μ €μž₯되며, 이 배열을 μ‚¬μš©ν•˜μ—¬ μ°Έμ‘°ν•˜κ±°λ‚˜ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

list

  • list 속성은 μžμ‹ 객체듀을 μ €μž₯ν•œ 배열을 μ°Έμ‘°ν•©λ‹ˆλ‹€. 이 배열을 톡해 μžμ‹ 객체λ₯Ό 인덱슀둜 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
const container = new Phaser.GameObjects.Container(scene, x, y);
const sprite1 = this.add.sprite(0, 0, 'spriteKey');
const sprite2 = this.add.sprite(50, 50, 'spriteKey');

container.add(sprite1);
container.add(sprite2);

const firstChild = container.list[0]; // sprite1
const secondChild = container.list[1]; // sprite2

getByName

  • getByName λ©”μ„œλ“œλ₯Ό 톡해 ν•΄λ‹Ή μ΄λ¦„μ˜ μžμ‹ 객체λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν•œ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 같은 이름을 가진 μžμ‹ 객체가 μ—¬λŸ¬ 개 μ‘΄μž¬ν•  경우, 처음으둜 μΆ”κ°€λœ μžμ‹ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)μž…λ‹ˆλ‹€. (n: μžμ‹ 객체의 수)
const container = new Phaser.GameObjects.Container(scene, x, y);
const sprite1 = this.add.sprite(0, 0, 'spriteKey').setName('sprite1');
const sprite2 = this.add.sprite(50, 50, 'spriteKey').setName('sprite2');

container.add(sprite1);
container.add(sprite2);

const sprite = container.getByName('sprite1'); // sprite1

getByID

  • getByID λ©”μ„œλ“œλ₯Ό 톡해 ν•΄λ‹Ή ID에 λŒ€μ‘λ˜λŠ” μžμ‹ 객체λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)μž…λ‹ˆλ‹€. (n: μžμ‹ 객체의 수)
const container = new Phaser.GameObjects.Container(this, 100, 100);
const sprite1 = this.add.sprite(0, 0, 'spriteKey').setID(1);
const sprite2 = this.add.sprite(50, 50, 'spriteKey').setID(2);

container.add(sprite1);
container.add(sprite2);

const spriteByID1 = container.getByID(1); // sprite1
const spriteByID2 = container.getByID(2); // sprite2

Phaser.Geom

  • μ’Œν‘œ 계산, 좩돌 검사, λ„ν˜•μ˜ 크기와 μœ„μΉ˜ νŒŒμ•… 등을 μˆ˜ν–‰ν•˜λŠ” 정적 κ°μ²΄μž…λ‹ˆλ‹€.
  • μ—¬λŸ¬ κ·Έλž˜ν”½ μš”μ†Œ(Graphics, Sprites, Tilemaps λ“±)와 κ²°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ κ·Έλž˜ν”½ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (예: μ‚¬κ°ν˜• κ·ΈλΌλ°μ΄μ…˜)

λ„ν˜•

  • μ‚¬κ°ν˜•: Phaser.Geom.Rectangle(x, y, width, height)
  • 원: Phaser.Geom.Circle(x, y, radius)

좩돌 검사

Geom λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ„ν˜•μ— λŒ€ν•œ 좩돌 검사 λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

  • μ‚¬κ°ν˜• κ°„ 좩돌: Phaser.Geom.Intersects.RectangleToRectangle
  • μ›ν˜• κ°„ 좩돌: Phaser.Geom.Intersects.CircleToCircle
  • μ‚¬κ°ν˜•κ³Ό 원 κ°„ 좩돌: Phaser.Geom.Intersects.RectangleToCircle

κ°„λ‹¨ν•œ λ„ν˜•(μ‚¬κ°ν˜•, 원) κ°„μ˜ μΆ©λŒμ€ λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)μž…λ‹ˆλ‹€.

Physics

PhaserλŠ” 였브젝트의 물리적 λ™μž‘μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λ‚΄μž₯ 물리 엔진을 μ œκ³΅ν•˜λ©°, 이동, 좩돌, 쀑λ ₯, 속도, 탄성 λ“± λ³΅μž‘ν•œ 물리적인 λ™μž‘μ„ μ‰½κ²Œ κ΅¬ν˜„ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

PhaserλŠ” 2가지 μ£Όμš” 물리 엔진을 μ§€μ›ν•©λ‹ˆλ‹€:

  1. Arcade Physics:
    • 가볍고 λΉ λ₯Έ 2D 물리 엔진.
    • 좩돌 검사와 κ°„λ‹¨ν•œ 물리 λ™μž‘μ— 적합.
    • 속도(velocity), 쀑λ ₯(gravity), 반발λ ₯(bounce) 같은 νŠΉμ„±μ„ 지원.
  2. Matter.js:
    • 더 λ³΅μž‘ν•˜κ³  ν˜„μ‹€μ μΈ 물리 λ™μž‘μ„ κ΅¬ν˜„ κ°€λŠ₯.
    • μ‹€μ œ 물리 μ—”μ§„μ²˜λŸΌ λ™μž‘(마찰, νšŒμ „, 토크 λ“±).

Phaser.GameObjects.Group

Phaser.GameObjects.Group은 λ‹€μˆ˜μ˜ 객체λ₯Ό κ΄€λ¦¬ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. κ·Έλ£Ή λ‚΄ κ°μ²΄λŠ” μ„œλ‘œ 독립적이며, κ°œλ³„μ μœΌλ‘œ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

new Phaser.GameObjects.Group(scene, children, config)
  • scene: 그룹이 μ†ν•˜λŠ” 씬(Scene) κ°μ²΄μž…λ‹ˆλ‹€.
  • children: 그룹에 μΆ”κ°€ν•  초기 κ²Œμž„ 였브젝트 λ°°μ—΄μž…λ‹ˆλ‹€.
  • config: 그룹의 λ™μž‘ 방식을 μ •μ˜ν•˜λŠ” μ„€μ • κ°μ²΄μž…λ‹ˆλ‹€.

config 속성

  1. classType: 그룹에 μΆ”κ°€λ˜λŠ” 객체의 κΈ°λ³Έ 클래슀λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. κΈ°λ³Έ 값은 Phaser.GameObjects.GameObjectκ°€ μ‚¬μš©λ©λ‹ˆλ‹€.
  2. maxSize: 그룹에 좔가될 수 μžˆλŠ” μ΅œλŒ€ 객체 수λ₯Ό μ œν•œν•©λ‹ˆλ‹€. 객체 κ°œμˆ˜κ°€ μ΅œλŒ€ μ œν•œμ— λ„λ‹¬ν–ˆμ„ λ•Œ, μƒˆλ‘œμš΄ 객체λ₯Ό μΆ”κ°€ν•˜λ €κ³  ν•˜λ©΄ 객체가 μΆ”κ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. maxSizeκ°€ μ„€μ •λœ 그룹은 객체 풀링이 ν™œμ„±ν™”λ˜λ©°, 0이면 객체 풀링이 λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€.
  3. defaultKey: 그룹에 좔가될 객체의 κΈ°λ³Έ ν…μŠ€μ²˜ ν‚€λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  4. defaultFrame: κΈ°λ³Έ ν…μŠ€μ²˜μ˜ ν”„λ ˆμž„μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  5. runChildUpdate: true둜 μ„€μ •ν•˜λ©΄ 그룹의 λͺ¨λ“  μžμ‹ κ°μ²΄μ—μ„œ update() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. κΈ°λ³Έ 값은 trueμž…λ‹ˆλ‹€.
  6. createCallback: 그룹에 객체가 좔가될 λ•Œ μ‹€ν–‰λ˜λŠ” 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
  7. removeCallback: κ·Έλ£Ήμ—μ„œ 객체가 제거될 λ•Œ μ‹€ν–‰λ˜λŠ” 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.

μ£Όμš” λ©”μ„œλ“œ

  • get(): κ·Έλ£Ήμ—μ„œ λΉ„ν™œμ„±ν™”λœ 객체λ₯Ό 1개 κ°€μ Έμ˜΅λ‹ˆλ‹€. λΉ„ν™œμ„±ν™”λœ 객체가 μ—†μœΌλ©΄, μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • add(): ν•˜λ‚˜ μ΄μƒμ˜ 객체λ₯Ό 그룹에 μΆ”κ°€ν•©λ‹ˆλ‹€.
  • create(): 그룹에 μƒˆλ‘œμš΄ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μΆ”κ°€ν•©λ‹ˆλ‹€.
  • getChildren(): 그룹에 ν¬ν•¨λœ λͺ¨λ“  μžμ‹ 객체λ₯Ό λ°°μ—΄ ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • remove(): κ·Έλ£Ήμ—μ„œ νŠΉμ • 객체λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.

객체 풀링

maxSize`κ°€ μ„€μ •λœ 그룹은 객체 풀링이 μ μš©λ©λ‹ˆλ‹€. 객체 풀링은 μƒˆ 객체λ₯Ό 계속 μƒμ„±ν•˜κ³  μ‚­μ œν•˜λŠ” λŒ€μ‹ , μž¬μ‚¬μš© κ°€λŠ₯ν•œ 객체의 "ν’€(pool)"을 μœ μ§€ν•˜μ—¬ ν•„μš”μ— 따라 ν™œμ„±ν™”ν•˜κ±°λ‚˜ λΉ„ν™œμ„±ν™”ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 GC(Garbage Collection)둜 μΈν•œ μ„±λŠ₯ μ €ν•˜λ₯Ό 쀄이고 κ²Œμž„ μ‹€ν–‰ μ€‘μ˜ ν”„λ ˆμž„ 속도λ₯Ό μ•ˆμ •μ μœΌλ‘œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

// κ·Έλ£Ή 생성
this.bullets = this.add.group({
    classType: Phaser.GameObjects.Sprite,
    maxSize: 20,
    runChildUpdate: true,
    createCallback: (obj) => {
        console.log(`${obj.texture.key} added to the group`);
    },
    removeCallback: (obj) => {
        console.log(`${obj.texture.key} removed from the group`);
    }
});

// 객체 ν™œμ„±
function fireBullet(x, y) {
    const bullet = this.bullets.get(x, y);
    if (bullet) {
        bullet.setActive(true).setVisible(true);
        bullet.body.velocity.y = -300;
    }
}

// 객체 λΉ„ν™œμ„±
function resetBullet(bullet) {
    bullet.setActive(false).setVisible(false);
    bullet.body.stop();
}

Graphic

Phaser.Textures.Texture

  • 이미지, μΊ”λ²„μŠ€, λΉ„λ””μ˜€ λ“± λ‹€μ–‘ν•œ λ―Έλ””μ–΄λ₯Ό κ²Œμž„ μ”¬μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 기본적인 μžλ£Œμž…λ‹ˆλ‹€.
  • name 속성(ν…μŠ€μ²˜μ˜ 이름)은 ν•΄λ‹Ή ν…μŠ€μ²˜λ₯Ό μ‹λ³„ν•˜λŠ” ν…μŠ€μ²˜ ν‚€μž…λ‹ˆλ‹€. 이 ν‚€λŠ” Phaserμ—μ„œ ν…μŠ€μ²˜λ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜ 관리할 λ•Œ μ‚¬μš©ν•˜λŠ” κ³ μœ ν•œ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

HTML.Canvas

  • <canvas> νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄ μ •κ΅ν•˜κ³  λ³΅μž‘ν•œ 동적 κ·Έλž˜ν”½μ„ 자유둭게 그릴 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μΊ”λ²„μŠ€λ‘œ 그릴 λ•ŒλŠ” GPU 가속을 ν™œμš©ν•˜μ§€ μ•Šκ³  CPU 기반 λ Œλ”λ§μ„ ν•˜λ―€λ‘œ μ„±λŠ₯에 뢀담이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 정적 이미지일 λ•Œ, ν•„μš”ν•œ 이미지λ₯Ό μΊ”λ²„μŠ€λ‘œ 1번만 μƒμ„±ν•˜κ³  이λ₯Ό ν…μŠ€μ²˜μ™€ μŠ€ν”„λΌμ΄νŠΈλ‘œ μΊμ‹œν•˜λ©΄ λ™μž‘ μ€‘μ—λŠ” μΊ”λ²„μŠ€μ˜ μ„±λŠ₯ 뢀담을 없앨 수 μžˆμŠ΅λ‹ˆλ‹€.

Phaser.GameObjects.Graphics

  • 정적 κΈ°λ³Έ λ„ν˜•(μ‚¬κ°ν˜•, 원, μ„  λ“±)을 μ¦‰μ‹œ μƒμ„±ν•˜κ³  λ Œλ”λ§ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μ΄ κ°„λ‹¨ν•˜κ³  직관적이며, Phaser의 λ‹€λ₯Έ μš”μ†Œμ™€ μžμ—°μŠ€λŸ½κ²Œ 톡합 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • Phaser.Graphics κ°μ²΄λŠ” WebGL의 λ°°κ²½κ³Ό ν™”λ©΄ μƒμ˜ λͺ¨λ“  κ·Έλž˜ν”½μ„ GPUμ—μ„œ μ²˜λ¦¬ν•˜λ―€λ‘œ μ„±λŠ₯이 μš°μˆ˜ν•˜κ³ , λ‹€μˆ˜μ˜ 객체λ₯Ό 그릴 λ•Œ μ„±λŠ₯μƒμ˜ 이점이 μžˆμŠ΅λ‹ˆλ‹€.
  • λ³΅μž‘ν•œ κ·Έλž˜ν”½μ„ 그리기 μ–΄λ ΅λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

Phaser.GameObjects.Sprite

  • ν…μŠ€μ³λ₯Ό 톡해 정적 κ·Έλž˜ν”½μ„ 화면에 ν‘œμ‹œν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
  • 사전 μ œμž‘λœ 이미지λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ³ μ •λœ 크기와 λͺ¨μ–‘μ˜ 였브젝트λ₯Ό 반볡적으둜 그릴 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이미 μƒμ„±λœ λ‹¨μˆœν•œ μ΄λ―Έμ§€λ‚˜ ν…μŠ€μ²˜λ₯Ό μ‚¬μš©ν•  λ•Œ μ ν•©ν•©λ‹ˆλ‹€. μΊμ‹±λœ ν…μŠ€μ²˜λ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ³΅μž‘ν•œ 효과(κ·ΈλΌλ°μ΄μ…˜, κΈ€λ‘œμš° λ“±)λ₯Ό μ μš©ν•˜κΈ° μ–΄λ ΅κ³ , 동적인 κ·Έλž˜ν”½μ„ μ‚¬μš©ν•œλ‹€λ©΄ μΆ”κ°€ μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

νŠΉμ§•

  • λ‹€μ–‘ν•œ 속성(크기, μœ„μΉ˜, νšŒμ „ λ“±)을 μ΄μš©ν•˜μ—¬ 이미지λ₯Ό λ³€ν˜•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • setDisplaySizeλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, μŠ€ν”„λΌμ΄νŠΈλŠ” 기본적으둜 ν…μŠ€μ²˜μ˜ μ›λž˜ 크기에 맞게 ν‘œμ‹œλ©λ‹ˆλ‹€.

Phaser.GameObjects.Shader

  • λ³΅μž‘ν•˜κ³  λ‹€μ΄λ‚˜λ―Ήν•œ κ·Έλž˜ν”½ 효과(κΈ€λ‘œμš°, κ·ΈλΌλ°μ΄μ…˜, μ™œκ³‘, λΉ› λ°˜μ‚¬ λ“±)λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‘°λͺ… 효과, 렌즈 ν”Œλ ˆμ–΄μ™€ 같은 λ³΅μž‘ν•œ μ‹œκ°μ  처리λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • GPUμ—μ„œ 병렬 처리둜 μ‹€ν–‰λ˜λ―€λ‘œ μ‹€μ‹œκ°„ λ Œλ”λ§ μ„±λŠ₯이 맀우 λ›°μ–΄λ‚©λ‹ˆλ‹€. λ‹€μˆ˜μ˜ μ˜€λΈŒμ νŠΈμ— λ™μΌν•œ κ·Έλž˜ν”½ 효과λ₯Ό μ μš©ν•  λ•Œλ„ νš¨μœ¨μ μž…λ‹ˆλ‹€.
  • 셰이더 ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•˜κΈ°μ— κ΅¬ν˜„ λ‚œμ΄λ„κ°€ λ†’μœΌλ©°, Phaser λ‚΄λΆ€μ—μ„œ μ„€μ • 및 디버깅이 μƒλŒ€μ μœΌλ‘œ λ³΅μž‘ν•©λ‹ˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈμ˜ ν•˜λ“œμ›¨μ–΄ 사양에 영ν–₯을 많이 λ°›μŠ΅λ‹ˆλ‹€.

비ꡐ

μ’…ν•©

방법 ν•„μš”ν•œ μˆœκ°„ μ ν•©ν•œ μ‚¬μš© 사둀 μž₯점 단점
Phaser.Graphics λ‹¨μˆœν•œ λ„ν˜•μ΄λ‚˜ 정적 κ·Έλž˜ν”½ ν•„μš”μ‹œ 정적/동적 λ„ν˜• 직관적, λΉ λ₯Έ κ΅¬ν˜„ κ°€λŠ₯ λ³΅μž‘ν•œ 효과 κ΅¬ν˜„ 어렀움, μ„±λŠ₯ μ €ν•˜ κ°€λŠ₯
Phaser.Sprite 정적 이미지λ₯Ό μ‚¬μš©ν•  λ•Œ 반볡적으둜 이미지λ₯Ό 그릴 λ•Œ ν…μŠ€μ²˜ μΊμ‹±μœΌλ‘œ μ„±λŠ₯ μ΅œμ ν™”, Phaser와 톡합 용이 λ³΅μž‘ν•œ 효과 μ œν•œ, 이미지 사전 μ€€λΉ„ ν•„μš”
HTML.Canvas Phaser μ™ΈλΆ€μ—μ„œ κ·Έλž˜ν”½ 생성 μ‹œ 동적 ν…μŠ€μ²˜ 생성, μ‚¬μš©μž 지정 효과 효과 κ΅¬ν˜„ μžμœ λ„ λ†’μŒ, Phaser와 연동 κ°€λŠ₯ CPU μ˜μ‘΄μ„± λ†’μŒ, μΆ”κ°€ λ³€ν™˜ μž‘μ—… ν•„μš”
Phaser.Shader κ³ μ„±λŠ₯ νš¨κ³Όμ™€ μ‹€μ‹œκ°„ λ Œλ”λ§ ν•„μš” μ‹œ κΈ€λ‘œμš°, κ·ΈλΌλ°μ΄μ…˜, λ¬Όκ²° 효과 λ“± GPU 처리둜 κ³ μ„±λŠ₯, λ³΅μž‘ν•œ 효과 κ°€λŠ₯ ν•™μŠ΅ 곑선 λ†’μŒ, μ„€μ • 및 디버깅 볡작
  • λ‹¨μˆœν•œ λ„ν˜• β†’ Phaser.Graphics
  • μΊμ‹±λœ 정적 이미지 β†’ Phaser.Sprite
  • κ°„λ‹¨ν•œ 동적 ν…μŠ€μ²˜ β†’ HTML.Canvas
  • μ‹€μ‹œκ°„ κ³ μ„±λŠ₯ 효과 β†’ Phaser.Shader

동적 κ·Έλž˜ν”½: 셰이더 vs μΊ”λ²„μŠ€

νŠΉμ§• 셰이더 μΊ”λ²„μŠ€
μ‹€ν–‰ μœ„μΉ˜ GPU (병렬 처리) CPU
μ„±λŠ₯ 맀우 λΉ λ₯΄κ³  효율적 μƒλŒ€μ μœΌλ‘œ 느리며 CPU λΆ€ν•˜ 증가
κ·ΈλΌλ°μ΄μ…˜ 및 효과 κ³ μ†μœΌλ‘œ λ³΅μž‘ν•œ 효과 적용 κ°€λŠ₯ μƒλŒ€μ μœΌλ‘œ λ³΅μž‘ν•œ μ²˜λ¦¬μ— 느림
μ‚¬μš©λ²• κ³ κΈ‰ GPU ν”„λ‘œκ·Έλž˜λ° 지식 ν•„μš” 직관적이고 μ‚¬μš©μ΄ 쉬움
ν˜Έν™˜μ„± 거의 λͺ¨λ“  λΈŒλΌμš°μ € 및 κΈ°κΈ° 지원 μ΅œμ‹  λΈŒλΌμš°μ € 및 고사양 GPU ν•„μš”
  • μ‹€μ‹œκ°„ 동적 처리 및 λ³΅μž‘ν•œ κ·Έλž˜ν”½ 효과 β†’ Phaser.Shader
  • κ°„λ‹¨ν•œ κ·Έλž˜ν”½ 및 μΌνšŒμ„± 정적 λ Œλ”λ§ β†’ HTML.Canvas

Audio

Audio

  • Phaser의 preload λ‹¨κ³„μ—μ„œ λ‘œλ“œλœ μ˜€λ””μ˜€ 파일 λ¦¬μ†ŒμŠ€μž…λ‹ˆλ‹€. 원본 데이터λ₯Ό μ œκ³΅ν•˜λ©°, μ—¬λŸ¬ μ‚¬μš΄λ“œ μΈμŠ€ν„΄μŠ€κ°€ 이 데이터λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
this.load.audio('bgMusic', 'assets/audio/background.mp3');

bgMusic은 μ˜€λ””μ˜€ 파일 λ¦¬μ†ŒμŠ€μ˜ ν‚€μž…λ‹ˆλ‹€.

Sound

  • audioλ₯Ό 기반으둜 μƒμ„±λœ μ˜€λ””μ˜€ μž¬μƒ μ»¨νŠΈλ‘€λŸ¬μž…λ‹ˆλ‹€. μ˜€λ””μ˜€λ₯Ό μž¬μƒ, μΌμ‹œ 정지, 쀑지, λ³Όλ₯¨ 쑰절 λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
const bgSound = this.sound.add('bgMusic', { loop: true, volume: 0.5 });
bgSound.play();