# vue-tetris **Repository Path**: liuyuantao/vue-tetris ## Basic Information - **Project Name**: vue-tetris - **Description**: 用Vue、Vuex、Immutable做俄罗斯方块!戳:http://binaryify.github.io/vue-tetris/ 玩一玩! - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2017-06-14 - **Last Updated**: 2024-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 用Vue、Vuex、Immutable做俄罗斯方块 ---- 本项目灵感来源于 React 版的[俄罗斯方块](https://github.com/chvin/react-tetris),由于对其实现原理较感兴趣,而且相比于 React 更喜欢 Vue, 于是把 React 版的重构为了 Vue 版的,大致思路是把组件当成一个个函数,保证一个输入(props)能得到一个确定的输出(view),然后对不同方法也是做同样处理,对于 Redux 使用 Vuex 精简化 戳:[http://binaryify.github.io/vue-tetris/](http://binaryify.github.io/vue-tetris/) 玩一玩! ---- ### 效果预览 ![效果预览](https://img.alicdn.com/tps/TB1Ag7CNXXXXXaoXXXXXXXXXXXX-320-483.gif) 正常速度的录制,体验流畅。 ### 响应式 ![响应式](https://img.alicdn.com/tps/TB1AdjZNXXXXXcCapXXXXXXXXXX-480-343.gif) 不仅指屏幕的自适应,而是`在PC使用键盘、在手机使用手指的响应式操作`: ![手机](https://img.alicdn.com/tps/TB1kvJyOVXXXXbhaFXXXXXXXXXX-320-555.gif) ### 数据持久化 [视频](http://7xkm8j.com1.z0.glb.clouddn.com/persistence.mp4) 玩单机游戏最怕什么?断电。通过订阅 `store.subscribe`,将state储存在localStorage,精确记录所有状态。网页关了刷新了、程序崩溃了、手机没电了,重新打开连接,都可以继续。 ### Vuex 状态预览([Vue DevTools extension](https://github.com/vuejs/vue-devtools)) [视频](http://7xkm8j.com1.z0.glb.clouddn.com/vuex.mp4) Vuex 设计管理了所有应存的状态,这是上面持久化的保证。 ---- 游戏框架使用的是 Vue + Vuex,其中再加入了 Immutable,确保性能和数据可靠性 ## 1、什么是 Immutable? Immutable 是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。 ### 初识: 让我们看下面一段代码: ``` JavaScript function keyLog(touchFn) { let data = { key: 'value' }; f(data); console.log(data.key); // 猜猜会打印什么? } ``` 不查看f,不知道它对 `data` 做了什么,无法确认会打印什么。但如果 `data` 是 Immutable,你可以确定打印的是 `value`: ``` JavaScript function keyLog(touchFn) { let data = Immutable.Map({ key: 'value' }); f(data); console.log(data.get('key')); // value } ``` JavaScript 中的`Object`与`Array`等使用的是引用赋值,新的对象简单的引用了原始对象,改变新也将影响旧的: ``` JavaScript foo = {a: 1}; bar = foo; bar.a = 2; foo.a // 2 ``` 虽然这样做可以节约内存,但当应用复杂后,造成了状态不可控,是很大的隐患,节约的内存优点变得得不偿失。 Immutable则不一样,相应的: ``` JavaScript foo = Immutable.Map({ a: 1 }); bar = foo.set('a', 2); foo.get('a') // 1 ``` ### 关于 “===”: 我们知道对于`Object`与`Array`的`===`比较,是对引用地址的比较而不是“值比较”,如: ``` JavaScript {a:1, b:2, c:3} === {a:1, b:2, c:3}; // false [1, 2, [3, 4]] === [1, 2, [3, 4]]; // false ``` 对于上面只能采用 `deepCopy`、`deepCompare`来遍历比较,不仅麻烦且好性能。 我们感受来一下`Immutable`的做法! ``` JavaScript map1 = Immutable.Map({a:1, b:2, c:3}); map2 = Immutable.Map({a:1, b:2, c:3}); Immutable.is(map1, map2); // true // List1 = Immutable.List([1, 2, Immutable.List[3, 4]]); List1 = Immutable.fromJS([1, 2, [3, 4]]); List2 = Immutable.fromJS([1, 2, [3, 4]]); Immutable.is(List1, List2); // true ``` Immutable学习资料: * [Immutable.js](http://facebook.github.io/immutable-js/) ## 2、Web Audio Api 游戏里有很多不同的音效,而实际上只引用了一个音效文件:[/build/music.mp3](https://github.com/Binaryify/vue-tetris/blob/master/build/music.mp3)。借助`Web Audio Api`能够以毫秒级精确、高频率的播放音效,这是`