OLD | NEW |
| (Empty) |
1 part of pop_pop_win.canvas; | |
2 | |
3 class GameRoot extends GameManager { | |
4 final Stage _stage; | |
5 final CanvasElement _canvas; | |
6 final GameElement _gameElement; | |
7 final AffineTransform _gameElementTx; | |
8 | |
9 bool _frameRequested = false; | |
10 | |
11 factory GameRoot(int width, int height, int bombCount, | |
12 CanvasElement canvasElement, TextureData textureData) { | |
13 | |
14 final rootElement = new GameElement(textureData); | |
15 final stage = new Stage(canvasElement, rootElement); | |
16 new MouseManager(stage); | |
17 | |
18 return new GameRoot._internal(width, height, bombCount, | |
19 canvasElement, stage, rootElement); | |
20 } | |
21 | |
22 GameRoot._internal(int width, int height, int bombCount, | |
23 this._canvas, this._stage, GameElement gameElement) : | |
24 this._gameElement = gameElement, | |
25 _gameElementTx = gameElement.addTransform(), | |
26 super(width, height, bombCount) { | |
27 | |
28 _gameElement.setGameManager(this); | |
29 _stage.invalidated.listen(_stageInvalidated); | |
30 | |
31 _gameElement.newGameClick.listen((args) => newGame()); | |
32 | |
33 MouseManager.getMouseMoveStream(_gameElement).listen(_mouseMoveHandler); | |
34 MouseManager.getMouseOutStream(_stage).listen(_mouseOutHandler); | |
35 | |
36 window.onResize.listen((args) => _updateCanvasSize()); | |
37 _updateCanvasSize(); | |
38 } | |
39 | |
40 void newGame() { | |
41 super.newGame(); | |
42 _gameElement.game = super.game; | |
43 _requestFrame(); | |
44 } | |
45 | |
46 bool get canRevealTarget => _gameElement.canRevealTarget; | |
47 | |
48 bool get canFlagTarget => _gameElement.canFlagTarget; | |
49 | |
50 void revealTarget() => _gameElement.revealTarget(); | |
51 | |
52 void toggleTargetFlag() => _gameElement.toggleTargetFlag(); | |
53 | |
54 Stream get targetChanged => _gameElement.targetChanged; | |
55 | |
56 void onGameStateChanged(GameState newState) { | |
57 switch (newState) { | |
58 case GameState.won: | |
59 GameAudio.win(); | |
60 break; | |
61 } | |
62 } | |
63 | |
64 void _updateCanvasSize() { | |
65 final windowSize = new Size(window.innerWidth, window.innerHeight); | |
66 | |
67 _canvas.width = min(windowSize.width, _gameElement.width).toInt(); | |
68 _canvas.height = min(windowSize.height, _gameElement.height).toInt(); | |
69 | |
70 // now move it! | |
71 final delta = new Vector(windowSize.width - _canvas.width, | |
72 windowSize.height - _canvas.height).scale(0.5); | |
73 | |
74 _canvas.style.left = "${delta.x.toInt()}px"; | |
75 | |
76 // add a little padding at the top (up to 20) if there's room | |
77 // but don't try to vertically center | |
78 final topDelta = min(delta.y, 20).toInt(); | |
79 _canvas.style.top = "${topDelta}px"; | |
80 | |
81 _requestFrame(); | |
82 } | |
83 | |
84 void _requestFrame() { | |
85 if (!_frameRequested) { | |
86 _frameRequested = true; | |
87 window.requestAnimationFrame(_onFrame); | |
88 } | |
89 } | |
90 | |
91 void _onFrame(double time) { | |
92 final boardInnerBox = _gameElement._scaledInnerBox; | |
93 final xScale = _stage.size.width / boardInnerBox.width; | |
94 final yScale = _stage.size.height / boardInnerBox.height; | |
95 | |
96 final prettyScale = min(1, min(xScale, yScale)); | |
97 | |
98 final newDimensions = _gameElement.size * prettyScale; | |
99 | |
100 final delta = new Vector(_stage.size.width - newDimensions.width, | |
101 min(40, _stage.size.height - newDimensions.height)) | |
102 .scale(0.5) | |
103 .scale(1/prettyScale); | |
104 | |
105 _gameElementTx.setToScale(prettyScale, prettyScale); | |
106 _gameElementTx.translate(delta.x, delta.y); | |
107 | |
108 var updated = _stage.draw(); | |
109 _frameRequested = false; | |
110 if (updated) { | |
111 _requestFrame(); | |
112 } | |
113 } | |
114 | |
115 void updateClock() { | |
116 _requestFrame(); | |
117 super.updateClock(); | |
118 } | |
119 | |
120 void gameUpdated(args) { | |
121 _requestFrame(); | |
122 } | |
123 | |
124 void _stageInvalidated(args) { | |
125 _requestFrame(); | |
126 } | |
127 | |
128 void _mouseMoveHandler(ThingMouseEventArgs args) { | |
129 bool showPointer = false; | |
130 if (!game.gameEnded && args.thing is SquareElement) { | |
131 final SquareElement se = args.thing; | |
132 showPointer = game.canReveal(se.x, se.y); | |
133 } else if (args.thing is NewGameElement) { | |
134 showPointer = true; | |
135 } else if (args.thing is GameTitleElement) { | |
136 showPointer = true; | |
137 } | |
138 _updateCursor(showPointer); | |
139 } | |
140 | |
141 void _mouseOutHandler(args) { | |
142 _updateCursor(false); | |
143 } | |
144 | |
145 void _updateCursor(bool showFinger) { | |
146 _canvas.style.cursor = showFinger ? 'pointer' : 'inherit'; | |
147 } | |
148 } | |
OLD | NEW |