js

볼튕기기

chantleman 2024. 10. 17. 16:49

 

 

bar를 움직이려면 화면을 클릭하고 하세용!!

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        /*부모 relative ,자식 absolute*/
        #wrapper{
            position:relative;
            width:800px;
            height:600px;
            border:10px groove gold;
        }
        #ball{
            position:absolute;
            width:100px;
            height:100px;
            background-color: rgb(237, 156, 156);
            border:1px solid rgb(237, 156, 156);
            border-radius: 50%;
            left:30px;
            top:10px;
            background-image:url("https://item.kakaocdn.net/do/a1866850b14ae47d0a2fd61f409dfc057154249a3890514a43687a85e6b6cc82");
            background-size:100% 100%;
            transform: rotateZ(45deg); /*그냥 rotate로 하면 Z가 생략된 것임. z축 기준으로 45도 회전
                                        rotateX, rotateY는 X축 Y축으로 45도 회전하라는 뜻. 좀 찌그러져있음
                                        skewX(), skewY()는 X축으로 찌그러지
             */
        }

        #bar{
            position:absolute;
            width:200px;
            height:25px;
            background-color: rgb(255, 0, 140);
            bottom:100px;
            left:100px;
        }
    </style>
</head>

<body>
    <button onclick="fStart()">시작</button>
    <button onclick="fStop()">중지</button>

    <!-- focus 받을 수 없는 것은 keyboard이벤트 안됨 해결은 tabindex=0 -->
    <div id="wrapper" tabindex="0" onkeydown="fkeyDown()">
        <div id="ball"></div>
        <div id="bar"></div>
    </div>
</body>


<script>
    const wrapper= document.querySelector("#wrapper");
    const ball = document.querySelector("#ball");
    const bar = document.querySelector("#bar");
    let timerId;


    //직접 fMove를 부르지 않고 거쳐서 감 (Proxy 대리인 패턴)
    let isRunning = !1; //false
    function fStart(){
        if(!isRunning){
            fMove();
            isRunning = !0; //true
        }
    }

    function fStop(){
        clearTimeout(timerId);
        isRunning = !1; //상태값을 시작버튼 누르기 이전으로
    }
    
    function fkeyDown(){
        let xSpeed = 10;
        let barleft = parseInt(bar.style.left);
        //alert(event.key);
        // alert(event.keyCode);
        if(event.keyCode==37 &&  barleft>0){
            bar.style.left = parseInt(bar.style.left)-xSpeed+"px";
        }
        if(event.keyCode==39 && (barleft+200) < 800){
            bar.style.left = parseInt(bar.style.left)+xSpeed+"px";
        }
    }

    if(!ball.style.left){ //script를 이용한 초기화
        ball.style.left = "30px";
        ball.style.top = "100px";
        bar.style.left="30px";
    }

    //parseInt는 문자 숫자 섞여있어도 숫자만 떼어옴(40px -> 40)
                                                    //스타일은 꼭 단위를 붙여줘야 적용됨
    //ball.style.left = parseInt(ball.style.left) + 50 +"px"; //인라인 스타일만 읽어올 수 있음. 근데 인라인 스타일은 권장하고있지 않기때문에 스크립트에서 위처럼 초기화해줘야함

    // setTimeInterval : 주기적으로
    // setTimeout: 한번만
    let xSpeed = 10; //const는 상수기때문에 값을 못바꿈. 
    let ySpeed = 10;
    let gakdo = 0;

    function fMove(){
        gakdo=gakdo+10;

        ball.style.left = parseInt(ball.style.left) + xSpeed +"px";
        ball.style.top = parseInt(ball.style.top) + ySpeed +"px";

        ball.style.transform = `rotate(${gakdo}deg)`;

        //벽충돌
        let ballLeft = parseInt(ball.style.left);
        let ballTop = parseInt(ball.style.top);

        if((ballLeft+100) >= 800 || ballLeft<=0){ //wrapper width를 800, ball width를 100으로 했기떄문
            xSpeed = -xSpeed;
            ball.style.transform = `skewX(45deg)`;
        }
        if((ballTop+100) >= 600 || ballTop<=0){ 
            ySpeed = -ySpeed;
            ball.style.transform = `skewY(45deg)`;
        }

        let barloc=parseInt(bar.style.left);
        if(ballTop>=375 && (ballLeft-(barloc+200)<=0) && (barloc-(ballLeft+100)<=0)){
            xSpeed;
            ySpeed = -ySpeed;
        }

        if(ballTop==500){
            clearTimeout(timerId);
            alert("게임 종료!");
            location.reload();
        }

        //setTimeout의 return값은 스탑워치를 가리키는 id를 리턴
        timerId = setTimeout(fMove, 50); //재귀호출
    }
    //fMove();
</script>
</html>

 

 

 

 

'js' 카테고리의 다른 글

localStorage  (0) 2024.10.23
react, vite  (0) 2024.10.11
복사와 참조  (0) 2024.10.11
node 설치  (4) 2024.10.11
ajax로 데이터 송수신  (0) 2024.10.03