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. | |
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.
| i32 njin::particle_emitter::max_particles = 512 |
Số hạt sống tối đa.
Hạt mới bị bỏ khi đầy.
| 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.
| 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_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.