Khoảng giá
Từ: 0 triệu
Đến: Không giới hạn
MÁY ẢNH NIKON D4
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
11,000,000đ
Máy ảnh Nikon D7500 (Body Only)
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Nikon D750 (Body Only)
Vui lòng gọi
MÁY ẢNH NIKON D5000
Vui lòng gọi
Máy ảnh Nikon D500 (Body Only) | Chính hãng
Giá từ:
16,500,000đ
MÁY ẢNH NIKON D300S
Vui lòng gọi
MÁY ẢNH NIKON D810
Vui lòng gọi
Máy ảnh Nikon D780 (Body)
Giá từ:
34,000,000đ
Máy ảnh Nikon D850 (Body Only)
Giá từ:
23,500,000đ
Máy ảnh Nikon D6 Body Only
Giá từ:
138,990,000đ
Máy ảnh Nikon D7200
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
5,500,000đ
Máy ảnh Nikon D7000
HÀNG MỚI ĐÃ TẠM HẾT
Hàng cũ giá từ:
1,990,000đ
Máy ảnh Nikon D610
HÀNG MỚI ĐÃ TẠM HẾT
Máy Ảnh Nikon D5
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Nikon D5300 (Body Only) | Chính hãng
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Nikon D3400 | Chính hãng
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Nikon D5600 (Body Only) | Chính hãng
HÀNG MỚI ĐÃ TẠM HẾT
Máy ảnh Nikon D7100 | Chính hãng
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D2X
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D3X
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D600
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D70S
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D5200
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D800E
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D3300
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D3100
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D5100
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D3200
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D3S
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D60
HÀNG MỚI ĐÃ TẠM HẾT
MÁY ẢNH NIKON D70
MÁY ẢNH NIKON D300
MÁY ẢNH NIKON D80
MÁY ẢNH NIKON D4S
MÁY ẢNH NIKON D800
MÁY ẢNH NIKON D200
MÁY ẢNH NIKON D40X
MÁY ẢNH NIKON D90
MÁY ẢNH NIKON D3000
MÁY ẢNH NIKON D3500
MÁY ẢNH NIKON D700
(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());
})();