@@ -4,9 +4,13 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
4
4
var ctx = canvas . getContext ( "2d" ) ;
5
5
var octx = overlayCanvas . getContext ( "2d" ) ;
6
6
var mouse_down_point , mouse_move_point , dragging = false ;
7
+ var touches = [ ] ;
7
8
var selected = undefined ;
8
9
var offset = new Vec ( 0 , 0 ) ;
9
10
11
+ overlayCanvas . addEventListener ( "touchstart" , handleTouchstart ) ;
12
+ overlayCanvas . addEventListener ( "touchend" , handleTouchend ) ;
13
+ overlayCanvas . addEventListener ( "touchmove" , handleTouchmove ) ;
10
14
overlayCanvas . addEventListener ( "mousemove" , handle_mouse_move ) ;
11
15
overlayCanvas . addEventListener ( "mousedown" , handle_mouse_down ) ;
12
16
overlayCanvas . addEventListener ( "mouseup" , handle_mouse_drag_stop ) ;
@@ -32,7 +36,7 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
32
36
for ( tileOffset . x = 0 ; tileOffset . x < width_in_chunks ; tileOffset . x ++ )
33
37
for ( tileOffset . y = 0 ; tileOffset . y < height_in_chunks ; tileOffset . y ++ )
34
38
renderTile ( firstTile . x + tileOffset . x , firstTile . y + tileOffset . y ) ;
35
-
39
+
36
40
var gridLineWidth = tileSize / 150 ;
37
41
octx . clearRect ( 0 , 0 , cw , ch ) ;
38
42
octx . lineWidth = 1 ;
@@ -43,7 +47,7 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
43
47
octx . lineTo ( i * tileSize + firstTilePosOnScreen . x , ch + tileSize ) ;
44
48
octx . stroke ( ) ;
45
49
}
46
-
50
+
47
51
for ( var i = 0 ; i < height_in_chunks ; i ++ ) {
48
52
octx . beginPath ( ) ;
49
53
octx . moveTo ( firstTilePosOnScreen . x , i * tileSize + firstTilePosOnScreen . y ) ;
@@ -55,7 +59,7 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
55
59
function renderTile ( x , y ) {
56
60
var tile = tileSource . getTile ( x , y ) ;
57
61
var rect = screenRect ( x , y ) ;
58
- tileRenderer . render ( ctx , rect , tile ) ;
62
+ tileRenderer . render ( ctx , rect , tile ) ;
59
63
}
60
64
61
65
var tileFromScreen = ( screenPos ) => new Vec ( tileXFromScreen ( screenPos . x ) , tileYFromScreen ( screenPos . y ) ) ;
@@ -65,6 +69,52 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
65
69
var tileXFromScreen = ( screenX ) => Math . floor ( ( screenX + offset . x ) / tileSize ) ;
66
70
var tileYFromScreen = ( screenY ) => Math . floor ( ( screenY + offset . y ) / tileSize ) ;
67
71
72
+ function forEachTouch ( touchList , callback ) {
73
+ for ( var i = 0 ; i < touchList . length ; i ++ )
74
+ callback ( touchList . item ( i ) ) ;
75
+ }
76
+
77
+ function touchPos ( te ) {
78
+ return new Vec ( te . clientX , te . clientY ) ;
79
+ }
80
+
81
+ function handleTouchstart ( evt ) {
82
+ forEachTouch ( evt . changedTouches , te =>
83
+ touches . push ( {
84
+ lastPos : new Vec ( te . clientX , te . clientY ) ,
85
+ event : te
86
+ } )
87
+ ) ;
88
+ }
89
+
90
+ function handleTouchmove ( evt ) {
91
+ if ( touches . length === 1 ) {
92
+ var currentPos = new Vec ( evt . changedTouches [ 0 ] . clientX , evt . changedTouches [ 0 ] . clientY ) ;
93
+ var dxy = currentPos . vector_to ( touches [ 0 ] . lastPos ) ;
94
+ touches [ 0 ] . lastPos = currentPos ;
95
+ offset . move ( dxy ) ;
96
+ render ( ) ;
97
+ } else if ( touches . length === 2 ) {
98
+ //TODO: add pinch/zoom
99
+ // var startDist = Vec.dist(touches[0].lastPos, touches[1].lastPos);
100
+ // var currentDist = Vec.dist(touchPos(evt.changedTouches[0]), touchPos(evt.changedTouches[1]));
101
+ // var distDiff = currentDist - startDist;
102
+ // distDiff = distDiff * 2 / canvas.clientWidth;
103
+ // if (Math.abs(distDiff) >= 1) {
104
+ // touches[0].lastPos = touchPos(evt.changedTouches[0]);
105
+ // touches[1].lastPos = touchPos(evt.changedTouches[1]);
106
+ // var tileSizeChange = ((distDiff < 0) ? tileSize : -tileSize / 2);
107
+ // zoom(tileSizeChange);
108
+ // }
109
+ }
110
+ }
111
+
112
+ function handleTouchend ( evt ) {
113
+ forEachTouch ( evt . changedTouches , te =>
114
+ touches = touches . filter ( tc => tc . event . identifier !== te . identifier )
115
+ ) ;
116
+ }
117
+
68
118
function handle_mouse_down ( event ) {
69
119
if ( event . button === 2 ) {
70
120
event . preventDefault ( ) ;
@@ -100,9 +150,14 @@ function TilePlane(tileSource, tileRenderer, tileSize, canvas, overlayCanvas) {
100
150
render ( ) ;
101
151
}
102
152
103
- function handle_mouse_wheel ( event ) {
153
+ function handle_mouse_wheel ( event ) {
154
+ var tileSizeChange = ( ( event . deltaY < 0 ) ? tileSize : - tileSize / 2 ) ;
155
+ zoom ( tileSizeChange ) ;
156
+ }
157
+
158
+ function zoom ( tileSizeChange ) {
104
159
let oldTileSize = tileSize ;
105
- tileSize *= ( ( event . deltaY < 0 ) ? 2 : 0.5 ) ;
160
+ tileSize += tileSizeChange ;
106
161
if ( tileSize < 10 )
107
162
tileSize = 10 ;
108
163
var cw = canvas . clientWidth ;
0 commit comments