-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
92 lines (75 loc) · 2.02 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
var React = require('react');
var tetris = require('./tetris');
var div = React.DOM.div;
var COLORS = ['black', 'red', 'blue', 'green', 'purple', 'yellow'];
var CanvasSquare = React.createClass({
render: function() {
var className = 'square ' + [COLORS[this.props.data]];
className += this.props.data > 0 ? ' active' : '';
return div({ className: className });
}
});
var CanvasRow = React.createClass({
render: function() {
var squares = this.props.row.map(function(block, i) {
return CanvasSquare({ key: i, data: block });
});
return div({ className: 'board-row' }, squares);
}
});
var Tetris = React.createClass({
propTypes: {
height: React.PropTypes.number,
width: React.PropTypes.number
},
getDefaultProps: function() {
return {
height: 20,
width: 10
};
},
getInitialState: function() {
return tetris.getInitialState(this.props.height, this.props.width);
},
componentDidMount: function() {
function step() {
this.setState(tetris.step(this.state));
setTimeout(step.bind(this), this.state.speed);
}
step.call(this);
this.refs.board.getDOMNode().focus();
},
_handleKey: function(event) {
event.preventDefault();
var actionMap = {
'ArrowUp': tetris.rotate,
'ArrowDown': tetris.moveDown,
'ArrowLeft': tetris.moveLeft,
'ArrowRight': tetris.moveRight,
' ': tetris.drop
};
if (event.key in actionMap) {
this.setState(actionMap[event.key](this.state))
}
},
_onFocus: function(event) {
this.setState({ running: true });
},
_onBlur: function(event) {
this.setState({ running: false });
},
render: function() {
var rows = this.state.board.map(function(row, i) {
return CanvasRow({ key: i, row: row });
});
return div({
ref: 'board',
className: 'board',
tabIndex: 0,
onKeyDown: this._handleKey,
onFocus: this._onFocus,
onBlur: this._onBlur
}, rows);
}
});
React.renderComponent(Tetris(), document.body);