当前位置: 首页 > news >正文

前端如何用canvas来做电影院选票功能

在前端开发中,使用 canvas 实现电影院选票功能可以通过以下步骤来完成。你需要绘制座位图,并处理用户交互来选择座位。以下是一个大概的流程:

1. 创建Canvas

首先,在HTML中创建一个canvas元素。

<canvas id="seatCanvas" width="600" height="400"></canvas>

2. 获取Canvas上下文

通过JavaScript获取canvas的绘图上下文。

const canvas = document.getElementById('seatCanvas');
const ctx = canvas.getContext('2d');

3. 定义座位数据

定义一个数组来表示每个座位的位置和状态,例如是否已被选中或已被占用。

const seats = [
  { x: 50, y: 50, width: 40, height: 40, status: 'available' },
  { x: 100, y: 50, width: 40, height: 40, status: 'available' },
  { x: 150, y: 50, width: 40, height: 40, status: 'taken' },
  // 添加更多座位
];

4. 绘制座位图

使用canvas的绘图方法绘制每个座位。不同的状态可以用不同的颜色表示(如空闲、已选择、已占用)。

function drawSeats() {
  ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
  seats.forEach(seat => {
    ctx.beginPath();
    ctx.rect(seat.x, seat.y, seat.width, seat.height);
    if (seat.status === 'available') {
      ctx.fillStyle = 'green'; // 空闲座位
    } else if (seat.status === 'taken') {
      ctx.fillStyle = 'red'; // 已占用座位
    } else if (seat.status === 'selected') {
      ctx.fillStyle = 'blue'; // 选中的座位
    }
    ctx.fill();
    ctx.stroke();
  });
}

5. 处理用户点击选择座位

使用 canvasclick 事件来监听用户点击的座位,更新选中状态。

canvas.addEventListener('click', function(event) {
  const x = event.offsetX;
  const y = event.offsetY;

  seats.forEach(seat => {
    if (x > seat.x && x < seat.x + seat.width && y > seat.y && y < seat.y + seat.height) {
      if (seat.status === 'available') {
        seat.status = 'selected'; // 将座位标记为选中
      } else if (seat.status === 'selected') {
        seat.status = 'available'; // 取消选中
      }
      drawSeats(); // 重新绘制座位
    }
  });
});

6. 初始化绘制座位

在页面加载时调用 drawSeats 来绘制初始座位图。

drawSeats();

完整代码示例

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>电影院选票</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="seatCanvas" width="600" height="400"></canvas>
  <script>
    const canvas = document.getElementById('seatCanvas');
    const ctx = canvas.getContext('2d');

    const seats = [
      { x: 50, y: 50, width: 40, height: 40, status: 'available' },
      { x: 100, y: 50, width: 40, height: 40, status: 'available' },
      { x: 150, y: 50, width: 40, height: 40, status: 'taken' },
      { x: 200, y: 50, width: 40, height: 40, status: 'available' },
      { x: 50, y: 100, width: 40, height: 40, status: 'available' },
      // 可以继续添加更多座位
    ];

    function drawSeats() {
      ctx.clearRect(0, 0, canvas.width, canvas.height); // 清空画布
      seats.forEach(seat => {
        ctx.beginPath();
        ctx.rect(seat.x, seat.y, seat.width, seat.height);
        if (seat.status === 'available') {
          ctx.fillStyle = 'green'; // 空闲座位
        } else if (seat.status === 'taken') {
          ctx.fillStyle = 'red'; // 已占用座位
        } else if (seat.status === 'selected') {
          ctx.fillStyle = 'blue'; // 选中的座位
        }
        ctx.fill();
        ctx.stroke();
      });
    }

    canvas.addEventListener('click', function(event) {
      const x = event.offsetX;
      const y = event.offsetY;

      seats.forEach(seat => {
        if (x > seat.x && x < seat.x + seat.width && y > seat.y && y < seat.y + seat.height) {
          if (seat.status === 'available') {
            seat.status = 'selected'; // 将座位标记为选中
          } else if (seat.status === 'selected') {
            seat.status = 'available'; // 取消选中
          }
          drawSeats(); // 重新绘制座位
        }
      });
    });

    drawSeats(); // 初始绘制座位
  </script>
</body>
</html>

进一步优化

  • 可以增加座位的行列布局,更加细化座位的排布。
  • 可以将座位信息存储到数据库,进行用户选择保存。
  • 可以加入提示信息,比如显示已选择的座位、已售出的座位等。

这样,你就能够使用 canvas 来实现一个简单的电影院选票功能。

相关文章:

  • K8S学习之基础四十七:k8s中部署fluentd
  • Java多线程与高并发专题——如何利用 CompletableFuture 解决“聚合打车服务平台”的问题?
  • 2.4 隐函数及由参数方程确定的函数求导
  • C#中值类型与引用类型是直观使用示例
  • __init__.py
  • openGauss关联列数据类型不一致引起谓词传递失败
  • fuse性能关键参数entry_timeout
  • python面试高频考点(深度学习大模型方向)
  • V8引擎源码编译踩坑实录
  • 如何在 Vue 项目中使用v - show和v - if指令,它们的原理、区别和适用场景是什么
  • jangow-01-1.0.1靶机攻略
  • QuecPython 外设接口之GPIO应用指南
  • java中的常量可以不用在声明的时候初始化,c中的必须在声明的时候初始化,可不可以这么理解?
  • HDMI(High-Definition Multimedia Interface)详解
  • 三分钟读懂微服务
  • UE4学习笔记 FPS游戏制作16 重构FppShooter和RoboteShooter 提出父类Shooter
  • HTML应用指南:利用POST请求获取城市肯德基门店位置信息
  • 【八股文】http怎么建立连接的
  • 破解云端依赖!如何通过Flowise搭建私有化的端到端AI开发环境
  • [250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!
  • 科学家为AI模型设置“防火墙”,以防止被不法分子滥用
  • 交行一季度净利253.72亿元增1.54%,不良率微降
  • 演员刘美含二手集市被曝售假,本人道歉
  • 船只深夜撞上海上风机后沉没1死1失踪,调查报告公布
  • 商务部:4月份以来的出口总体延续平稳增长态势
  • 原创话剧风向标!这个展演上《大宅门》《白鹿原》先后上演