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() {
}
μ λ°μ μΈ κ²μ μ€λΈμ νΈκ° μμνλ μμ κ°μ²΄μ λλ€.
μ€λΈμ νΈλ λ³΄ν΅ this.add
λ©μλλ₯Ό ν΅ν΄ μμ±λ©λλ€.
Phaser.GameObjects.Sprite
κ°μ²΄λ₯Ό μμ±νμ¬ μ¬μ μΆκ°:
const sprite = this.add.sprite(100, 100, 'textureKey');
- Phaser μ¬μ μΆκ°λ κ²μ μ€λΈμ νΈ(
this.add.*
)λ κΈ°λ³Έμ μΌλ‘ μ¬μ΄ μ’ λ£λλ©΄ Phaserκ° μλμΌλ‘ μ 리ν©λλ€. - μ μ λ³μλ‘ μμ±λκ±°λ μ¬μ λΌμ΄νμ¬μ΄ν΄ μΈλΆμμ κ΄λ¦¬λλ κ°μ²΄λ μλμΌλ‘
destroy()
λ₯Ό νΈμΆν΄μΌ μ κ±°λ©λλ€. - μ΄λ²€νΈ 리μ€λ, νμ΄λ¨Έ, 컀μ€ν λ°μ΄ν° ꡬ쑰μ μ μ₯λ μ°Έμ‘°λ κ°λΉμ§ 컬λ ν°κ° ν΄μ νμ§ λͺ»ν μ μμΌλ―λ‘ λͺ μμ μΌλ‘ μ κ±°ν΄μΌ ν©λλ€.
// μΊλ²μ€ μλ μ 리
canvas = null; // λͺ
μμ μΌλ‘ μ°Έμ‘° ν΄μ
destroy()
** λ©μλλ₯Ό νΈμΆνμ¬ μ€λΈμ νΈλ₯Ό μ¬μμ μ κ±°ν μ μμ΅λλ€. μ°Έμ‘° μμ μ κ±°λλ©°, μ΄ν JavaScriptμ κ°λΉμ§ 컬λ ν°μ μν΄ λ©λͺ¨λ¦¬κ° νμλ©λλ€.
sprite.destroy();
destroy()
λ₯Ό νΈμΆν νμλ ν΄λΉ μ€λΈμ νΈμ μ κ·Όνμ§ μλλ‘ ν΄μΌ ν©λλ€.
- μ΄λ¦μ ν΅ν΄ κ°μ²΄λ₯Ό μλ³νκ³ κ²μν μ μμ΅λλ€.
- μ΄λ¦μ νμ μ μΌλ°μ μΌλ‘ λ¬Έμμ΄μ΄λ©°, μ€λ³΅λ μ μμ΅λλ€.
Phaser.GameObjects
μ μ΄λ¦μ μ€μ ν©λλ€.
- μμ΄λλ 컨ν μ΄λ λ΄λΆμμ κ°μ²΄ κ° κ³ μ μλ³μ μν λͺ©μ μΌλ‘ μ¬μ©λ©λλ€.
- μμ΄λμ νμ μ μΌλ°μ μΌλ‘ μ μμ΄λ©°, μ€λ³΅μ νμ©νμ§ μμ΅λλ€.
Phaser.GameObjects
μ μμ΄λλ₯Ό μ€μ ν©λλ€.
getBounds()
λ ν΄λΉ κ°μ²΄μ κ²½κ³ μ¬κ°ν(Rectangle)μ κ³μ°νμ¬ λ°νν©λλ€. μ£Όλ‘ μΆ©λ κ°μ§λ κ°μ²΄μ μμΉ λ° ν¬κΈ°λ₯Ό νμ ν λ μ¬μ©λ©λλ€.getBounds()
λ©μλμ μ΄κΈ° κ°μ ν΄λΉ κ°μ²΄μ λ λλ§λλ μ΄λ―Έμ§μ μν΄ μλμΌλ‘ κ²°μ λ©λλ€.- κ°μ²΄μ ν¬κΈ°λ μμΉκ° λ³ν λ
getBounds()
λ μλμΌλ‘ κ°±μ λ©λλ€. Phaser.GameObjects.Sprite
,Phaser.GameObjects.Container
,Phaser.GameObjects.Image
,Phaser.GameObjects.Text
μμ μ¬μ©ν μ μμ΅λλ€.
- κ°μ²΄κ° κ²μμ λ Όλ¦¬(물리 μ°μ°, μΆ©λ κ²μ¬ λ±)μ μ°Έμ¬νλμ§λ₯Ό μ μ΄νλ λ©μλμ λλ€.
true
λ‘ μ€μ νλ©΄ κ°μ²΄λ κ²μ λ Όλ¦¬μμ νμ± μνλ‘ κ°μ£Όλ©λλ€.false
λ‘ μ€μ νλ©΄ κ°μ²΄λ κ²μ λ Όλ¦¬μμ λΉνμ±νλ©λλ€(물리 μ°μ°, μΆ©λ λ±μ΄ μ€μ§λ¨).
- κ°μ²΄κ° νλ©΄μ λ λλ§λ μ§ μ¬λΆλ₯Ό μ μ΄νλ λ©μλμ λλ€.
true
λ‘ μ€μ νλ©΄ κ°μ²΄κ° νλ©΄μ μΆλ ₯λ©λλ€.false
λ‘ μ€μ νλ©΄ κ°μ²΄κ° νλ©΄μ λ λλ§λμ§ μμ΅λλ€. (κ·Έλ¬λ μ¬μ ν νμ± μνμΌ μ μμ΅λλ€.)- νΉμ 쑰건μμ κ°μ²΄λ₯Ό 보μ΄μ§ μκ² νμ§λ§ μ¬μ ν μΆ©λ κ²μ¬λ₯Ό μν.
- μ¬λ¬
GameObjects
κ°μ²΄λ€μ κ³μΈ΅μ κ΅¬μ‘°λ‘ λ¬Άλ κ°μ²΄μ λλ€. (GameObjects
κ° μλ κ°μ²΄λ μΆκ°λ μ μμ΅λλ€.) - 컨ν μ΄λ λ΄ κ°μ²΄λ€μ 컨ν μ΄λμ νΈλμ€νΌ(μμΉ, ν¬κΈ°, νμ ) μμμ μν₯μ λ°μ΅λλ€.
- λ΄λΆ κ°μ²΄λ€μ λ°°μ΄ κ΅¬μ‘°λ‘ μ μ₯λλ©°, μ΄ λ°°μ΄μ μ¬μ©νμ¬ μ°Έμ‘°νκ±°λ μ κ·Όν μ μμ΅λλ€.
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
λ©μλλ₯Ό ν΅ν΄ ν΄λΉ μ΄λ¦μ μμ κ°μ²΄λ₯Ό κ°μ Έμ¬ μ μμ΅λλ€.- ν 컨ν μ΄λμμ κ°μ μ΄λ¦μ κ°μ§ μμ κ°μ²΄κ° μ¬λ¬ κ° μ‘΄μ¬ν κ²½μ°, μ²μμΌλ‘ μΆκ°λ μμ κ°μ²΄λ₯Ό λ°νν©λλ€.
- μκ° λ³΅μ‘λλ 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
λ©μλλ₯Ό ν΅ν΄ ν΄λΉ 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
- μ’ν κ³μ°, μΆ©λ κ²μ¬, λνμ ν¬κΈ°μ μμΉ νμ λ±μ μννλ μ μ κ°μ²΄μ λλ€.
- μ¬λ¬ κ·Έλν½ μμ(
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)μ λλ€.
Phaserλ μ€λΈμ νΈμ 물리μ λμμ μ²λ¦¬νκΈ° μν λ΄μ₯ 물리 μμ§μ μ 곡νλ©°, μ΄λ, μΆ©λ, μ€λ ₯, μλ, νμ± λ± λ³΅μ‘ν 물리μ μΈ λμμ μ½κ² ꡬνν μ μκ² λμμ€λλ€.
Phaserλ 2κ°μ§ μ£Όμ 물리 μμ§μ μ§μν©λλ€:
- Arcade Physics:
- κ°λ³κ³ λΉ λ₯Έ 2D 물리 μμ§.
- μΆ©λ κ²μ¬μ κ°λ¨ν 물리 λμμ μ ν©.
- μλ(velocity), μ€λ ₯(gravity), λ°λ°λ ₯(bounce) κ°μ νΉμ±μ μ§μ.
- Matter.js:
- λ 볡μ‘νκ³ νμ€μ μΈ λ¬Όλ¦¬ λμμ ꡬν κ°λ₯.
- μ€μ 물리 μμ§μ²λΌ λμ(λ§μ°°, νμ , ν ν¬ λ±).
Phaser.GameObjects.Group
μ λ€μμ κ°μ²΄λ₯Ό κ΄λ¦¬νλ κ°μ²΄μ
λλ€. κ·Έλ£Ή λ΄ κ°μ²΄λ μλ‘ λ
립μ μ΄λ©°, κ°λ³μ μΌλ‘ μ μ΄ν μ μμ΅λλ€.
new Phaser.GameObjects.Group(scene, children, config)
scene
: κ·Έλ£Ήμ΄ μνλ μ¬(Scene) κ°μ²΄μ λλ€.children
: κ·Έλ£Ήμ μΆκ°ν μ΄κΈ° κ²μ μ€λΈμ νΈ λ°°μ΄μ λλ€.config
: κ·Έλ£Ήμ λμ λ°©μμ μ μνλ μ€μ κ°μ²΄μ λλ€.
config
μμ±
classType
: κ·Έλ£Ήμ μΆκ°λλ κ°μ²΄μ κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ ν©λλ€. κΈ°λ³Έ κ°μPhaser.GameObjects.GameObject
κ° μ¬μ©λ©λλ€.maxSize
: κ·Έλ£Ήμ μΆκ°λ μ μλ μ΅λ κ°μ²΄ μλ₯Ό μ νν©λλ€. κ°μ²΄ κ°μκ° μ΅λ μ νμ λλ¬νμ λ, μλ‘μ΄ κ°μ²΄λ₯Ό μΆκ°νλ €κ³ νλ©΄ κ°μ²΄κ° μΆκ°λμ§ μμ΅λλ€.maxSize
κ° μ€μ λ κ·Έλ£Ήμ κ°μ²΄ νλ§μ΄ νμ±νλλ©°,0
μ΄λ©΄ κ°μ²΄ νλ§μ΄ λΉνμ±νλ©λλ€.defaultKey
: κ·Έλ£Ήμ μΆκ°λ κ°μ²΄μ κΈ°λ³Έ ν μ€μ² ν€λ₯Ό μ§μ ν©λλ€.defaultFrame
: κΈ°λ³Έ ν μ€μ²μ νλ μμ μ§μ ν©λλ€.runChildUpdate
:true
λ‘ μ€μ νλ©΄ κ·Έλ£Ήμ λͺ¨λ μμ κ°μ²΄μμupdate()
λ©μλλ₯Ό νΈμΆν©λλ€. κΈ°λ³Έ κ°μtrue
μ λλ€.createCallback
: κ·Έλ£Ήμ κ°μ²΄κ° μΆκ°λ λ μ€νλλ μ½λ°± ν¨μμ λλ€.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();
}
- μ΄λ―Έμ§, μΊλ²μ€, λΉλμ€ λ± λ€μν λ―Έλμ΄λ₯Ό κ²μ μ¬μμ μ¬μ©ν μ μλ κΈ°λ³Έμ μΈ μλ£μ λλ€.
name
μμ±(ν μ€μ²μ μ΄λ¦)μ ν΄λΉ ν μ€μ²λ₯Ό μλ³νλ ν μ€μ² ν€μ λλ€. μ΄ ν€λ Phaserμμ ν μ€μ²λ₯Ό μ°Έμ‘°νκ±°λ κ΄λ¦¬ν λ μ¬μ©νλ κ³ μ ν λ¬Έμμ΄μ λλ€.
<canvas>
νκ·Έλ₯Ό μ¬μ©ν΄ μ κ΅νκ³ λ³΅μ‘ν λμ κ·Έλν½μ μμ λ‘κ² κ·Έλ¦΄ μ μμ΅λλ€.- μΊλ²μ€λ‘ 그릴 λλ GPU κ°μμ νμ©νμ§ μκ³ CPU κΈ°λ° λ λλ§μ νλ―λ‘ μ±λ₯μ λΆλ΄μ΄ λ μ μμ΅λλ€.
- μ μ μ΄λ―Έμ§μΌ λ, νμν μ΄λ―Έμ§λ₯Ό μΊλ²μ€λ‘ 1λ²λ§ μμ±νκ³ μ΄λ₯Ό ν μ€μ²μ μ€νλΌμ΄νΈλ‘ μΊμνλ©΄ λμ μ€μλ μΊλ²μ€μ μ±λ₯ λΆλ΄μ μμ¨ μ μμ΅λλ€.
- μ μ κΈ°λ³Έ λν(μ¬κ°ν, μ, μ λ±)μ μ¦μ μμ±νκ³ λ λλ§ν©λλ€.
- μ¬μ©μ΄ κ°λ¨νκ³ μ§κ΄μ μ΄λ©°, Phaserμ λ€λ₯Έ μμμ μμ°μ€λ½κ² ν΅ν© κ°λ₯ν©λλ€.
- Phaser.Graphics κ°μ²΄λ WebGLμ λ°°κ²½κ³Ό νλ©΄ μμ λͺ¨λ κ·Έλν½μ GPUμμ μ²λ¦¬νλ―λ‘ μ±λ₯μ΄ μ°μνκ³ , λ€μμ κ°μ²΄λ₯Ό 그릴 λ μ±λ₯μμ μ΄μ μ΄ μμ΅λλ€.
- 볡μ‘ν κ·Έλν½μ 그리기 μ΄λ ΅λ€λ λ¨μ μ΄ μμ΅λλ€.
- ν μ€μ³λ₯Ό ν΅ν΄ μ μ κ·Έλν½μ νλ©΄μ νμνλ κ°μ²΄μ λλ€.
- μ¬μ μ μλ μ΄λ―Έμ§λ₯Ό ννν μ μμ΅λλ€. κ³ μ λ ν¬κΈ°μ λͺ¨μμ μ€λΈμ νΈλ₯Ό λ°λ³΅μ μΌλ‘ 그릴 μ μμ΅λλ€.
- μ΄λ―Έ μμ±λ λ¨μν μ΄λ―Έμ§λ ν μ€μ²λ₯Ό μ¬μ©ν λ μ ν©ν©λλ€. μΊμ±λ ν μ€μ²λ₯Ό μ¬μ¬μ©νμ¬ μ±λ₯μ μ΅μ νν μ μμ΅λλ€.
- 볡μ‘ν ν¨κ³Ό(κ·ΈλΌλ°μ΄μ , κΈλ‘μ° λ±)λ₯Ό μ μ©νκΈ° μ΄λ ΅κ³ , λμ μΈ κ·Έλν½μ μ¬μ©νλ€λ©΄ μΆκ° μμ μ΄ νμν©λλ€.
νΉμ§
- λ€μν μμ±(ν¬κΈ°, μμΉ, νμ λ±)μ μ΄μ©νμ¬ μ΄λ―Έμ§λ₯Ό λ³νν μ μμ΅λλ€.
setDisplaySize
λ₯Ό μ¬μ©νμ§ μμΌλ©΄, μ€νλΌμ΄νΈλ κΈ°λ³Έμ μΌλ‘ ν μ€μ²μ μλ ν¬κΈ°μ λ§κ² νμλ©λλ€.
- 볡μ‘νκ³ λ€μ΄λλ―Ήν κ·Έλν½ ν¨κ³Ό(κΈλ‘μ°, κ·ΈλΌλ°μ΄μ , μ곑, λΉ λ°μ¬ λ±)λ₯Ό μ€μκ°μΌλ‘ μ μ©ν μ μμ΅λλ€. μ‘°λͺ ν¨κ³Ό, λ μ¦ νλ μ΄μ κ°μ 볡μ‘ν μκ°μ μ²λ¦¬λ₯Ό ꡬνν μ μμ΅λλ€.
- GPUμμ λ³λ ¬ μ²λ¦¬λ‘ μ€νλλ―λ‘ μ€μκ° λ λλ§ μ±λ₯μ΄ λ§€μ° λ°μ΄λ©λλ€. λ€μμ μ€λΈμ νΈμ λμΌν κ·Έλν½ ν¨κ³Όλ₯Ό μ μ©ν λλ ν¨μ¨μ μ λλ€.
- μ °μ΄λ νλ‘κ·Έλλ°μ μ¬μ©νκΈ°μ ꡬν λμ΄λκ° λμΌλ©°, Phaser λ΄λΆμμ μ€μ λ° λλ²κΉ μ΄ μλμ μΌλ‘ 볡μ‘ν©λλ€.
- ν΄λΌμ΄μΈνΈμ νλμ¨μ΄ μ¬μμ μν₯μ λ§μ΄ λ°μ΅λλ€.
λ°©λ² | νμν μκ° | μ ν©ν μ¬μ© μ¬λ‘ | μ₯μ | λ¨μ |
---|---|---|---|---|
Phaser.Graphics | λ¨μν λνμ΄λ μ μ κ·Έλν½ νμμ | μ μ /λμ λν | μ§κ΄μ , λΉ λ₯Έ ꡬν κ°λ₯ | 볡μ‘ν ν¨κ³Ό ꡬν μ΄λ €μ, μ±λ₯ μ ν κ°λ₯ |
Phaser.Sprite | μ μ μ΄λ―Έμ§λ₯Ό μ¬μ©ν λ | λ°λ³΅μ μΌλ‘ μ΄λ―Έμ§λ₯Ό 그릴 λ | ν μ€μ² μΊμ±μΌλ‘ μ±λ₯ μ΅μ ν, Phaserμ ν΅ν© μ©μ΄ | 볡μ‘ν ν¨κ³Ό μ ν, μ΄λ―Έμ§ μ¬μ μ€λΉ νμ |
HTML.Canvas | Phaser μΈλΆμμ κ·Έλν½ μμ± μ | λμ ν μ€μ² μμ±, μ¬μ©μ μ§μ ν¨κ³Ό | ν¨κ³Ό ꡬν μμ λ λμ, Phaserμ μ°λ κ°λ₯ | CPU μμ‘΄μ± λμ, μΆκ° λ³ν μμ νμ |
Phaser.Shader | κ³ μ±λ₯ ν¨κ³Όμ μ€μκ° λ λλ§ νμ μ | κΈλ‘μ°, κ·ΈλΌλ°μ΄μ , λ¬Όκ²° ν¨κ³Ό λ± | GPU μ²λ¦¬λ‘ κ³ μ±λ₯, 볡μ‘ν ν¨κ³Ό κ°λ₯ | νμ΅ κ³‘μ λμ, μ€μ λ° λλ²κΉ λ³΅μ‘ |
- λ¨μν λν β Phaser.Graphics
- μΊμ±λ μ μ μ΄λ―Έμ§ β Phaser.Sprite
- κ°λ¨ν λμ ν μ€μ² β HTML.Canvas
- μ€μκ° κ³ μ±λ₯ ν¨κ³Ό β Phaser.Shader
νΉμ§ | μ °μ΄λ | μΊλ²μ€ |
---|---|---|
μ€ν μμΉ | GPU (λ³λ ¬ μ²λ¦¬) | CPU |
μ±λ₯ | λ§€μ° λΉ λ₯΄κ³ ν¨μ¨μ | μλμ μΌλ‘ λ리며 CPU λΆν μ¦κ° |
κ·ΈλΌλ°μ΄μ λ° ν¨κ³Ό | κ³ μμΌλ‘ 볡μ‘ν ν¨κ³Ό μ μ© κ°λ₯ | μλμ μΌλ‘ 볡μ‘ν μ²λ¦¬μ λλ¦Ό |
μ¬μ©λ² | κ³ κΈ GPU νλ‘κ·Έλλ° μ§μ νμ | μ§κ΄μ μ΄κ³ μ¬μ©μ΄ μ¬μ |
νΈνμ± | κ±°μ λͺ¨λ λΈλΌμ°μ λ° κΈ°κΈ° μ§μ | μ΅μ λΈλΌμ°μ λ° κ³ μ¬μ GPU νμ |
- μ€μκ° λμ μ²λ¦¬ λ° λ³΅μ‘ν κ·Έλν½ ν¨κ³Ό β Phaser.Shader
- κ°λ¨ν κ·Έλν½ λ° μΌνμ± μ μ λ λλ§ β HTML.Canvas
- Phaserμ
preload
λ¨κ³μμ λ‘λλ μ€λμ€ νμΌ λ¦¬μμ€μ λλ€. μλ³Έ λ°μ΄ν°λ₯Ό μ 곡νλ©°, μ¬λ¬ μ¬μ΄λ μΈμ€ν΄μ€κ° μ΄ λ°μ΄ν°λ₯Ό μ°Έμ‘°ν©λλ€.
this.load.audio('bgMusic', 'assets/audio/background.mp3');
bgMusic
μ μ€λμ€ νμΌ λ¦¬μμ€μ ν€μ
λλ€.
audio
λ₯Ό κΈ°λ°μΌλ‘ μμ±λ μ€λμ€ μ¬μ 컨νΈλ‘€λ¬μ λλ€. μ€λμ€λ₯Ό μ¬μ, μΌμ μ μ§, μ€μ§, λ³Όλ₯¨ μ‘°μ λ±μ μμ μ μνν©λλ€.
const bgSound = this.sound.add('bgMusic', { loop: true, volume: 0.5 });
bgSound.play();