Máy ảnh Canon EOS 5D Mark IV (Body Only)
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
17,990,000đ
Máy ảnh Canon EOS 6D Mark II (Body Only)
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
18,000,000đ
Máy ảnh Canon EOS-1DX
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
16,000,000đ
Máy ảnh Canon EOS 90D (Body Only) | Nhập khẩu
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 5DS R
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS Kiss X90
Giá giao động:
7,900,000đ
Máy ảnh Canon EOS Kiss X9
Giá giao động:
8,500,000đ
Máy ảnh Canon EOS Rebel T6i
Giá giao động:
8,900,000đ
Máy ảnh Canon EOS-1DX Mark II
Giá giao động:
120,900,000đ
Máy ảnh Canon EOS 40D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 1100D
HÀNG MỚI ĐÃ TẠM HẾT
Canon EOS-1DS Mark III
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 4000D
HÀNG MỚI ĐÃ TẠM HẾT
Canon EOS 300D (EOS Digital Rebel | EOS Kiss Digital)
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh DSLR Canon EOS Rebel T5i
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 77D (Body Only)
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 1300D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 400D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 1000D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS REBEL T7
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 250D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS REBEL XSI
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 550D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 200D Mark II
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 450D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 350D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 30D
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
1,500,000đ
Máy ảnh Canon EOS 600D
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Canon EOS 60D
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH CANON EOS 50D
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());
})();