1
1
import GuiIngameMenu from "./gui/screens/GuiIngameMenu.js" ;
2
2
import Keyboard from "../util/Keyboard.js" ;
3
+ import Minecraft from "./Minecraft.js" ;
3
4
4
5
export default class GameWindow {
5
6
@@ -29,17 +30,16 @@ export default class GameWindow {
29
30
this . canvasItems = document . createElement ( 'canvas' ) ;
30
31
this . wrapper . appendChild ( this . canvasItems ) ;
31
32
32
- // On resize
33
- let scope = this ;
33
+ let mouseDownInterval = null ;
34
34
35
35
// Request focus
36
- document . onclick = function ( ) {
37
- if ( scope . minecraft . currentScreen === null ) {
38
- scope . requestFocus ( ) ;
36
+ document . onclick = ( ) => {
37
+ if ( this . minecraft . currentScreen === null ) {
38
+ this . requestFocus ( ) ;
39
39
}
40
40
}
41
41
42
- window . addEventListener ( 'resize' , _ => scope . updateWindowSize ( ) , false ) ;
42
+ window . addEventListener ( 'resize' , _ => this . updateWindowSize ( ) , false ) ;
43
43
44
44
// Focus listener
45
45
document . addEventListener ( 'pointerlockchange' , _ => this . onFocusChanged ( ) , false ) ;
@@ -50,51 +50,59 @@ export default class GameWindow {
50
50
51
51
// Handle mouse move on screen
52
52
if ( ! ( minecraft . currentScreen === null ) ) {
53
- minecraft . currentScreen . mouseDragged ( event . x / scope . scaleFactor , event . y / scope . scaleFactor , event . code ) ;
53
+ minecraft . currentScreen . mouseDragged ( event . x / this . scaleFactor , event . y / this . scaleFactor , event . code ) ;
54
54
}
55
55
} , false ) ;
56
56
57
57
// Mouse release
58
58
document . addEventListener ( 'mouseup' , event => {
59
59
// Handle mouse release on screen
60
60
if ( ! ( minecraft . currentScreen === null ) ) {
61
- minecraft . currentScreen . mouseReleased ( event . x / scope . scaleFactor , event . y / scope . scaleFactor , event . code ) ;
61
+ minecraft . currentScreen . mouseReleased ( event . x / this . scaleFactor , event . y / this . scaleFactor , event . code ) ;
62
62
}
63
+
64
+ clearInterval ( mouseDownInterval ) ;
63
65
} , false ) ;
64
66
65
67
// Losing focus event
66
- this . canvas . addEventListener ( "mouseout" , function ( ) {
68
+ this . canvas . addEventListener ( "mouseout" , ( ) => {
67
69
if ( minecraft . currentScreen === null ) {
68
70
minecraft . displayScreen ( new GuiIngameMenu ( ) ) ;
69
71
}
72
+
73
+ clearInterval ( mouseDownInterval ) ;
70
74
} ) ;
71
75
72
76
// Mouse buttons
73
- document . addEventListener ( 'mousedown' , function ( event ) {
77
+ document . addEventListener ( 'mousedown' , event => {
74
78
// Create sound engine (It has to be created after user interaction)
75
79
if ( ! minecraft . soundManager . isCreated ( ) ) {
76
80
minecraft . soundManager . create ( minecraft . worldRenderer ) ;
77
81
}
78
82
79
83
// Handle in-game mouse click
80
- if ( ! scope . isMobile ) {
84
+ if ( ! this . isMobile ) {
81
85
minecraft . onMouseClicked ( event . button ) ;
86
+
87
+ // Start interval to repeat the mouse event
88
+ clearInterval ( mouseDownInterval ) ;
89
+ mouseDownInterval = setInterval ( ( ) => minecraft . onMouseClicked ( event . button ) , 250 ) ;
82
90
}
83
91
84
92
// Handle mouse click on screen
85
93
if ( ! ( minecraft . currentScreen === null ) ) {
86
- minecraft . currentScreen . mouseClicked ( event . x / scope . scaleFactor , event . y / scope . scaleFactor , event . code ) ;
94
+ minecraft . currentScreen . mouseClicked ( event . x / this . scaleFactor , event . y / this . scaleFactor , event . code ) ;
87
95
}
88
96
} , false ) ;
89
97
90
98
// Mouse scroll
91
- document . addEventListener ( 'wheel' , function ( event ) {
99
+ document . addEventListener ( 'wheel' , ( event ) => {
92
100
let delta = Math . sign ( event . deltaY ) ;
93
101
minecraft . onMouseScroll ( delta ) ;
94
102
} , false ) ;
95
103
96
104
// Keyboard interaction with screen
97
- window . addEventListener ( 'keydown' , function ( event ) {
105
+ window . addEventListener ( 'keydown' , ( event ) => {
98
106
if ( event . code === "F11" ) {
99
107
return ; // Toggle fullscreen
100
108
}
@@ -104,32 +112,43 @@ export default class GameWindow {
104
112
105
113
if ( ! ( minecraft . currentScreen === null ) ) {
106
114
// Handle key type on screen
107
- minecraft . currentScreen . keyTyped ( event . code ) ;
115
+ minecraft . currentScreen . keyTyped ( event . code , event . key ) ;
108
116
} else if ( event . code === 'Escape' ) {
109
117
minecraft . displayScreen ( new GuiIngameMenu ( ) ) ;
110
118
} else {
111
119
minecraft . onKeyPressed ( event . code ) ;
112
120
}
113
121
} ) ;
114
122
123
+ // Keyboard interaction with screen
124
+ window . addEventListener ( 'keyup' , ( event ) => {
125
+ // Prevent key
126
+ event . preventDefault ( ) ;
127
+
128
+ if ( ! ( minecraft . currentScreen === null ) ) {
129
+ // Handle key release on screen
130
+ minecraft . currentScreen . keyReleased ( event . code ) ;
131
+ }
132
+ } ) ;
133
+
115
134
// Touch interaction
116
135
let touchStart ;
117
- window . addEventListener ( 'touchstart' , function ( event ) {
136
+ window . addEventListener ( 'touchstart' , ( event ) => {
118
137
for ( let i = 0 ; i < event . touches . length ; i ++ ) {
119
138
let touch = event . touches [ i ] ;
120
139
121
140
let x = touch . pageX ;
122
141
let y = touch . pageY ;
123
142
124
- let isRightHand = x > scope . wrapper . offsetWidth / 2 ;
143
+ let isRightHand = x > this . wrapper . offsetWidth / 2 ;
125
144
126
145
if ( isRightHand ) {
127
146
touchStart = Date . now ( ) ;
128
147
} else {
129
- let tileSize = scope . wrapper . offsetWidth / 8 ;
148
+ let tileSize = this . wrapper . offsetWidth / 8 ;
130
149
131
150
let tileX = 0 ;
132
- let tileY = scope . wrapper . offsetHeight - tileSize * 3 ;
151
+ let tileY = this . wrapper . offsetHeight - tileSize * 3 ;
133
152
134
153
let relX = x - tileX ;
135
154
let relY = y - tileY ;
@@ -169,28 +188,28 @@ export default class GameWindow {
169
188
170
189
// Touch movement
171
190
let prevTouch ;
172
- window . addEventListener ( 'touchmove' , function ( event ) {
191
+ window . addEventListener ( 'touchmove' , ( event ) => {
173
192
for ( let i = 0 ; i < event . touches . length ; i ++ ) {
174
193
let touch = event . touches [ i ] ;
175
194
176
195
let x = touch . pageX ;
177
196
let y = touch . pageY ;
178
197
179
198
// Right hand
180
- let isRightHand = x > scope . wrapper . offsetWidth / 2 ;
199
+ let isRightHand = x > this . wrapper . offsetWidth / 2 ;
181
200
182
201
if ( isRightHand ) {
183
202
// Player movement
184
203
if ( prevTouch ) {
185
- scope . mouseMotionX = ( x - prevTouch . pageX ) * 10 ;
186
- scope . mouseMotionY = - ( y - prevTouch . pageY ) * 10 ;
204
+ this . mouseMotionX = ( x - prevTouch . pageX ) * 10 ;
205
+ this . mouseMotionY = - ( y - prevTouch . pageY ) * 10 ;
187
206
}
188
207
189
208
prevTouch = touch ;
190
209
}
191
210
}
192
211
} ) ;
193
- window . addEventListener ( 'touchend' , function ( event ) {
212
+ window . addEventListener ( 'touchend' , ( event ) => {
194
213
// Break block
195
214
if ( ! prevTouch && touchStart && ( Date . now ( ) - touchStart ) < 1000 ) {
196
215
minecraft . onMouseClicked ( 2 ) ;
@@ -204,7 +223,7 @@ export default class GameWindow {
204
223
let touch = event . changedTouches [ i ] ;
205
224
206
225
// Left hand
207
- let isLeftHand = touch . pageX < scope . wrapper . offsetWidth / 2 ;
226
+ let isLeftHand = touch . pageX < this . wrapper . offsetWidth / 2 ;
208
227
209
228
// Release all keys
210
229
if ( isLeftHand ) {
@@ -326,4 +345,20 @@ export default class GameWindow {
326
345
return false ;
327
346
}
328
347
348
+ close ( ) {
349
+ this . openUrl ( Minecraft . URL_GITHUB ) ;
350
+ }
351
+
352
+ openUrl ( url , newTab ) {
353
+ if ( newTab ) {
354
+ window . open ( url , '_blank' ) . focus ( ) ;
355
+ } else {
356
+ window . location = url ;
357
+ }
358
+ }
359
+
360
+ async getClipboardText ( ) {
361
+ return navigator . clipboard . readText ( ) ;
362
+ }
363
+
329
364
}
0 commit comments