njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
njin::particle_emitter Struct Tham chiếu

Nguồn phát hạt: nổ, bụi, tia lửa, khói. Tiếp...

#include <njin_particles.h>

Các thuộc tính Public

bool destroy_when_done = false
 Hủy entity khi không còn phát (emitting == false hoặc rate == 0), không còn loạt nào chờ và mọi hạt đã chết.
Phát
f32 rate = 0.0f
 Số hạt mỗi giây khi phát liên tục. 0 là chỉ phát theo loạt.
bool emitting = true
 Đang phát liên tục. Không ảnh hưởng particles_burst().
i32 max_particles = 512
 Số hạt sống tối đa.
vec2 area {}
 Vùng sinh hạt quanh vị trí của entity: hình chữ nhật có tâm tại transform.pos.
Chuyển động
f32_range life {0.5f, 1.0f}
 Tuổi thọ, giây.
f32_range speed {50.0f, 100.0f}
 Tốc độ ban đầu.
f32 angle = 0.0f
 Hướng phát, độ (0 là sang phải, 90 là xuống dưới), cộng với góc xoay của transform.
f32 spread = 360.0f
 Độ tỏa quanh angle, độ. 360 là mọi hướng.
vec2 gravity {}
 Gia tốc, đơn vị mỗi giây bình phương. {0, 400} là rơi xuống.
f32 drag = 0.0f
 Lực cản: vận tốc giảm theo tỉ lệ này mỗi giây. 0 là không cản.
f32_range spin {}
 Tốc độ xoay, độ mỗi giây.
bool local_space = false
 Hạt đi theo emitter khi emitter di chuyển (ví dụ lửa ở đuôi tên lửa).
Hình ảnh
f32 size_start = 8.0f
 Kích thước lúc sinh, pixel thế giới.
f32 size_end = 0.0f
 Kích thước lúc chết.
f32_range size_jitter {1.0f, 1.0f}
 Hệ số kích thước ngẫu nhiên riêng của từng hạt.
rgba color_start {1.0f, 1.0f, 1.0f, 1.0f}
 Màu lúc sinh.
rgba color_end {1.0f, 1.0f, 1.0f, 0.0f}
 Màu lúc chết. Mặc định mờ dần.
particle_shape shape = particle_circle
 Hình khi không có texture.
texture_handle texture {}
 Ảnh của hạt.
rect source {}
 Vùng trong ảnh, pixel. Kích thước 0 là cả ảnh.
blend_mode blend = blend_alpha
 Cách trộn màu. blend_additive cho lửa, tia lửa.
i32 layer = 0
 Lớp vẽ, cùng quy ước với sprite::layer.
bool visible = true
 Ẩn mà không dừng mô phỏng.
Trạng thái (do engine quản lý)
std::vector< particle > particles
 Các hạt đang sống. Xem lưu ý về gpu ở trên.
i32 pending_burst = 0
 Số hạt chờ sinh ở lần cập nhật tới, xem particles_burst().
f32 emit_accum = 0.0f
 Phần lẻ của hạt chưa sinh khi phát liên tục.
bool gpu = false
 Đang mô phỏng và vẽ trên GPU. Engine chọn lúc emitter hết hạt, xem particle_backend.

Mô tả chi tiết

Nguồn phát hạt: nổ, bụi, tia lửa, khói.

Cần một transform trên cùng entity.

Module particle của engine sinh và cập nhật hạt trong phase_post_update theo delta() (nên dừng khi pause, chậm lại khi time_set_scale()), và vẽ chúng trong phase_render cùng với sprite, theo layer. Trên cùng một lớp, hạt vẽ sau sprite.

Hai cách phát:

Mọi trường đều sửa được lúc đang chạy; hạt đã sinh giữ tốc độ và tuổi thọ của chúng, còn màu và kích thước luôn theo giá trị hiện tại.

Máy có GPU thì hạt được mô phỏng trong vertex shader và vẽ bằng một lệnh instanced cho mỗi emitter (xem particle_backend). Khi đó gpu là true và trong particles chỉ age được cập nhật: pos, velocity, rot giữ giá trị lúc sinh, vì card đồ họa tự tính vị trí hiện tại từ đó. Đọc vị trí hạt thì kiểm tra gpu trước.

Thông tin về Member Data

◆ max_particles

i32 njin::particle_emitter::max_particles = 512

Số hạt sống tối đa.

Hạt mới bị bỏ khi đầy.

◆ area

vec2 njin::particle_emitter::area {}

Vùng sinh hạt quanh vị trí của entity: hình chữ nhật có tâm tại transform.pos.

{0, 0} là sinh đúng tại một điểm.

◆ local_space

bool njin::particle_emitter::local_space = false

Hạt đi theo emitter khi emitter di chuyển (ví dụ lửa ở đuôi tên lửa).

false là hạt để lại dấu vết trong thế giới.

◆ texture

texture_handle njin::particle_emitter::texture {}

Ảnh của hạt.

Không hợp lệ thì vẽ shape. Ảnh được co giãn cho cạnh lớn nhất bằng kích thước hạt, rồi nhân màu của hạt.

◆ destroy_when_done

bool njin::particle_emitter::destroy_when_done = false

Hủy entity khi không còn phát (emitting == false hoặc rate == 0), không còn loạt nào chờ và mọi hạt đã chết.

Dùng cho hiệu ứng một lần.