不知道老网民们还记不记得这个魔性的时钟插件:

作为网上冲浪十数载的网虫,不久前看到这个图瞬间破防,直接梦回10年前的qq空间,感叹一下岁月蹉跎、时光荏苒、青春不在、不胜唏嘘。
十年后的今天,flash在各个浏览器都已经不再支持,已经是个不再那个只会用脚本打扮qq空间的我,自然得用青春换来得技术还原一下自己的青春记忆。
首先感谢原作者提供的如此优秀好玩的插件: http://chabudai.org/blog/?p=59
这次为了图方便,就直接那pixi.js来上手做动画了,动画素材来源于油管视频,拿到ps逐帧抠图并导出,这个过程就不再详细介绍了。合成后的精灵图以及对应的json文件我会放在文章末尾。
核心的api是pixi.animatedsprite。
代码也是很短,就直接放到下面了
<!doctype html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>honehoneclock</title>
<style>
* {
padding: 0;
margin: 0;
}
html, body {
width: 100%;
height: 100%;
}
body {
background-color: lightcyan;
}
canvas {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
}
</style>
</head>
<body>
<canvas class="canvas"></canvas>
<script src="pixi_5.3.4.min.js"></script>
<script src="stats.min.js"></script>
<script>
(async function () {
const stats = new stats()
document.body.appendchild(stats.domelement)
let pagewidth = 0
let pageheight = 0
let clockhour1, clockhour2
let clockmin1, clockmin2
let clocksec1, clocksec2
const $canvas = document.queryselector('canvas')
const renderer = new pixi.renderer({
view: $canvas,
width: pagewidth,
height: pageheight,
transparent: true,
autodensity: true,
antialias: true
})
// 人体时钟
class clock extends pixi.container {
constructor (name) {
super()
const textures = loader.resources[honehoneclockjson].textures
let frames = []
let anidata = []
if (this.frames) {
frames = this.frames
anidata = this.anidata
}
else {
anidata = [
{
prefix: '0',
count: 6,
framefrom: -1,
frameto: -1,
},
{
prefix: '1',
count: 9,
framefrom: -1,
frameto: -1,
},
{
prefix: '2',
count: 7,
framefrom: -1,
frameto: -1,
},
{
prefix: '3',
count: 6,
framefrom: -1,
frameto: -1,
},
{
prefix: '4',
count: 9,
framefrom: -1,
frameto: -1,
},
{
prefix: '5',
count: 14,
framefrom: -1,
frameto: -1,
},
{
prefix: '6',
count: 7,
framefrom: -1,
frameto: -1,
},
{
prefix: '7',
count: 10,
framefrom: -1,
frameto: -1,
},
{
prefix: '8',
count: 7,
framefrom: -1,
frameto: -1,
},
{
prefix: '9',
count: 9,
framefrom: -1,
frameto: -1,
},
]
let k = 0
for (let i = 0; i < anidata.length; i++) {
const data = anidata[i]
data.framefrom = k
for (let j = 1; j <= data.count; j++) {
k++
frames.push(textures[`${data.prefix}(${j}).png`])
}
data.frameto = k - 1
}
this.frames = frames
this.anidata = anidata
}
const ani = new pixi.animatedsprite(frames)
ani.anchor.set(0.5, 1)
ani.animationspeed = 0.4
this.stopat = -1
ani.onframechange = () => {
if (ani.currentframe === this.stopat) {
ani.stop()
}
}
this.addchild(ani)
this.name = name
this.ani = ani
this.num = -1
}
set number (number) {
if (this.num !== number) {
this.num = number
this.stopat = this.anidata[number].frameto
this.ani.gotoandplay(this.anidata[number].framefrom)
}
}
}
const stage = new pixi.container()
stage.name = 'stage'
let clockwrap
const ticker = new pixi.ticker()
let now = new date()
let lasttime = now.gettime()
const loop = function () {
stats.begin()
now = new date()
if (now.gettime() - lasttime >= 1000) {
let hours = now.gethours()
if (hours > 9) {
clockhour1.number = math.floor(hours / 10)
clockhour2.number = hours % 10
}
else {
clockhour1.number = 0
clockhour2.number = hours
}
let minutes = now.getminutes()
if (minutes > 9) {
clockmin1.number = math.floor(minutes / 10)
clockmin2.number = minutes % 10
}
else {
clockmin1.number = 0
clockmin2.number = minutes
}
let seconds = now.getseconds()
if (seconds > 9) {
clocksec1.number = math.floor(seconds / 10)
clocksec2.number = seconds % 10
}
else {
clocksec1.number = 0
clocksec2.number = seconds
}
lasttime = now.gettime()
}
renderer.render(stage)
stats.end()
}
ticker.add(loop)
const honehoneclockjson = 'honehoneclock.json'
const loader = new pixi.loader()
loader.add([honehoneclockjson])
loader.oncomplete.add(async (res) => {
clockwrap = new pixi.container()
clockwrap.position.set((pagewidth - 630) * 0.5, (pageheight + 150) * 0.5)
clockhour1 = new clock('hour')
clockhour2 = new clock('hour')
clockmin1 = new clock('min')
clockmin2 = new clock('min')
clocksec1 = new clock('sec')
clocksec2 = new clock('sec')
clockhour1.position.set(0, 0)
clockhour2.position.set(100, 0)
clockmin1.position.set(250, 0)
clockmin2.position.set(350, 0)
clocksec1.position.set(500, 0)
clocksec2.position.set(600, 0)
clockwrap.addchild(clockhour1)
clockwrap.addchild(clockhour2)
clockwrap.addchild(clockmin1)
clockwrap.addchild(clockmin2)
clockwrap.addchild(clocksec1)
clockwrap.addchild(clocksec2)
stage.addchild(clockwrap)
// 开始动画循环
ticker.start()
})
loader.load()
const onresize = (e) => {
pagewidth = document.body.clientwidth
pageheight = document.body.clientheight
if (clockwrap) {
clockwrap.position.set((pagewidth - 630) * 0.5, (pageheight + 150) * 0.5)
}
renderer.resize(pagewidth, pageheight)
}
onresize()
window.onresize = onresize
})()
</script>
</body>
</html>
到此这篇关于canvas版人体时钟的实现示例的文章就介绍到这了,更多相关canvas人体时钟内容请搜索代码网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持代码网!
发表评论