Khoảng giá
Từ: 0 triệu
Đến: Không giới hạn
Bộ sạc đôi và 2 pin KingMa NP-FZ100
HÀNG MỚI ĐÃ TẠM HẾT
Bộ sạc đôi KingMa BM058-FZ100
Đơn giá
120,000đ
Sạc đôi Kingma BM058-FW50
Đơn giá
120,000đ
Bộ sạc đôi Kingma BM058-LPE12
Đơn giá
120,000đ
Bộ sạc pin Kingma BM058 LP-E6
Đơn giá
200,000đ
Bộ sạc đôi cho pin Kingma LP-E6NH
Đơn giá
200,000đ
Pin Kingma for Canon LP-E8
Đơn giá
370,000đ
Pin KingMa LP-E12 (750mAh)
Đơn giá
370,000đ
Pin Kingma LP-E6
Đơn giá
370,000đ
BỘ 1 PIN 1 SẠC KINGMA NP-BX1 FOR SONY
Đơn giá
450,000đ
Pin KingMa NP-FZ100 (2000mAh)
Đơn giá
550,000đ
Pin Kingma LP-E6NH
Đơn giá
550,000đ
PIN ẢO DUmmY KINGMA NP-FZ100 FOR SONY
Đơn giá
700,000đ
Bộ sạc đôi và Pin KingMa NP-W126S
Đơn giá
790,000đ
Bộ sạc đôi + Pin BM058-NPW126
Đơn giá
790,000đ
Bộ sạc đôi và 2 pin KingMa LP-E12
Đơn giá
790,000đ
Bộ sạc đôi + 2 Pin Kingma BM058-NPW235
Đơn giá
790,000đ
Bộ sạc pin Kingma BM058 - ENEL15 và 2 pin KingMa EN-EL15 Cho Nikon
Đơn giá
790,000đ
Bộ sạc đôi + pin Kingma LP-E6NH
Đơn giá
1,150,000đ
Sạc Kingma for Canon LP-E8
HÀNG MỚI ĐÃ TẠM HẾT
Bộ sạc đôi + pin Kingma BM058-FW50
HÀNG MỚI ĐÃ TẠM HẾT
Bộ sạc pin Kingma BM058 LP-E6 và Pin LP-E6
HÀNG MỚI ĐÃ TẠM HẾT
Đầu đọc thẻ nhớ Kingma 3.0
HÀNG MỚI ĐÃ TẠM HẾT
Pin Kingma BM058-NPW126
HÀNG MỚI ĐÃ TẠM HẾT
Bộ sạc đôi + Pin Kingma BM058-GP9
HÀNG MỚI ĐÃ TẠM HẾT
Bộ đốc sạc 3 khe và 2 Pin Kingma BM060BT101-2BM cho Gopro Hero 9/10/11
HÀNG MỚI ĐÃ TẠM HẾT
Bộ sạc kèm pin Kingma dành cho DJI Osmo Action
HÀNG MỚI ĐÃ TẠM HẾT
KingMa Vlogging Grip Tripod cho Sony A6xx, A7x, Rx series
HÀNG MỚI ĐÃ TẠM HẾT
Bộ đốc sạc 3 khe và 2 pin KingMa SPVB1B cho GoPro Hero 8/7/6/5
HÀNG MỚI ĐÃ TẠM HẾT
(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());
})();