前端怎样用 canvas 做电影院选票功能

打印 上一主题 下一主题

主题 1665|帖子 1665|积分 4995

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、结构与基础设置

1. HTML 结构

首先在 HTML 文件中创建一个`canvas`元素,用于绘制座位图。比方:
  1. <canvas id="seat-canvas" width="800" height="600"></canvas>
复制代码
2. CSS 样式

可以为`canvas`元素添加一些基本的样式,如边框等,让它在页面中更好地体现。
  1. #seat-canvas {
  2.   border: 1px solid black;
  3. }
复制代码
3. JavaScript 初始化

在 JavaScript 文件中获取`canvas`元素,并获取其绘图上下文。绘图上下文有两种类型:`2d`和`webgl`,这里利用`2d`上下文来绘制简朴的座位图。
  1. const canvas = document.getElementById("seat-canvas");
  2. const ctx = canvas.getContext("2d");
复制代码
二、绘制座位图

1. 定义座位结构

假设电影院的座位是一个矩形分列的矩阵,可以用一个二维数组来表现座位结构。比方,`0`表现空座位,`1`表现已售座位,`2`表现可选座位。
  1. const seatLayout = [
  2.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  3.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  4.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  5.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  6.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  7.   [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  8. ];
复制代码
2. 绘制单个座位

编写一个函数来绘制单个座位。可以根据座位的状态(可选、已售等)来绘制不同的颜色或样式。比方,用绿色表现可选座位,红色表现已售座位,灰色表现不可用座位。
  1. const seatWidth = 40;
  2. const seatHeight = 40;
  3. const seatMargin = 5;
  4. function drawSeat(x, y, status) {
  5.   ctx.beginPath();
  6.   ctx.rect(x, y, seatWidth, seatHeight);
  7.   if (status === 0) {
  8.     ctx.fillStyle = "gray";
  9.   } else if (status === 1) {
  10.     ctx.fillStyle = "red";
  11.   } else if (status === 2) {
  12.     ctx.fillStyle = "green";
  13.   }
  14.   ctx.fill();
  15.   ctx.strokeStyle = "black";
  16.   ctx.stroke();
  17. }
复制代码
3. 绘制整个座位图

利用嵌套循环遍历座位结构数组,调用`drawSeat`函数来绘制每个座位。
  1. let x = 0;
  2. let y = 0;
  3. for (let row = 0; row < seatLayout.length; row++) {
  4.   for (let col = 0; col < seatLayout[row].length; col++) {
  5.     drawSeat(x, y, seatLayout[row][col]);
  6.     x += seatWidth + seatMargin;
  7.   }
  8.   x = 0;
  9.   y += seatHeight + seatMargin;
  10. }
复制代码
三、实现选票功能

1. 添加点击事件监听器

为`canvas`元素添加一个点击事件监听器,当用户点击座位时,判断点击的位置对应的座位,并根据座位状态进行相应的操作。
  1. canvas.addEventListener("click", function (e) {
  2.   const rect = canvas.getBoundingClientRect();
  3.   const x = e.clientX - rect.left;
  4.   const y = e.clientY - rect.top;
  5.   let seatX = Math.floor(x / (seatWidth + seatMargin));
  6.   let seatY = Math.floor(y / (seatHeight + seatMargin));
  7.   if (
  8.     seatX >= 0 &&
  9.     seatX < seatLayout[0].length &&
  10.     seatY >= 0 &&
  11.     seatY < seatLayout.length
  12.   ) {
  13.     let seatStatus = seatLayout[seatY][seatX];
  14.     if (seatStatus === 2) {
  15.       seatLayout[seatY][seatX] = 1;
  16.       drawSeat(
  17.         seatX * (seatWidth + seatMargin),
  18.         seatY * (seatHeight + seatMargin),
  19.         1
  20.       );
  21.     }
  22.   }
  23. });
复制代码
2. 记录所选座位信息

可以创建一个数组来记录所选座位的信息,比方座位的坐标大概座位在座位结构数组中的索引。
  1. const selectedSeats = [];
  2. canvas.addEventListener("click", function (e) {
  3.   const rect = canvas.getBoundingClientRect();
  4.   const x = e.clientX - rect.left;
  5.   const y = e.clientY - rect.top;
  6.   let seatX = Math.floor(x / (seatWidth + seatMargin));
  7.   let seatY = Math.floor(y / (seatHeight + seatMargin));
  8.   if (
  9.     seatX >= 0 &&
  10.     seatX < seatLayout[0].length &&
  11.     seatY >= 0 &&
  12.     seatY < seatLayout.length
  13.   ) {
  14.     let seatStatus = seatLayout[seatY][seatX];
  15.     if (seatStatus === 2) {
  16.       seatLayout[seatY][seatX] = 1;
  17.       drawSeat(
  18.         seatX * (seatWidth + seatMargin),
  19.         seatY * (seatHeight + seatMargin),
  20.         1
  21.       );
  22.       selectedSeats.push({ x: seatX, y: seatY });
  23.     }
  24.   }
  25. });
复制代码
四、其他功能扩展

1. 体现座位信息

可以在页面上添加一个区域来体现所选座位的信息,如座位号、排数等。
  1. const seatInfoDiv = document.createElement("div");
  2. document.body.appendChild(seatInfoDiv);
  3. function updateSeatInfo() {
  4.   let seatInfoText = "所选座位:";
  5.   selectedSeats.forEach((seat) => {
  6.     seatInfoText += `排 ${seat.y + 1} 座 ${seat.x + 1}, `;
  7.   });
  8.   seatInfoDiv.textContent = seatInfoText;
  9. }
  10. canvas.addEventListener("click", function (e) {
  11.   //... 前面的点击事件处理代码
  12.   updateSeatInfo();
  13. });
复制代码
2. 与后端交互(购买功能)

假如要实现真正的购票功能,需要将所选座位信息发送到后端服务器。可以利用`fetch`或`XMLHttpRequest`等方法来发送数据。比方:
  1. const buyButton = document.createElement("button");
  2. buyButton.textContent = "购买所选座位";
  3. document.body.appendChild(buyButton);
  4. buyButton.addEventListener("click", function () {
  5.   const seatData = {
  6.     selectedSeats: selectedSeats,
  7.   };
  8.   fetch("https://example.com/buy-seats", {
  9.     method: "POST",
  10.     headers: {
  11.       "Content-Type": "application/json",
  12.     },
  13.     body: JSON.stringify(seatData),
  14.   })
  15.     .then((response) => response.json())
  16.     .then((data) => {
  17.       if (data.success) {
  18.         alert("购票成功!");
  19.       } else {
  20.         alert("购票失败。");
  21.       }
  22.     });
  23. });
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表