간단한 그리드 기반 이동

5876 단어

1.) 초기 파일 설정


  • HTML, JS 및 CSS 파일 만들기
  • 초기 HTML 구조를 만들고 JS 및 CSS 파일을 연결합니다
  • .



    2.) 스프라이트 생성 및 표시



    HTML

        <body>
            <div id="sprite"></div>
        </body>
    


    CSS

    #sprite {
        background-color: black;
        height: 20px;
        width: 20px;
        position: absolute;
        /* Initial coordinates of sprite */
        left: 100px;
        bottom: 500px;
    }
    


    3.) keydown 이벤트에 대한 addEventListener 추가




    // set equal to sprite's initial cooridinates
    let position = {
        x: 100, 
        y: 500
    };
    // dimensions of the sprite
    size = 20;
    
    document.addEventListener('keydown', (event) => chooseDirection(event));
    
    function chooseDirection(event) {
        // if key pressed = an arrow key --> change position
        switch(event.key) {
            case 'ArrowRight':
                position.x += size;
                sprite.style.left = position.x + 'px';
                break;
            case 'ArrowLeft':
                position.x -= size;
                sprite.style.left = position.x + 'px';
                break;
            case 'ArrowUp':
                position.y += size;
                sprite.style.bottom = position.y + 'px';
                break;
            case 'ArrowDown':
                position.y -= size;
                sprite.style.bottom = position.y + 'px';
                break;
        }
    }
    


    그게 다야! 이제 화살표 키(또는 원하는 키)를 사용하여 화면 전체에서 스프라이트를 이동할 수 있습니다.

    엑스트라!



    - 창 크기에 따라 변경




    window.addEventListener('resize', displaySprite)
    
    function displaySprite() {
        // remove any previous sprite
        document.querySelector('body').innerHTML = '';
    
        const sprite = document.createElement('div');
        sprite.id = 'sprite';
        document.querySelector('body').append(sprite);
    
        sprite.style.height = size + 'vmin';
        sprite.style.width  = size + 'vmin';
        sprite.style.left   = position.x + 'vmin';
        sprite.style.bottom = position.y + 'vmin';
    }
    

    px 단위에서 vmin 단위로 변경하면 스프라이트의 크기를 동적으로 변경할 수 있습니다.

    예를 들어:sprite.style.bottom = position.y + 'px' --> sprite.style.bottom = position.y + 'vmin'

    - 그리드 추가



    function displayGrid() {
        const grid = document.createElement('div');
        grid.id = 'grid';
        document.querySelector('body').append(grid);
    
        let cellClass = 'darkerTile';
        let isDark = true;
    
        for(let i = 0; i < gridSize; i++) {
            const column = document.createElement('div');
            column.className = 'column';
            grid.append(column);
    
            for(let i = 0; i < gridSize; i++) {
                (isDark) ? cellClass = 'darkerTile' : cellClass = 'lighterTile';
                isDark = !isDark;
    
                const cell = document.createElement('div');
                cell.className = cellClass;
                cell.style.height = size + 'vmin';
                cell.style.width = size + 'vmin';
    
                column.append(cell);
            }
        }
    }
    

    CSS를 잊지 마세요!

    #grid {
        display: flex;
        position: relative;
        width: fit-content;
        border: 2vmin solid darkgreen;
    }
    
    .darkerTile {
        background-color: green;
    }
    
    .lighterTile {
        background-color: lightgreen;
    }
    


    스프라이트가 그리드에 정렬되는 데 문제가 있는 경우:
  • 스프라이트를 격자 요소의 자식으로 만들고 격자 위치를 상대적으로 설정해 보십시오
  • .
  • 시작 위치가 그리드와 일치하는지 확인하십시오
  • .
  • 모든 크기 관련 단위가 동일한 변수에 연결되어 있는지 확인합니다
  • .

    - 스프라이트를 포함하기 위해 테두리 충돌 추가




    const bounds = {
        min: 0,
        max: (gridSize - 1) * size
    };
    
    function chooseDirection(event) {
        switch(event.key) {
            case 'ArrowRight':
                isAtBorder('x', 'max') ? null : move('x', 'left', true);
                break;
            case 'ArrowLeft':
                isAtBorder('x', 'min') ? null : move('x', 'left', false);
                break;
            case 'ArrowUp':
                isAtBorder('y', 'max') ? null : move('y', 'bottom', true);
                break;
            case 'ArrowDown':
                isAtBorder('y', 'min') ? null : move('y', 'bottom', false);
                break;
        }
    }
    
    function isAtBorder(axis, boundary) {
        return (position[axis] === bounds[boundary]) ? true : false;
    }
    
    function move(spriteAxis, windowAxis, moveMaxy) {
        (moveMaxy === true) 
        ? position[spriteAxis] += size
        : position[spriteAxis] -= size;
    
        sprite.style[windowAxis] = position[spriteAxis] + 'vmin';
    }
    


    - 스프라이트 모양 변경



    div 대신 스프라이트를 img로 변경하고 다른 소스를 뒤섞습니다.

    최종 제품



    좋은 웹페이지 즐겨찾기