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_fx.h
1#pragma once
2#include "_math.h"
3#include "_types.h"
4#include "njin_particles.h"
5#include <entt/entity/fwd.hpp>
6
7namespace njin {
8struct context;
9
12
15
19 f32 max_offset = 16.0f;
20 f32 max_angle = 3.0f;
21 f32 frequency = 30.0f;
22 f32 decay = 1.5f;
23};
24
34void camera_shake(context &ctx, f32 trauma);
35
39void camera_shake_config(context &ctx, const shake_config &config);
40
44f32 camera_shake_amount(const context &ctx);
45
53void hitstop(context &ctx, f32 seconds);
54
58bool hitstop_active(const context &ctx);
59
67void screen_flash(context &ctx, rgba color, f32 duration);
69
72
78struct flash_fx {
79 rgba color{1.0f, 1.0f, 1.0f, 1.0f};
80 f32 duration = 0.1f;
81 f32 time = 0.0f;
82 bool fade = true;
83};
84
90void sprite_flash(context &ctx, entt::entity entity,
91 rgba color = {1.0f, 1.0f, 1.0f, 1.0f}, f32 duration = 0.1f);
93
96
112 rgba edge_color{1.0f, 0.55f, 0.1f, 1.0f};
113 f32 edge_width = 0.08f;
114 f32 grain = 2.0f;
115 f32 seed = 0.0f;
116 f32 duration = 0.6f;
117 f32 time = 0.0f;
118 bool reverse = false;
119 bool destroy_when_done = false;
120};
121
133void sprite_dissolve(context &ctx, entt::entity entity, f32 duration = 0.6f,
134 rgba edge_color = {1.0f, 0.55f, 0.1f, 1.0f});
136
147namespace fx {
153 e.life = {0.35f, 0.8f};
154 e.speed = {120.0f, 420.0f};
155 e.drag = 4.0f;
156 e.size_start = 18.0f;
157 e.size_end = 2.0f;
158 e.size_jitter = {0.6f, 1.4f};
159 e.color_start = {1.0f, 0.85f, 0.35f, 1.0f};
160 e.color_end = {0.7f, 0.1f, 0.05f, 0.0f};
162 e.area = {8.0f, 8.0f};
163 return e;
164}
165
171 e.life = {0.2f, 0.5f};
172 e.speed = {200.0f, 500.0f};
173 e.gravity = {0.0f, 900.0f};
174 e.drag = 1.5f;
175 e.size_start = 4.0f;
176 e.size_end = 1.0f;
177 e.color_start = {1.0f, 0.95f, 0.6f, 1.0f};
178 e.color_end = {1.0f, 0.45f, 0.1f, 0.0f};
181 return e;
182}
183
189 e.life = {0.3f, 0.6f};
190 e.speed = {20.0f, 70.0f};
191 e.angle = -90.0f;
192 e.spread = 140.0f;
193 e.gravity = {0.0f, -20.0f};
194 e.drag = 3.0f;
195 e.size_start = 6.0f;
196 e.size_end = 12.0f;
197 e.size_jitter = {0.7f, 1.3f};
198 e.color_start = {0.75f, 0.7f, 0.62f, 0.7f};
199 e.color_end = {0.75f, 0.7f, 0.62f, 0.0f};
200 e.area = {16.0f, 2.0f};
201 return e;
202}
203
208 e.rate = 20.0f;
209 e.life = {1.2f, 2.2f};
210 e.speed = {20.0f, 45.0f};
211 e.angle = -90.0f;
212 e.spread = 30.0f;
213 e.drag = 0.5f;
214 e.spin = {-40.0f, 40.0f};
215 e.size_start = 10.0f;
216 e.size_end = 36.0f;
217 e.color_start = {0.55f, 0.55f, 0.58f, 0.5f};
218 e.color_end = {0.35f, 0.35f, 0.38f, 0.0f};
219 e.area = {6.0f, 2.0f};
220 return e;
221}
222
227 e.rate = 70.0f;
228 e.life = {0.4f, 0.8f};
229 e.speed = {50.0f, 120.0f};
230 e.angle = -90.0f;
231 e.spread = 25.0f;
232 e.size_start = 22.0f;
233 e.size_end = 2.0f;
234 e.size_jitter = {0.7f, 1.2f};
235 e.color_start = {1.0f, 0.8f, 0.3f, 0.9f};
236 e.color_end = {0.9f, 0.15f, 0.05f, 0.0f};
238 e.area = {14.0f, 4.0f};
239 return e;
240}
241
247 e.life = {0.4f, 0.9f};
248 e.speed = {30.0f, 120.0f};
249 e.drag = 2.5f;
250 e.gravity = {0.0f, -30.0f};
251 e.spin = {-360.0f, 360.0f};
252 e.size_start = 7.0f;
253 e.size_end = 0.0f;
254 e.color_start = {1.0f, 1.0f, 0.75f, 1.0f};
255 e.color_end = {0.5f, 0.8f, 1.0f, 0.0f};
258 e.area = {12.0f, 12.0f};
259 return e;
260}
261
267 e.life = {0.6f, 1.1f};
268 e.speed = {120.0f, 320.0f};
269 e.angle = -90.0f;
270 e.spread = 120.0f;
271 e.gravity = {0.0f, 1100.0f};
272 e.spin = {-540.0f, 540.0f};
273 e.size_start = 7.0f;
274 e.size_end = 5.0f;
275 e.size_jitter = {0.6f, 1.4f};
276 e.color_start = {0.55f, 0.4f, 0.25f, 1.0f};
277 e.color_end = {0.45f, 0.32f, 0.2f, 0.0f};
279 return e;
280}
281
287 e.life = {0.35f, 0.7f};
288 e.speed = {100.0f, 300.0f};
289 e.spread = 70.0f;
290 e.gravity = {0.0f, 900.0f};
291 e.size_start = 6.0f;
292 e.size_end = 2.0f;
293 e.size_jitter = {0.6f, 1.3f};
294 e.color_start = {0.75f, 0.05f, 0.08f, 1.0f};
295 e.color_end = {0.45f, 0.0f, 0.02f, 0.0f};
296 return e;
297}
298
304 e.rate = 250.0f;
305 e.max_particles = 1500;
306 e.life = {0.6f, 0.9f};
307 e.speed = {700.0f, 900.0f};
308 e.angle = 100.0f;
309 e.spread = 4.0f;
310 e.size_start = 3.0f;
311 e.size_end = 3.0f;
312 e.color_start = {0.7f, 0.8f, 1.0f, 0.55f};
313 e.color_end = {0.7f, 0.8f, 1.0f, 0.3f};
315 e.area = {1400.0f, 10.0f};
316 return e;
317}
318
323 e.rate = 60.0f;
324 e.max_particles = 1500;
325 e.life = {6.0f, 9.0f};
326 e.speed = {30.0f, 70.0f};
327 e.angle = 90.0f;
328 e.spread = 50.0f;
329 e.size_start = 4.0f;
330 e.size_end = 4.0f;
331 e.size_jitter = {0.5f, 1.3f};
332 e.color_start = {1.0f, 1.0f, 1.0f, 0.9f};
333 e.color_end = {1.0f, 1.0f, 1.0f, 0.0f};
334 e.area = {1400.0f, 10.0f};
335 return e;
336}
337
343 e.rate = 80.0f;
344 e.life = {0.25f, 0.4f};
345 e.speed = {0.0f, 8.0f};
346 e.size_start = 8.0f;
347 e.size_end = 0.0f;
348 e.color_start = {1.0f, 1.0f, 1.0f, 0.8f};
349 e.color_end = {0.6f, 0.8f, 1.0f, 0.0f};
351 return e;
352}
353} // namespace fx
354
355} // namespace njin
@ blend_additive
Cộng màu: sáng lên. Dùng cho lửa, ánh sáng, tia lửa.
Definition njin_draw.h:273
bool hitstop_active(const context &ctx)
Có đang hitstop không.
f32 camera_shake_amount(const context &ctx)
Độ rung hiện tại, 0..1.
void camera_shake(context &ctx, f32 trauma)
Rung camera.
void camera_shake_config(context &ctx, const shake_config &config)
Đổi cách rung của camera_shake().
void hitstop(context &ctx, f32 seconds)
Dừng hình trong chốc lát (hitstop, freeze frame) để cú đánh có "lực".
void screen_flash(context &ctx, rgba color, f32 duration)
Nháy cả màn hình một màu rồi mờ dần: trắng khi nổ lớn, đỏ khi bị thương.
void sprite_dissolve(context &ctx, entt::entity entity, f32 duration=0.6f, rgba edge_color={1.0f, 0.55f, 0.1f, 1.0f})
Cho sprite của entity tan biến.
void sprite_flash(context &ctx, entt::entity entity, rgba color={1.0f, 1.0f, 1.0f, 1.0f}, f32 duration=0.1f)
Nháy sprite của entity.
@ particle_square
Hình vuông, xoay theo spin.
Definition njin_particles.h:24
float f32
Số thực 32 bit.
Definition _types.h:28
Các mẫu particle hay dùng, để truyền vào particles_spawn() hoặc gắn thẳng lên entity.
Definition njin_fx.h:147
particle_emitter trail()
Vệt đuôi: hạt để lại phía sau khi entity di chuyển (tên lửa, phi tiêu, sao băng).
Definition njin_fx.h:341
particle_emitter fire()
Lửa: ngọn lửa phát liên tục, bay lên, vàng chuyển đỏ, sáng (additive).
Definition njin_fx.h:225
particle_emitter splash()
Máu hoặc chất lỏng bắn: giọt đỏ văng ra rồi rơi.
Definition njin_fx.h:285
particle_emitter dust()
Bụi: bay lên chậm, xám nâu, mờ dần.
Definition njin_fx.h:187
particle_emitter smoke()
Khói: bay lên, nở to, mờ dần.
Definition njin_fx.h:206
particle_emitter snow()
Tuyết: bông trắng rơi chậm, lắc nhẹ.
Definition njin_fx.h:321
particle_emitter explosion()
Vụ nổ: tỏa mọi hướng, nhanh, vàng cam chuyển đỏ sẫm, sáng (additive).
Definition njin_fx.h:151
particle_emitter debris()
Mảnh vỡ: khối vuông văng lên rồi rơi, xoay.
Definition njin_fx.h:265
particle_emitter rain()
Mưa: vệt rơi nhanh, phủ một vùng rộng.
Definition njin_fx.h:302
particle_emitter sparks()
Tia lửa: nhỏ, rất nhanh, rơi theo trọng lực.
Definition njin_fx.h:169
particle_emitter sparkle()
Lấp lánh: hạt nhỏ xoay, trôi nhẹ, sáng.
Definition njin_fx.h:245
Cấu hình cửa sổ và vòng lặp, truyền vào create().
Definition njin_cfg.h:11
Cho một sprite tan biến từng mảng nhỏ, có viền cháy sáng ở chỗ đang tan: kẻ địch chết,...
Definition njin_fx.h:111
f32 time
Thời gian đã trôi qua, do engine cập nhật.
Definition njin_fx.h:117
bool destroy_when_done
Hủy entity khi tan hết. Không áp dụng cho reverse.
Definition njin_fx.h:119
bool reverse
true: hiện ra dần thay vì tan biến.
Definition njin_fx.h:118
f32 duration
Thời gian tan hết, giây.
Definition njin_fx.h:116
rgba edge_color
Màu viền cháy. a là độ đậm, 0 là bỏ viền.
Definition njin_fx.h:112
f32 grain
Cỡ mỗi mảng, tính bằng pixel của ảnh sprite. 1 là từng pixel, lớn hơn là mảng to.
Definition njin_fx.h:114
f32 seed
Đổi hình mẫu tan biến. Cho mỗi kẻ địch một giá trị riêng để chúng không tan giống hệt nhau.
Definition njin_fx.h:115
f32 edge_width
Độ dày viền, tính theo thang ngẫu nhiên 0..1. 0 là bỏ viền.
Definition njin_fx.h:113
Tô một sprite thành một màu trong chốc lát, thường là trắng khi trúng đòn.
Definition njin_fx.h:78
rgba color
Màu tô. a là độ phủ lúc đầu.
Definition njin_fx.h:79
bool fade
Mờ dần. false là giữ nguyên màu tô đến hết giờ.
Definition njin_fx.h:82
f32 duration
Thời gian nháy, giây.
Definition njin_fx.h:80
f32 time
Thời gian đã trôi qua, do engine cập nhật.
Definition njin_fx.h:81
Nguồn phát hạt: nổ, bụi, tia lửa, khói.
Definition njin_particles.h:57
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.
Definition njin_particles.h:65
vec2 gravity
Gia tốc, đơn vị mỗi giây bình phương. {0, 400} là rơi xuống.
Definition njin_particles.h:77
f32 spread
Độ tỏa quanh angle, độ. 360 là mọi hướng.
Definition njin_particles.h:76
f32 angle
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.
Definition njin_particles.h:74
f32_range size_jitter
Hệ số kích thước ngẫu nhiên riêng của từng hạt.
Definition njin_particles.h:89
particle_shape shape
Hình khi không có texture.
Definition njin_particles.h:92
f32_range speed
Tốc độ ban đầu.
Definition njin_particles.h:71
f32 rate
Số hạt mỗi giây khi phát liên tục. 0 là chỉ phát theo loạt.
Definition njin_particles.h:60
f32 drag
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.
Definition njin_particles.h:78
f32_range life
Tuổi thọ, giây.
Definition njin_particles.h:70
rgba color_end
Màu lúc chết. Mặc định mờ dần.
Definition njin_particles.h:91
rgba color_start
Màu lúc sinh.
Definition njin_particles.h:90
f32_range spin
Tốc độ xoay, độ mỗi giây.
Definition njin_particles.h:79
f32 size_start
Kích thước lúc sinh, pixel thế giới.
Definition njin_particles.h:87
f32 size_end
Kích thước lúc chết.
Definition njin_particles.h:88
i32 max_particles
Số hạt sống tối đa.
Definition njin_particles.h:62
blend_mode blend
Cách trộn màu. blend_additive cho lửa, tia lửa.
Definition njin_particles.h:97
Màu gồm đỏ, xanh lá, xanh dương và alpha.
Definition _types.h:64
Cách rung của camera_shake().
Definition njin_fx.h:18
f32 max_offset
Độ lệch tối đa khi độ rung = 1, pixel màn hình.
Definition njin_fx.h:19
f32 decay
Độ rung giảm bao nhiêu mỗi giây.
Definition njin_fx.h:22
f32 frequency
Tốc độ rung, số lần mỗi giây.
Definition njin_fx.h:21
f32 max_angle
Góc lệch tối đa khi độ rung = 1, độ.
Definition njin_fx.h:20