返回

《明日方舟》签到效果实现

前端

《明日方舟》签到效果实现

在《明日方舟》游戏中,玩家可以通过每日签到来获得奖励。签到时,屏幕上会出现一个网格,网格中每个格子都包含一个数字。玩家需要点击这些数字,使它们按顺序排列。当所有数字都排列正确后,玩家即可获得奖励。

而在游戏里面,似乎采用了静态贴图,这可能是由于手游没有这样的交互动作,所以显得有些差强人意。这一次,我们试着在 web 里面实现类似的效果。步骤分为 4 步。

  1. 分层
    分开两层图层,数字层与网格层。让数字层放在网格层之上,大概就是这种感觉。实际 dom 的排列顺序保持不变,通过 CSS 修改数字层的位置即可。具体实现代码如下:
.grid {
  position: relative;
}

.numbers {
  position: absolute;
  top: 0;
  left: 0;
}
  1. 排序
    排好序的数字层和网格层,我们还需要在点击后触发重新排序的效果。这部分借助于 JavaScript 实现。具体的实现代码如下:
// 监听数字层的点击事件
document.querySelector('.numbers').addEventListener('click', function(e) {
  // 获取被点击的数字
  const number = e.target;

  // 获取被点击数字的父级元素
  const parent = number.parentNode;

  // 获取被点击数字的索引
  const index = Array.from(parent.children).indexOf(number);

  // 如果被点击的数字不是最后一个数字
  if (index < parent.children.length - 1) {
    // 将被点击的数字与下一个数字交换位置
    parent.insertBefore(number, parent.children[index + 1]);
  }
});
  1. 动画
    排序完成后,我们还需要让数字层平滑地移动到正确的位置。这部分借助于 CSS 的过渡效果实现。具体的实现代码如下:
.numbers {
  transition: transform 0.5s ease-in-out;
}
  1. 优化
    为了提高性能,我们可以对代码进行优化。例如,我们可以使用 requestAnimationFrame 来控制动画的帧率,或者使用事件委托来减少事件监听器的数量。具体的优化代码如下:
// 使用 requestAnimationFrame 来控制动画的帧率
let requestId = null;
function animate() {
  requestId = requestAnimationFrame(animate);
  // 动画代码
}
animate();

// 使用事件委托来减少事件监听器的数量
document.querySelector('.grid').addEventListener('click', function(e) {
  // 获取被点击的数字
  const number = e.target.closest('.number');

  // 如果被点击的数字不是最后一个数字
  if (number && number.nextElementSibling) {
    // 将被点击的数字与下一个数字交换位置
    number.parentNode.insertBefore(number, number.nextElementSibling);
  }
});

以上就是在 web 中实现类似于《明日方舟》签到的效果的步骤。希望这篇文章对您有所帮助。