# Bullet

## **การทำ Bullet**

### **Step 1**

&#x20;         นำรูปกระสุนของเราเข้ามาใน Preload function ก่อน

```javascript
preload(){
    this.load.image('bullet', './path');
}
```

&#x20;         จากนั้นสร้าง Group ของ bullet ของเราใน Create function โดยใช้คำสั่ง

```javascript
//สร้างกลุ่มของลูกกระสุนขึ้นมาชื่อ bulletGroup
bulletGroup = this.physics.add.group()
```

### **Step 2**

&#x20;         ใช้ Timer Event สร้าง loop ของกระสุนขึ้นมา โดยให้มันปล่อยออกมาจากแกน x และแกน y ของเพลเยอร์เรา ดังรูปแบบโค้ดต่อไปนี้

```javascript
bulletEvent = this.time.addEvent({
    delay: 1000,
    callback: function(){
        //สร้างกระสุนขึ้นมาชื่อ bullet 
        bullet = this.physics.add.image(player.x, player.y-50,'bullet');
            .setScale(0.2)      //กำหนดขนาด
            .setSize(0.2);      //กำหนดตำแหน่ง Hitbox
        //เพิ่ม bullet ลงใน bulletGroup
        bulletGroup.add(bullet);
        //กำหนดความเร็วเคลี่อนที่ของ bulletGroup
        bulletGroup.setVelocityY(-200);
        },
    callbackScope: this,
    loop: true,
    pause: false
});
```

### Step 3

&#x20;         เมื่อกระสุนถูกยิงออกไป เราต้องทำลายมัน เพื่อไม่ให้ตัว Phaser ทำการเก็บ Stack จากการวน loop ไม่รู้จบ โดยตัวอย่างด้านล่างจะทำลายกระสุนอัตโนมัติ ด้วยคำสั่ง **`.destroy();`** เมื่อกระสุนเดินทางไปในแกน y มากกว่า 50

```javascript
update(delta, time){
    //ทำลาย bullet ที่อยู่ใน bulletGroup ที่มีค่า y มากกว่า 350 
    for (let i = 0; i < bulletGroup.getChildren().length; i++) {
        if (bulletGroup.getChildren()[i].y <= -50) {
                bulletGroup.getChildren()[i].destroy();
        }
    }
}
```

{% hint style="warning" %}
การเกิด monster, bullet หรือ object อะไรก็ตามที่มีการเกิดขึ้นมาใหม่เรื่อย ๆ จะต้องมีการทำลายทิ้งทันทีเมื่อเสร็จจากการ interaction กัน
{% endhint %}

{% hint style="warning" %}
เนื่องจากการเกิดใหม่เรื่อย ๆ และไม่ทำลายมัน ตัว Phaser จะทำการเก็บ Stack ไปเรื่อย ๆ อาจทำให้การทำงานของตัวประมวลผลต่าง ๆ หรือการแสดงผลต่าง ๆ มีการผิดพลาดหรือผิดแปลกไป หรือที่เราเรียกกันง่าย ๆ ว่าอาจจะทำให้เกิด bug หรือไม่ก็เกิดอาการ lag นั่นเอง
{% endhint %}

### Result

![](https://1572294076-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Me05uuZ2Kw6VszdHXnU%2F-MgqWqfiZInTg2oKwu6e%2F-MgqXQs7_ZPcYjhlgoto%2Fezgif-2-e554b8e888c2.gif?alt=media\&token=be93c77c-6ce0-4f1d-9b5e-c868fc08625e)

#### สรุปภาพรวมโค้ด Bullet

```javascript
preload(){
    this.load.image('bullet', './path');
}

create(){
    bulletGroup = this.physics.add.group();
    
    bulletEvent = this.time.addEvent({
        delay: 1000,
        callback: function(){
            bullet = this.physics.add.image(player.x, player.y-50,'bullet');
                .setScale(0.2)
                .setSize(0.2);
            bulletGroup.add(bullet);
            bulletGroup.setVelocityY(-200);
            },
        callbackScope: this,
        loop: true,
        pause: false
    });
}

update(delta, time){
    for (let i = 0; i < bulletGroup.getChildren().length; i++) {
        if (bulletGroup.getChildren()[i].y <= -50) {
                bulletGroup.getChildren()[i].destroy();
        }
    }
}
```
