Khoảng giá
Từ: 0 triệu
Đến: Không giới hạn
Túi máy ảnh Billingham Hadley Digital - Navy/Navy – chính hãng
Túi máy ảnh Billingham Hadley Large - Navy/Chocolate – chính hãng
Túi máy ảnh Billingham S2 - Black Fibrenyte/ Black
Túi máy ảnh Billingham S2 - Navy/ Chocolate
Túi máy ảnh Billingham S2 - Khaki/Tan
Túi máy ảnh Billingham S2 - Sage Fibrenyte/Chocolate
Miếng lót túi Billingham S2 Divider Set - Olive
Túi máy ảnh Billingham S3 - Navy/ Chocolate
Túi máy ảnh Billingham S3 - Khaki/Tan
Túi máy ảnh Billingham S3 - Sage Fibrenyte/Chocolate
Miếng lót túi Billingham S3 Divider Set - Chocolate
Túi máy ảnh Billingham 207 - Black Fibrenyte/Black
Túi máy ảnh Billingham 207 - Khaki Fibrenyte/ Chocolate
Túi máy ảnh Billingham 207 - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham 307 - Black Fibrenyte/Black
Túi máy ảnh Billingham 307 - Khaki Fibrenyte/Chocolate
Túi máy ảnh Billingham 225 MkII - Black Fibrenyte/ Black
Túi máy ảnh Billingham 225 MkII - Sage Fibrenyte/ Chocolate
Túi kính lọc Lowepro GearUp Filter 100 (màu xám)
Ba lô máy ảnh Lowepro Tahoe BP150 (màu đen)
Túi máy ảnh Lowepro Tahoe CS 20 (màu đen)
Túi máy ảnh Lowepro Adventura SH 115 III (màu đen)
Túi máy ảnh Lowepro Nova 140 AW II (màu đen)
Túi máy ảnh Lowepro Nova 180 AW II (màu đen)
Túi máy ảnh Lowepro Nova 200 AW II (màu đen)
Túi máy ảnh Lowepro Photo Active TLZ 50 AW (màu đen)
Túi máy ảnh Lowepro Adventura SH 160 III (màu đen)
Túi máy ảnh Lowepro Adventura TLZ 30 III (màu đen)
Túi máy ảnh Lowepro Nova 160 AW II (màu đen)
Túi máy ảnh Lowepro Nova 170 AW II (màu đen)
Ba lô máy ảnh Lowepro Flipside 200 AW II (màu đen)
Ba lô máy ảnh Lowepro FreeLine 350 AW (màu đen)
Ba lô máy ảnh Lowepro Truckee 150 LX (màu xám)
Ba lô máy ảnh Lowepro ProTactic BP 300 AW II (màu đen)
Túi máy ảnh Lowepro ProTactic MG 160 AW II (màu đen)
Ba lô máy ảnh Lowepro Fastpack 250 AW III (màu xám)
Túi máy ảnh Lowepro ProTactic TLZ 75 AW II (màu đen)
Ba lô máy ảnh Lowepro PhotoSport BP 15L AW III (màu xám)
Ba lô máy ảnh Lowepro Flipside 300 AW III (màu đen)
Ba lô máy ảnh Lowepro Flipside 300 AW III (xám đậm)
Ba lô máy ảnh Lowepro Flipside 400 AW III (xám đậm)
Ba lô máy ảnh Lowepro Adventura BP 150 III (màu đen)
Ba lô máy ảnh Lowepro Truckee 250 (màu đen)
Túi máy ảnh Billingham 335 MkII - Khaki/Tan
Túi máy ảnh Billingham 335 MkII - Black Fibrenyte/Black
Túi máy ảnh Billingham 335 MkII - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham 335 MkII - Navy/Chocolate
Túi máy ảnh Billingham 445 MkII - Khaki/Tan
Túi máy ảnh Billingham 445 MkII - Black Fibrenyte/Black
Túi máy ảnh Billingham 445 MkII - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham 555 MkII - Khaki/Tan
Túi máy ảnh Billingham 555 MkII - Black Fibrenyte/Black
Túi máy ảnh Billingham 555 MkII - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham Airline Stowaway - Black/Black
Túi máy ảnh Billingham Airline Stowaway - Black/Tan
Túi máy ảnh Billingham Airline Stowaway - Khaki/Tan
Túi máy ảnh Billingham Airline Stowaway - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham Airline Stowaway - Navy/Chocolate
Túi máy ảnh Billingham Compact Stowaway - Black/Black
Túi máy ảnh Billingham Compact Stowaway - Black/Tan
Túi máy ảnh Billingham Compact Stowaway - Khaki/Tan
Túi máy ảnh Billingham Compact Stowaway - Sage/Chocolate
Túi máy ảnh Billingham Pola Stowaway - Black/Black
Túi máy ảnh Billingham Pola Stowaway - Black/Tan
Túi máy ảnh Billingham Pola Stowaway - Khaki/Tan
Túi máy ảnh Billingham Pola Stowaway - Sage Fibrenyte/Chocolate
Túi Billingham Avea 7 - Black/Black
Túi Billingham Avea 7 - Black/Tan
Túi Billingham Avea 7 - Black Fibrenyte/Black
Túi Billingham Avea 7 - Black Fibrenyte/Tan
Túi Billingham Avea 7 - Burgundy/Chocolate
Túi Billingham Avea 7 - Khaki/Tan
Túi Billingham Avea 7 - Khaki Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 7 - Khaki Fibrenyte/Tan
Túi máy ảnh Billingham Avea 7 - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 7 - Sage Fibrenyte/Tan
Túi máy ảnh Billingham Avea 7 - Navy/Chocolate
Túi máy ảnh Billingham Avea 7 - Sage Fibrenyte/Black
Túi máy ảnh Billingham Avea 8 - Black/Black
Túi máy ảnh Billingham Avea 8 - Black/Tan
Túi máy ảnh Billingham Avea 8 - Black Fibrenyte/Black
Túi máy ảnh Billingham Avea 8 - Black Fibrenyte/Tan
Túi máy ảnh Billingham Avea 8 - Burgundy/Chocolate
Túi máy ảnh Billingham Avea 8 - Grey/Black
Túi máy ảnh Billingham Avea 8 - Khaki/Tan
Túi máy ảnh Billingham Avea 8 - Khaki Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 8 - Khaki Fibrenyte/Tan
Túi máy ảnh Billingham Avea 8 - Sage Fibrenyte/Tan
Túi máy ảnh Billingham Avea 8 - Navy/Chocolate
Túi máy ảnh Billingham Avea 8 - Sage Fibrenyte/Black
Túi máy ảnh Billingham Avea 3 - Black Fibrenyte/Black Trim
Túi máy ảnh Billingham Avea 3 - Black Fibrenyte/Tan Trim
Túi máy ảnh Billingham Avea 3 - Black/Black
Túi máy ảnh Billingham Avea 3 - Burgundy/Chocolate
Túi máy ảnh Billingham Avea 3 - Grey/Black
Túi máy ảnh Billingham Avea 3 - Khaki Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 3 - Khaki Fibrenyte/Tan Trim
Túi máy ảnh Billingham Avea 3 - Khaki/Tan
Túi máy ảnh Billingham Avea 3 - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 3 - Sage Fibrenyte/Tan Trim
Túi máy ảnh Billingham Avea 5 - Black Fibrenyte/Black Trim
Túi máy ảnh Billingham Avea 5 - Black Fibrenyte/Tan Trim
Túi máy ảnh Billingham Avea 5 - Black/Tan
Túi máy ảnh Billingham Avea 5 - Burgundy/Chocolate
Túi máy ảnh Billingham Avea 5 - Khaki Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 5 - Khaki Fibrenyte/Tan Trim
Túi máy ảnh Billingham Avea 5 - Khaki/Tan
Túi máy ảnh Billingham Avea 5 - Sage Fibrenyte/Chocolate
Túi máy ảnh Billingham Avea 5 - Sage Fibrenyte/Tan Trim
Túi máy ảnh Billingham Delta Pocket - Black/Black
Túi máy ảnh Billingham Delta Pocket - Black/Tan
Túi máy ảnh Billingham Delta Pocket - Khaki Fibrenyte/Chocolate
Túi máy ảnh Think Tank TurnStyle 5 V2.0 Charcoal
Túi máy ảnh Think Tank TurnStyle 5 V2.0 Blue Indigo
Túi máy ảnh Think Tank TurnStyle 10 V2.0 Charcoal
Túi máy ảnh Think Tank TurnStyle 10 V2.0 Blue Indigo
Túi máy ảnh Think Tank TurnStyle 20 V2.0 Charcoal
Túi máy ảnh Think Tank TurnStyle 20 V2.0 Blue Indigo
Túi máy ảnh Think Tank SpeedTop Crossbody 10 - Graphite
Túi máy ảnh Think Tank SpeedTop Crossbody 15 - Graphite
Túi máy ảnh Think Tank Vision 10 - Graphite
Túi máy ảnh Think Tank Vision 13 - Graphite
Túi máy ảnh Think Tank Vision 15 - Graphite
Túi máy ảnh Think Tank Retrospective 4 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 4 V2.0 - Black
Túi máy ảnh Think Tank Retrospective 5 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 5 V2.0 - Black
Túi máy ảnh Think Tank Retrospective 7 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 7 V2.0 - Black
Túi máy ảnh Think Tank Retrospective 10 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 10 V2.0 - Black
Túi máy ảnh Think Tank Retrospective 20 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 20 V2.0 - Black
Túi máy ảnh Think Tank Retrospective 30 V2.0 - Pinestone
Túi máy ảnh Think Tank Retrospective 30 V2.0 - Black
Túi máy ảnh Think Tank Presspass 10
Túi máy ảnh Think Tank Presspass 20
Túi máy ảnh Think Tank Presspass Sling
Túi máy ảnh Think Tank Mirrorless Mover 5 - Pewter
Túi máy ảnh Think Tank Mirrorless Mover 5 - Dark Blue
Túi máy ảnh Think Tank Mirrorless Mover 5 - Deep Red
Túi máy ảnh Think Tank Mirrorless Mover 10 - Dark Blue
Túi máy ảnh Think Tank Mirrorless Mover 10 - Pewter
Túi máy ảnh Think Tank Mirrorless Mover 20 - Dark Blue
Túi máy ảnh Think Tank Mirrorless Mover 20 - Pewter
Túi máy ảnh Think Tank Mirrorless Mover 25I - Pewter
Túi máy ảnh Think Tank Mirrorless Mover 25I - Dark Blue
Túi máy ảnh Think Tank Mirrorless Mover 30I - Pewter
Túi máy ảnh Think Tank Mirrorless Mover 30I - Dark Blue
Túi máy ảnh Think Tank Mirrorless Mover 30I - Deep Red
Túi máy ảnh Think Tank Mirrorless Mover 10 - Grey
Túi máy ảnh Think Tank Mirrorless Mover 10 - Green
Túi máy ảnh Think Tank Mirrorless Mover 10 - Blue
Túi máy ảnh Think Tank Mirrorless Mover 20 - Grey
Túi máy ảnh Think Tank Mirrorless Mover 20 - Blue
Túi máy ảnh Think Tank Mirrorless Mover 25 - Green
Túi máy ảnh Think Tank Mirrorless Mover 25 - Blue
Túi đựng lens ThinkTank Digital Holster® 5 V3
Túi đựng lens ThinkTank Digital Holster® 10 V3
Túi đựng lens ThinkTank Digital Holster® 20 V3
Túi đựng lens ThinkTank Digital Holster® 30 V3
Túi đựng lens ThinkTank Digital Holster® 40 V3
Túi đựng lens ThinkTank Digital Holster® 50 V3
Túi đựng lens ThinkTank Digital Holster® 150 V3
Túi máy ảnh Think Tank PhotoCross 10 - Carbon Grey
Túi máy ảnh Think Tank PhotoCross 10 - Orange Ember
Túi Camera Bags Designer Mirrorless Mini-04
TÚI CAMERA BAGS DESIGNER MIRRORLES MINI-06
Túi Máy Ảnh Proweli DC23197 - Màu Đỏ
Túi máy ảnh Nikon
Túi máy ảnh Canon chính hãng LBM
Túi máy ảnh Peak Design Everyday Sling v2 6L (Midnight) | Nhập khẩu
Túi máy ảnh Peak Design Everyday Sling v2 6L (Black) | Nhập khẩu
Túi máy ảnh Peak Design Everyday Sling v2 3L (Black) | Nhập khẩu
Túi Fujifilm chính hãng (Quà tặng kèm)
Túi Proweli DC23197 - Màu Đen Cam
Túi máy ảnh Herringbone Papaspocket V3 Mini (Navy)
Túi máy ảnh Peak Design Everyday Messenger 13 Inch (Black)
Túi máy ảnh Think Tank Retrospective 7 V2.0 (Pinestone)
Túi đựng kính lọc Think Tank Filter Nest Mini
Túi đựng lens Think Tank Lens Changer 15 V3.0
Túi máy ảnh Think Tank Little Stuff It
Túi đựng lens Think Tank Lens Changer 25 V3.0
Túi đựng lens Think Tank Lens Changer 35 V3.0
Túi đựng lens Think Tank Lens Changer 50 V3.0
Túi máy ảnh Think Tank Stuff It
Túi máy ảnh Think Tank Mirrorless Mover 5 (Pewter)
Túi máy ảnh Think Tank Mirrorless Mover 5 (Dark Blue)
Túi máy ảnh Think Tank Mirrorless Mover 5 (Deep Red)
Túi máy ảnh Think Tank Digital Holster 5
Túi đựng lens Think Tank Lens Changer 75 Pop Down V3.0
Túi đựng lens Think Tank Skin 50 V3.0
Túi đựng kính lọc Think Tank Filter Nest
Túi máy ảnh Think Tank Mirrorless Mover 10 (Deep Red)
Túi máy ảnh Think Tank Mirrorless Mover 10 (Pewter)
Túi máy ảnh Think Tank Mirrorless Mover 10 (Dark Blue)
Túi đựng lens Think Tank Skin 75 Pop Down V3.0
Túi đựng lens Think Tank Lens Changer 150-600 V3.0
Túi máy ảnh Think Tank Mirrorless Mover 20 (Pewter)
Túi máy ảnh Think Tank Mirrorless Mover 20 (Dark Blue)
Túi máy ảnh Think Tank Mirrorless Mover 20 (Deep Red)
Túi máy ảnh Think Tank Digital Holster 10 V2.0
Túi đựng lens Think Tank Skin Changer Pop Down V3.0
Túi máy ảnh Think Tank Hubba Hubba Hiney V3.0
Túi máy ảnh Think Tank Speed Changer V3.0
Túi đựng kính lọc Think Tank Filter Hive
Túi máy ảnh Think Tank Mirrorless Mover 25i (Pewter)
Túi máy ảnh Think Tank Mirrorless Mover 25i (Dark Blue)
Túi máy ảnh Think Tank Mirrorless Mover 30i (Pewter)
Túi máy ảnh Think Tank Mirrorless Mover 30i (Dark Blue)
Túi máy ảnh Think Tank Mirrorless Mover 30i (Deep Red)
Túi máy ảnh Think Tank Digital Holster 20 V2.0
Túi máy ảnh Think Tank Digital Holster 30 V2.0
Túi máy ảnh Think Tank TurnStyle 5 V2.0 (Charcoal)
Túi máy ảnh Think Tank TurnStyle 5 V2.0 (Blue Indigo)
Túi máy ảnh Think Tank Digital Holster 40 V2.0
Túi máy ảnh Think Tank Digital Holster 50 V2.0
Túi máy ảnh Think Tank TurnStyle 10 V2.0 (Charcoal)
Túi máy ảnh Think Tank TurnStyle 10 V2.0 (Blue Indigo)
Túi máy ảnh Think Tank TurnStyle 20 V2.0 (Charcoal)
Túi máy ảnh Think Tank TurnStyle 20 V2.0 (Blue Indigo)
Túi máy ảnh Think Tank Urban Access Sling 8
Túi máy ảnh Think Tank Retrospective 4 V2.0 (Pinestone)
Túi máy ảnh Think Tank Retrospective 4 V2.0 (Black)
Túi máy ảnh Think Tank Digital Holster 150
Túi máy ảnh Think Tank Vision 10 (Graphite)
Túi máy ảnh Think Tank Urban Access Sling 10
Túi máy ảnh Think Tank PhotoCross 10 (Carbon Grey)
Túi máy ảnh Think Tank PhotoCross 10 (Orange Ember)
Túi máy ảnh Think Tank SpeedTop Crossbody 10 (Graphite)
Túi máy ảnh Think Tank Vision 13 (Graphite)
Túi máy ảnh Think Tank PhotoCross 13 (Carbon Grey)
Túi máy ảnh Think Tank PhotoCross 13 (Orange Ember)
Túi máy ảnh Think Tank Vision 15 (Graphite)
Túi máy ảnh Think Tank SpeedTop Crossbody 15 (Graphite)
Túi máy ảnh Think Tank Retrospective 5 V2.0 (Pinestone)
Túi máy ảnh Think Tank Retrospective 5 V2.0 (Black)
Túi máy ảnh Think Tank Retrospective 7 V2.0 (Black)
Túi máy ảnh Think Tank Retrospective 10 V2.0 (Pinestone)
Túi máy ảnh Think Tank Retrospective 10 V2.0 (Black)
Túi máy ảnh Think Tank Retrospective 20 V2.0 (Pinestone)
Túi máy ảnh Think Tank Retrospective 20 V2.0 (Black)
Túi máy ảnh Think Tank Retrospective 30 V2.0 (Pinestone)
Túi máy ảnh Think Tank Retrospective 30 V2.0 (Black)
Túi máy ảnh Herringbone Papaspocket V3 Mini (Wine)
Túi máy ảnh style Hàn Quốc
Vali chống sốc Zhiyun Weebill S, Weebill Lab
Túi máy ảnh Crumpler Jackpack 7500
Túi máy ảnh Fujifilm chính hãng ( Size L )
Túi máy ảnh Fujifilm chính hãng ( Size M )
Túi máy ảnh đeo chéo Crumpler Quick Escape Sling M
Túi PGYTECH chống sốc cho Osmo Pocket
Túi máy ảnh Herringbone Muppen Micro (Navy)
Túi máy ảnh Herringbone Tiny Mellow Canvas (Navy)
Túi máy ảnh Herringbone Tiny Mellow Canvas (Khaki)
Túi máy ảnh Herringbone Tiny Mellow Canvas (Charcoal)
Túi máy ảnh Retro Num.1242 (Xanh Lam - Cỡ nhỏ)
Túi máy ảnh Herringbone Tiny Mellow Canvas (Olive)
Túi máy ảnh Herringbone Papaspocket V4 Mini Series
PGYTECH Tech Pouch (Smoky Grey)
Túi máy ảnh National Geographic Small Shoulder Bag
Túi đeo chéo PGYTECH OneMo Shoulder Bag (Twilight Black)
PGYTECH OneGo Solo (Obsidian Black)
PGYTECH OneGo Solo (Deep Navy)
Túi máy ảnh Herringbone Papaspocket V3 Mini (Charcoal)
Túi máy ảnh Herringbone Papaspocket V3 Small (Olive)
Túi máy ảnh Herringbone Papaspocket V3 Mini (Olive)
Túi máy ảnh Herringbone Papaspocket V3 Mini (Khaki)
Túi máy ảnh Herringbone Papaspocket V3 Small (Burgundy)
Túi máy ảnh Herringbone Papaspocket V3 Small (Sand)
Túi máy ảnh Herringbone Papaspocket V3 Small (Wine)
Túi máy ảnh Herringbone Papaspocket V3 Medium (Khaki)
Túi máy ảnh Herringbone Papaspocket V3 Medium (Wine)
Túi máy ảnh Herringbone Papaspocket V3 Medium (Navy)
Túi máy ảnh Herringbone Papaspocket V3 Medium (Charcoal)
Túi máy ảnh Herringbone Papaspocket V3 Medium (Brown)
Túi máy ảnh Herringbone Maniere Small (Burgundy)
Túi máy ảnh Herringbone Maniere Small (Charcoal)
Túi máy ảnh Herringbone Maniere Small (Sand)
Túi máy ảnh Herringbone Maniere Small (Wine)
PGYTECH OneGo Shoulder Bag 6L (Obsidian Black)
PGYTECH OneGo Shoulder Bag 6L (Deep Navy)
Túi máy ảnh Herringbone Postman Small (Olive)
Túi máy ảnh Herringbone Postman Small (Charcoal)
Túi máy ảnh Herringbone Postman Small (Brown)
Túi máy ảnh Herringbone Postman Small (Khaki)
Túi máy ảnh Herringbone Postman Small (Navy)
PGYTECH OneGo Shoulder Bag 10L (Obsidian Black)
PGYTECH OneGo Shoulder Bag 10L (Shell Grey)
Túi máy ảnh Herringbone Postman Medium (Brown)
Túi máy ảnh Herringbone Postman Medium (Khaki)
Túi máy ảnh Herringbone Postman Medium (Olive)
Túi máy ảnh Herringbone Maniere Small (Olive)
(function () {
const requestAnimFrame = (function () {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
const hieuUngPhaoHoa = {
canvas: document.getElementById('hieuUngPhaoHoa__canvas'),
ctx: null,
cw: window.innerWidth,
ch: window.innerHeight,
fireworks: [],
particles: [],
colors: [0, 60, 300], // Mảng các màu
hue: 0,
timerTotal: 30, // Giảm thời gian giữa các lần bắn
timerTick: 0,
isActive: true, // Biến để kiểm soát trạng thái hoạt động
init: function () {
this.ctx = this.canvas.getContext('2d');
this.canvas.width = this.cw;
this.canvas.height = this.ch;
this.loop();
// Tự động dừng sau 5 giây
setTimeout(() => {
this.isActive = false;
}, 5000);
},
calculateDistance: function (p1x, p1y, p2x, p2y) {
const xDistance = p1x - p2x;
const yDistance = p1y - p2y;
return Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
},
random: function (min, max) {
return Math.random() * (max - min) + min;
},
createParticles: function (x, y) {
let particleCount = 30;
// Chọn màu ngẫu nhiên từ mảng
this.hue = this.colors[Math.floor(Math.random() * this.colors.length)];
while (particleCount--) {
this.particles.push(new Particle(x, y, this));
}
},
// Main loop
loop: function () {
if (!this.isActive && this.fireworks.length === 0 && this.particles.length === 0) {
return; // Dừng animation khi hết pháo hoa
}
requestAnimFrame(this.loop.bind(this));
this.hue += 0.5;
this.ctx.globalCompositeOperation = 'destination-out';
this.ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';
this.ctx.fillRect(0, 0, this.cw, this.ch);
this.ctx.globalCompositeOperation = 'lighter';
let i = this.fireworks.length;
while (i--) {
this.fireworks[i].draw();
this.fireworks[i].update(i);
}
i = this.particles.length;
while (i--) {
this.particles[i].draw();
this.particles[i].update(i);
}
// Tự động bắn pháo hoa nếu đang hoạt động
if (this.isActive && this.timerTick >= this.timerTotal) {
this.fireworks.push(new Firework(
this.cw / 2, this.ch,
this.random(0, this.cw),
this.random(0, this.ch / 2),
this
));
this.timerTick = 0;
} else {
this.timerTick++;
}
}
};
// Firework class
class Firework {
constructor(sx, sy, tx, ty, main) {
this.main = main;
this.x = sx;
this.y = sy;
this.sx = sx;
this.sy = sy;
this.tx = tx;
this.ty = ty;
this.distanceToTarget = main.calculateDistance(sx, sy, tx, ty);
this.distanceTraveled = 0;
this.coordinates = [];
this.coordinateCount = 3;
while (this.coordinateCount--) {
this.coordinates.push([this.x, this.y]);
}
this.angle = Math.atan2(ty - sy, tx - sx);
this.speed = 2;
this.acceleration = 1.05;
this.brightness = main.random(50, 70);
this.targetRadius = 1;
}
update(index) {
this.coordinates.pop();
this.coordinates.unshift([this.x, this.y]);
if (this.targetRadius < 8) {
this.targetRadius += 0.3;
} else {
this.targetRadius = 1;
}
this.speed *= this.acceleration;
const vx = Math.cos(this.angle) * this.speed;
const vy = Math.sin(this.angle) * this.speed;
this.distanceTraveled = this.main.calculateDistance(
this.sx, this.sy, this.x + vx, this.y + vy
);
if (this.distanceTraveled >= this.distanceToTarget) {
this.main.createParticles(this.tx, this.ty);
this.main.fireworks.splice(index, 1);
} else {
this.x += vx;
this.y += vy;
}
}
draw() {
this.main.ctx.beginPath();
this.main.ctx.moveTo(
this.coordinates[this.coordinates.length - 1][0],
this.coordinates[this.coordinates.length - 1][1]
);
this.main.ctx.lineTo(this.x, this.y);
this.main.ctx.strokeStyle = `hsl(${this.main.hue}, 100%, ${this.brightness}%)`;
this.main.ctx.stroke();
}
}
// Particle class
class Particle {
constructor(x, y, main) {
this.main = main;
this.x = x;
this.y = y;
this.coordinates = [];
this.coordinateCount = 5;
while (this.coordinateCount--) {
this.coordinates.push([this.x, this.y]);
}
this.angle = main.random(0, Math.PI * 2);
this.speed = main.random(1, 10);
this.friction = 0.95;
this.gravity = 1;
this.hue = main.random(main.hue - 20, main.hue + 20);
this.brightness = main.random(50, 80);
this.alpha = 1;
this.decay = main.random(0.015, 0.03);
}
update(index) {
this.coordinates.pop();
this.coordinates.unshift([this.x, this.y]);
this.speed *= this.friction;
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed + this.gravity;
this.alpha -= this.decay;
if (this.alpha <= this.decay) {
this.main.particles.splice(index, 1);
}
}
draw() {
this.main.ctx.beginPath();
this.main.ctx.moveTo(
this.coordinates[this.coordinates.length - 1][0],
this.coordinates[this.coordinates.length - 1][1]
);
this.main.ctx.lineTo(this.x, this.y);
this.main.ctx.strokeStyle = `hsla(${this.hue}, 100%, ${this.brightness}%, ${this.alpha})`;
this.main.ctx.stroke();
}
}
// Khởi chạy khi trang load xong
//window.addEventListener('load', () => hieuUngPhaoHoa.init());
})();