dpablo_escobarr
@dpablo_escobarr

Прошу дать конструктивную критику по всем трендам и стандартам. На сколько профессионально написан данный код?

Прошу оценки по 10-и бальной. Спасибо за критику!
window.onload = function() {

    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d"),
        width = canvas.width = window.innerWidth,
        height = canvas.height = window.innerHeight,
        tileWidth = 60,
        tileHeight = 30,
        activeTile = null,

        activeScale = {
            status: false
        };

    let tiles = []
    let img     = document.createElement("img")
    
    let getMap = async function (){

        this.map = await new sendFetch(activeTile, 'getmap', 'GET')

        return JSON.parse(this.map)
    }

    img.addEventListener("load", function() {

        (async function(){

            this.map = await getMap()

            init(this.map);
            
            setInterval(() => {

                ctx.clearRect(-width, -1000, 3000, 3000)
                draw(this.map)

            },500)

        })()

    })
    
    img.src = "tileset.png"

    ctx.translate(width / 2, 10)


    function init(map) {

        for (var x = 0; x < map.length; x++) {
            for (var y = 0; y < map[x].length; y++) {
                tiles.push({ x, y, type: map[x][y], active: false })

            }
        }
    }


 async function draw(p_mainMap) {

        if(activeTile){

            const newStroke  = await wait(activeTile, p_mainMap)

            //присваиваем полученной фигуре статус активного
            for(let i = 0; tiles.length > i; i++){
                
                for(stroke of newStroke){

                    if(tiles[i].x == stroke.x && tiles[i].y == stroke.y){

                        tiles[i].active = true
                    }
                }
            }

        }
        
        tiles.forEach(elem => drawImageTile(elem))
    }


    let rectFigure = new Path2D()
        
        rectFigure.moveTo(2, 9)
        rectFigure.lineTo(tileWidth / 2 + 2, tileHeight / 2 + 9)
        rectFigure.lineTo(2, tileHeight + 9)
        rectFigure.lineTo(-tileWidth / 2 + 2, tileHeight / 2 + 9)
        rectFigure.lineTo(3, 9)


    //отрисовка тайлов-картинок и одного квадрата вокруг тайл-картинки
    function drawImageTile({ x, y, type, active }) {

        const xx = (x - y) * tileWidth / 2
        const yy = (x + y) * tileHeight / 2

        ctx.save();
        ctx.translate(xx, yy)


        ctx.drawImage(img, type * tileWidth, 0, tileWidth, img.height,
        	-tileWidth / 2, 0, tileWidth, img.height);

        if (active) ctx.strokeStyle = 'red'
            else ctx.strokeStyle = '#ffffff00'



        ctx.beginPath()
        ctx.lineWidth = 3
        ctx.stroke(rectFigure);
        ctx.closePath()

        ctx.restore();
    }




    canvas.addEventListener('mousemove', (e)=>{

            let tile,
                isInPath = false

            for (tile of tiles) {

                isInPath = ctx.isPointInPath(
                    rectFigure,
                    e.clientX - (tile.x - tile.y) * tileWidth / 2,
                    e.clientY - (tile.x + tile.y) * tileHeight / 2,

                )
                
                if (isInPath) break;
            }
            
            
            if (activeTile) activeTile.active = false;

            if (isInPath) {

                activeTile = tile;
                activeTile.active = true;

                //неявная модификация основного массива содержащая ссылку
                tiles.map(elem => elem.active = false)

            }else{
                activeTile = null;

            }

            //система захвата курсором карты для масштабирования
            if(activeScale.status){

                ctx.setTransform(1, 0, 0, 1, e.clientX - activeScale.diffX, e.clientY - activeScale.diffY)

            }
        

    })
    //фиксируем расстояние курсора на холсте для правильного ведения карты
    canvas.addEventListener('mousedown', function(e){

        activeScale = {

            status: true,
            diffX: e.clientX - ctx.getTransform().e,
            diffY: e.clientY - ctx.getTransform().f
        }

    })

    canvas.addEventListener('mouseup', function(e){

        activeScale.status = false

    })

    canvas.addEventListener('mouseout', function(e) {

        if (activeTile) activeTile.active = false;

        activeTile = null;
        activeScale.status = false
    })

    canvas.addEventListener('click', function(e){

       (async function (){

           this.data = await new sendFetch(activeTile, 'currtile', 'POST')
    
            console.log(this.data)
        })()
        

    })
    

}
  • Вопрос задан
  • 277 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
04 дек. 2020, в 17:59
100 руб./за проект
04 дек. 2020, в 16:45
50000 руб./за проект
04 дек. 2020, в 16:41
1 руб./за проект