Khoảng giá
Từ: 0 triệu
Đến: Không giới hạn
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());
})();