diff --git a/svgmap/src/components/map/Map.tsx b/svgmap/src/components/map/Map.tsx index 6ceac39..7e5b0f8 100644 --- a/svgmap/src/components/map/Map.tsx +++ b/svgmap/src/components/map/Map.tsx @@ -4,10 +4,9 @@ import react, { useEffect, useState } from 'react'; import './Map.css'; import MouseHandler from './MouseHandler'; import SlippyBoard from './SlippyBoard'; -import Tile from './Tile'; -import fakeTile from './FakeTile.svg'; import SingleTouchHandler from './SingleTouchHandler'; import DoubleTouchHandler from './DoubleTouchHandler'; +import TiledLayer from './TiledLayer'; interface MapProperties { height: number; @@ -40,72 +39,6 @@ const Map: react.FC = (props: MapProperties) => { console.log(`Rendering Map, zoom:${zoom}, shift:${JSON.stringify(shift)}`); - var initialTiledLayer: any[][] = []; - for (let row = 0; row < nbTiles; row++) { - let tileRow = []; - for (let col = 0; col < nbTiles; col++) { - tileRow.push(); - } - initialTiledLayer.push(tileRow); - } - - const [tiledLayer, setTiledLayer] = useState(initialTiledLayer); - - useEffect(() => { - const firstVisibleTiles = { - x: Math.max(Math.floor(-shift.x / 256 / zoom), 0), - y: Math.max(Math.floor(-shift.y / 256 / zoom), 0), - }; - - const lastVisibleTiles = { - x: Math.min( - Math.ceil(firstVisibleTiles.x + props.width / 256 / zoom), - nbTiles - 1 - ), - y: Math.min( - Math.ceil(firstVisibleTiles.y + props.height / 256 / zoom), - nbTiles - 1 - ), - }; - console.log( - `Adding new tiles if needed for ${JSON.stringify( - firstVisibleTiles - )}/${JSON.stringify(lastVisibleTiles)}.` - ); - const newTiledLayer: any[][] = []; - for (let row = 0; row < nbTiles; row++) { - let tileRow = []; - for (let col = 0; col < nbTiles; col++) { - const key = `${row}/${col}`; - if ( - tiledLayer[row][col].type === 'g' && - row >= firstVisibleTiles.y && - row <= lastVisibleTiles.y && - col >= firstVisibleTiles.x && - col <= lastVisibleTiles.x - ) { - console.log(`Adding tile ${row}/${col}`); - tileRow.push( - - ); - } else { - tileRow.push(tiledLayer[row][col]); - } - } - newTiledLayer.push(tileRow); - } - - setTiledLayer(newTiledLayer); - }, [shift, zoom, nbTiles, props.height, props.width]); - - // console.log(`tiledLayer: ${JSON.stringify(tiledLayer)}`); - return (
= (props: MapProperties) => { /> ), }, - { key: 'tiles', content: tiledLayer }, + { + key: 'tiles', + content: ( + + ), + }, { key: 'circle', content: }, ]} /> diff --git a/svgmap/src/components/map/SlippyBoard.tsx b/svgmap/src/components/map/SlippyBoard.tsx index cd5f247..f4ef95f 100644 --- a/svgmap/src/components/map/SlippyBoard.tsx +++ b/svgmap/src/components/map/SlippyBoard.tsx @@ -1,4 +1,5 @@ -import react, { ReactElement } from 'react'; +import { ReactComponentOrElement } from '@ionic/react'; +import react, { ReactComponentElement, ReactElement, ReactNode } from 'react'; interface SlippyBoardProperties { boardSize: number; @@ -6,7 +7,7 @@ interface SlippyBoardProperties { zoom: number; layers?: { key: string; - content: ReactElement | ReactElement[] | ReactElement[][]; + content: ReactElement|ReactNode | ReactElement[] | ReactElement[][]; }[]; } diff --git a/svgmap/src/components/map/TiledLayer.tsx b/svgmap/src/components/map/TiledLayer.tsx new file mode 100644 index 0000000..589caf9 --- /dev/null +++ b/svgmap/src/components/map/TiledLayer.tsx @@ -0,0 +1,90 @@ +import react, { useEffect, useState } from 'react'; +import Tile from './Tile'; +import fakeTile from './FakeTile.svg'; + +interface Point { + x: number; + y: number; +} + +interface TiledLayerProperties { + height: number; + width: number; + shift: Point; + zoom: number; +} + +const TiledLayer: react.FC = ( + props: TiledLayerProperties +) => { + const nbTiles = + Math.ceil((Math.max(props.width, props.height) * 2) / 256) + 2; + + var initialTiledLayer: any[][] = []; + for (let row = 0; row < nbTiles; row++) { + let tileRow = []; + for (let col = 0; col < nbTiles; col++) { + tileRow.push(); + } + initialTiledLayer.push(tileRow); + } + + const [tiledLayer, setTiledLayer] = useState(initialTiledLayer); + + useEffect(() => { + const firstVisibleTiles = { + x: Math.max(Math.floor(-props.shift.x / 256 / props.zoom), 0), + y: Math.max(Math.floor(-props.shift.y / 256 / props.zoom), 0), + }; + + const lastVisibleTiles = { + x: Math.min( + Math.ceil(firstVisibleTiles.x + props.width / 256 / props.zoom), + nbTiles - 1 + ), + y: Math.min( + Math.ceil(firstVisibleTiles.y + props.height / 256 / props.zoom), + nbTiles - 1 + ), + }; + console.log( + `Adding new tiles if needed for ${JSON.stringify( + firstVisibleTiles + )}/${JSON.stringify(lastVisibleTiles)}.` + ); + const newTiledLayer: any[][] = []; + for (let row = 0; row < nbTiles; row++) { + let tileRow = []; + for (let col = 0; col < nbTiles; col++) { + const key = `${row}/${col}`; + if ( + tiledLayer[row][col].type === 'g' && + row >= firstVisibleTiles.y && + row <= lastVisibleTiles.y && + col >= firstVisibleTiles.x && + col <= lastVisibleTiles.x + ) { + console.log(`Adding tile ${row}/${col}`); + tileRow.push( + + ); + } else { + tileRow.push(tiledLayer[row][col]); + } + } + newTiledLayer.push(tileRow); + } + + setTiledLayer(newTiledLayer); + }, [props.shift, props.zoom, nbTiles, props.height, props.width]); + + return <>{tiledLayer}; +}; + +export default TiledLayer;